在软件开发过程中,性能测试往往在开发前期容易被忽略。直到有一天问题暴露后,开发人员被迫的直面这个问题,大多数情况下,这是令开发人员感觉到非常痛苦事情。所以在软件开发前期以及开发过程中性能测试的考量是必要的,那么具备相应理论知识和实践方法也是一个优秀工程师所应当具备的素养,这里我们概括有四项原则,这些原则可以帮助开发人员丰富、充实测试理论,系统的开展性能测试工作,从而获得更有价值的结果。

实际项目中的性能测试才有意义

第一个原则就是性能测试只有在实际项目中实施才是有意义的,这样才使得测试工作具有针对性,而且目标会更加明确。这个原则中有三个类别的基准可以指导开发人员度量性能测试的结果,但是每一种方法都有它的优点和劣势。

微观基准

可以理解为在某一个方法或某一个组件中进行的单元性能测试。比如检测一个线程同步和一个非线程同步的方法运行时所需要的时间。或者对比创建一个单独线程和使用一个线程池的性能开销。或者对比执行一个算法中的某一个迭代过程所需要的时间。当我们遇到这些情况时,我们常常会选择做一个方法层面的性能测试。这些情况的性能测试,都可以尝试使用微观基准的方法进行性能测试。

宏观基准

当我们测量应用程序性能时,应当纵览整个系统,影响应用程序性能的原因可能是多方面的,不能片面的认为性能瓶颈只会在程序本身上。

折衷基准

相比微观基准和宏观基准,一个单独功能模块的性能测试,或者一系列特定操作的性能测试被称为折衷基准。它是介于微观基准和宏观基准之间的折衷方案。基于微观基准测试的正确性是较难把握的,性能瓶颈的判断绝不能仅仅依赖于此。如果我们要使用微观基准作为性能的测量方法,那么不妨在此之前先尝试基于宏观基准的测试。它可以帮助我们了解系统以及代码是如何工作的,从而形成一个系统整体逻辑结构图。接下来可以考虑基于折衷基准的测试,来真正发现潜在的性能瓶颈。需要明确的是折衷基准的测试方法并不是完整应用程序测试的替代方法,更多情况下我们认为它更适用于一个功能模块的自动测试。

批量,吞吐量和响应时间的测量方法

性能测试中的第二个重要的原则是引入多样的测量方法来分析程序的性能。

批量

批量执行所用时间的测量方法(耗时法),这是种简单而快速有效的方法,通过测量完成特定任务所消耗的时间来测量整体性能。但是需要特别注意,假如所测试的应用程序中使用缓存数据技术来为了获得更好的性能表现时,多次循环使用该方法可能无法完全反应性能问题。那么可以尝试在初始状态开始时应用耗时法做一次性能的评估,然后当缓存建立后,再次尝试此方法。

吞吐量

吞吐量的测量方法,在一段时间内考察完成任务的数量的能力,被称为吞吐量测量方法。在测试客户服务器的应用程序时,吞吐量的测量意味着客户端发送请求到服务器是没有任何延迟的,当客户端接收到响应后,应当立即发出新的请求,直到最终结束,统计客户端完成任务的总数。这种相对理想的测试方法通常称之为“Zero-think-time”。可是通常情况下,客户端可能会有多个线程做同一件事情,吞吐量则意味着每秒钟内所有客户端的操作数,而不是测量的某一个时段内的所有操作总数。这种测量经常称为每秒事务/(TPS),每秒请求 (RPS),或每秒操作数 (OPS)。

响应时间

响应时间的测量方法,响应时间的测量方法是指客户端发出一个请求后直到接收到服务器的响应返回后的时间消耗。响应时间测量方法不同于吞吐量测量方法,在响应时间测试过程中,客户端线程可能会在操作的过程中某一时刻休眠,这就引出“think-time”这个关键词,当“think-time”被引入到测试过程中,也就是意味着待处理任务量是固定的,测量的是服务器响应请求的速率是怎样的。大多数情况下,响应时间的测量方法用来模拟用户真实操作,从而测量应用程序的性能。

多变性

性能测试的第三个原则是理解测试结果如何随时间改变,即使每一次测试使用同样的数据,可能获得的结果也是不同的。一些客观因素,比如后台运行的进程,网络的负载情况,这些都可能带来测试结果的不同,所以在测试过程中存在着一些随机性的因素。

尽早测试,经常测试

第四个原则就是工程师应该视性能测试是整个开发过程必要的部分,尽早进行性能测试,经常进行性能的测试,是一个好的工程师应该做到的。在代码提交到代码库之前,就应当做性能测试,因为性能问题也会导致回归测试失败。所以提早发现问题会提高整个项目的质量,减小交付的风险性。

尽早测试性能有以下四点可作为指导:

  • 提早准备测试用户以及测试环境的设计和创建;

  • 性能测试应该考虑尽量用脚本来完成;

  • 通过性能监控工具尽量收集有可能得到的运行信息,为将来分析提供便利;

  • 一定要在一个能真实模拟多数用户的机器环境下进行性能测试。

原文: https://www.ibm.com/developerworks/cn/java/j-lo-java-performance-testing/index.html