2.8 确保准确的性能测试设计
在前面的内容中我们确定了关键事务和对数据的要求,下一个步骤就是使用清单创建一些不同类型的性能测试。最后的选择主要取决于应用程序的类型,以及有多少时间可用于性能测试。以下几个测试类型是业内众所周知的,但对于它们的真正含义的理解却不尽相同。
基准测试
基准测试是指建立了一个可与进一步测试比较的点,通常用于衡量事务响应时间。这个测试通常是单用户在一段时间或一定的循环次数内执行单个事务。在基准测试执行过程中不应进行任何其他系统操作,以便提供在“最好情况下”的测量。通过基准测试所得到的值可用于评估,它随着用户数或吞吐量的增长而导致系统响应性能的衰减。
负载测试
负载测试是典型的性能测试,对应用程序施加负载直到达到目标,但通常不会进一步施压。这样做的目的是满足性能指标的可用性、并发性和吞吐量,以及响应时间。负载测试最接近真实的使用场景,它通常会包括一些模拟应用程序客户端与用户交互时的影响,包括数据输入和(人)对于从应用程序服务器返回信息的反应的迟延和停顿。
压力测试
压力测试和负载测试的目的完全不同。压力测试会导致应用程序或部分支撑硬件的崩溃,这样做的目的是确定硬件的支撑大小和上限。因此,压力测试将会持续进行,直到有什么东西出了故障:没有更多用户可以登录,响应时间超过了界定的可以接受范围,或者应用程序变得无法使用。进行压力测试的原因是,假设我们的目标是1000个并发用户,但是当仅仅1005个用户时,硬件就崩溃了,则这一点是值得关注的,因为它清楚地表明,系统能力几乎没有额外的扩展空间。
压力测试的结果不仅可以衡量系统的性能,还可以衡量功能。重要的是要知道应用程序的上限,特别是当未来增长的应用量难以预料的时候。例如,像一个机场的空中交通管制系统,刚才所描述的情况将是灾难性的,它可不能停工。
渗透或稳定性测试
渗透测试的目的是找出那些可能只出现在一段较长时间里的问题。一个典型的例子是,在一个事务重复执行时所出现的缓慢增长的内存泄漏或者一些不可预见的极限情况。除非能够进行适当的服务器监控,否则这种测试没法有效地进行。这类问题的表现形式通常是逐渐变慢的响应速度,或者是应用程序突然变得不可用。确保准确诊断的关键是与用户和服务器执行失败的故障点相关的数据,以及证明系统变慢的相关数据。
冒烟测试[1]
冒烟测试的定义是只关注发生改变的部分。因此,一个性能的冒烟测试可能只涉及那些发生了代码修改的事务。
隔离测试
这种完全不同的测试用于在内部确定问题。它通常会重复执行一些特定的事务,这些事务已被确定为会导致系统的性能问题。
我认为您经常要执行的是基准测试,负载测试和压力测试。渗透测试和冒烟测试更依赖于应用程序,以及可用于测试的时间;至于隔离测试,将主要取决于被发现的是什么问题。无论您决定执行什么类型的测试,您都得好好考虑一下在下一节中要讨论的6个专题。
2.8.1 步进时间[2]
用户在和应用程序进行交互过程中会发生的思考时间,以及用思考时间所代表的一些延迟和停顿。举个例子,有一个客户在eBay上购物,当该客户在输入数据时,系统会有一个等待,并询问客户,让用户决定他对一件商品出多少价钱。可以说明思考时间最重要的是,他在测试执行中引入了一个符合实际的要素。如果去掉思考时间,正如在压力测试中经常做的那样,执行速度和吞吐量就可以提高10倍以上,迅速使一个应用程序的基础设施可以轻松处理1000个真实用户。所以,在负载测试中要包含思考时间。
步进时间(Pacing)是影响性能测试执行的另一个方法。思考时间影响的是事务执行的频率,步进时间影响的则是事务的吞吐量。这是一个非常重要的不同,我要花一些时间来解释。
试想一下这个例子。尽管一个在线的银行系统有6000个客户,但是我们知道,即使是在一天中最繁忙的时间,选择查看账单的人也不会超过每小时100个。所以,如果我们的负载测试结果是基于每小时查看1000次的,那么对于这个操作来说,这并不是一个符合实际情况的测试。
在一个压力测试中,我们可能想要提高事务的执行频率,但在负载测试中却不是这样。和通常的情况一样,我们的目标是尽量使性能测试更真实,通过插入一个步进时间,我们可以减少循环的次数,并且,根据事务吞吐量的定义,事务吞吐量的值也相应地降低了。举例来说,如果一个典型的“小型结算”事务需要执行60秒,那么,使用2分钟的步进时间,将会限制这类事务的最大执行数量为每个虚拟用户每小时执行30次。这是通过让每个虚拟用户在开始下一个循环之前等待2分钟来实现的。换言之,每次执行“小型结算”事务的时间都不少于2分钟。
您可能还要考虑在负载测试中使用变化的步进时间值,以加大真实性。例如,在我们的例子中的每一次循环,您可以使用在2分钟的上下10%浮动值作为随机步进时间。有些自动化性能测试工具会提供这种功能。
[1]冒烟测试的名称源自硬件行业。该词源于这种做法:在硬件的一段或是元件发生了变化或者维修,会对该电气设备简单地通电,如果没有冒烟(或者冒火!),就意味着该元件通过了测试。
[2]这里的(Pacing)指的是一个事务在第一次执行完成,到下一次开始执行的间隔时间。在测试工具LoadRunner中表示脚本执行完成一次迭代,到下一次脚本迭代的时间。