性能测试是为测量或评估被测软件系统与性能效率相关的特性而实施的一类测试,它关注被测系统在不同负载下的各种性能效率。软件系统的性能效率相关特性的覆盖面非常广泛,包括系统的执行效率、资源占用、系统容量等。
性能测试是一个广泛的领域,它包括多种类型的测试,每种类型都有其特定的目标和应用场景。
相应地,性能测试的类型很多,如负载测试、压力测试、基准测试、峰值测试、并发测试、容积测试、可扩展性测试、配置测试、稳定性测试等。
1.基准测试
基准测试(Benchmark Testing)又称单用户测试,主要用于监测被测系统在较低压力下的运行状况并记录相关数据。当性能测试环境确定以后,通常选取业务模型中的重要业务做基准测试,对被测系统施加一定压力,从而获取被测系统在单用户运行情况下的各项性能指标,为多用户并发测试和混合场景测试等提供参考依据。
2.负载测试
负载测试(Load Testing)是性能测试的一种测试类型,用于评估被测系统在预期的不同负载下的行为。负载测试关注系统处理不同负载的能力,这些负载可通过控制并发用户或者进程的数量来实现。进行负载测试时,通过对系统不断增加并发访问负载,监测系统性能的变化,直到系统的某项或多项性能指标达到安全临界值,最终确定在满足该安全临界值的性能指标下,系统所能承受的最大负载量。简而言之,负载测试是通过逐步加载的方式来确定系统的处理能力。
负载测试类似于举重运动,通过不断给运动员增加重量,确定运动员在其身体状况保持正常的情况下所能举起的最大重量。通过负载测试可以获取系统能够达到的峰值指标。例如,一个软件系统的响应时间要求不超过2秒,如果在这个前提下不断增加用户访问量,系统的响应时间就会变长。假设当访问量超过1万人时系统的响应时间超过2秒,那么就可以确定在系统响应时间不超过2秒的前提下,系统的最大负载量是1万人。负载测试可用于系统的性能验证、性能诊断和性能调优等场景。
3.压力测试
压力测试(Stress Testing)用于评估被测系统在高于预期、高于指定容量负载需求或低于最少需求资源的条件下的行为。压力测试关注被测系统处理超出预期或特定峰值负载的能力,也可以用于评估系统在资源匮乏时的处理能力,比如在可用的计算能力、带宽和内存资源不足的条件下系统的表现。进行压力测试时通常采用逐步增加系统负载的方式,使系统某些资源达到饱和甚至失效,从而发现那些只有在高负载条件下才会出现的缺陷,如同步问题、内存泄漏等。
通过对被测系统进行压力测试,也能找出被测系统的性能拐点,获得系统所能提供的最大服务级别(系统所能承受的最大压力),评估系统在峰值负载或超出最大负载情况下的处理能力。压力测试主要用于性能诊断、性能调优和容量规划等场景。
压力测试与负载测试不同。负载测试是在保持性能指标要求的前提下测试系统能够承受的最大负载,而压力测试则是测试系统性能达到极限的状态。例如,软件系统要求的响应时间为2秒。进行负载测试时发现,当访问量达到1万时,系统响应时间不超过2秒,而当访问量超过1万时,系统响应时间则会超过2秒,那么在满足系统响应时间指标的前提下,该系统能够承受的最大访问量是1万。进行压力测试时,则可继续增加系统的访问量,并观察系统的性能变化。例如,当系统访问量增加到2万时,发现系统响应时间延迟到5秒而当访问量增加到3万时,系统则崩溃,无法做出响应。由此可以确定系统能达到的极限访问量是3万。
4.峰值测试
峰值测试(Spike Testing)又称尖峰测试或尖峰冲击测试。
软件行业的峰值测试是从电力等其他行业借鉴而来的一种压力测试类型。在电力工业中,冲击测试用来验证电力设备在刚刚接通电源时能否经受住涌流的破坏。所谓涌流,就是在电源接通的瞬间电流突然变大的现象,涌流过后,电流会逐渐恢复到正常的水平。在软件行业中,峰值测试是为了确认在负载压力发生不可预测变化(如负载压力突然急剧增加)时,被测系统是否能做出正确反应以及维持正常工作,并在峰值负载过后恢复稳定状态,从而评估被测系统对突然爆发的峰值负载的应对能力。
5.并发测试
并发测试(ConcurrencyTesting)用于评估被测系统的某些特定操作同时发生时的性能表现,例如,被测系统被多个用户同时登录时的响应能力,或系统的某一功能被多个用户同时操作时的性能表现。通过并发测试,不仅可以获得被测系统在多用户并发操作时的性能指标,还可以发现被测系统在并发条件下可能发生的问题,如内存泄漏、线程锁、资源争用问题。例如,通过模拟多个用户同时访问某一条件数据,或模拟多个用户同时更新数据,可能会发现被测系统的数据库访问错误、写入错误等。
几乎所有的性能测试都会涉及一些并发测试。但并发测试对并发时间要求比较苛刻,通常需借助专门的性能测试工具,采用多线程或多进程的方式来模拟多个虚拟用户的并发性操作。
6.容积测试
容积测试(Volume Testing)可用于评估被测系统在满足规定的性能目标前提下可以支持的用户量或者处理的事务量。容积测试通常是在一定的软硬件及网络环境下验证被测系统所能支持的最大用户数、最大存储量等。而容积测试所得的结果就是容量(Capacity),所以有些资料或书籍也将容积测试称为容量测试(Capacity Testing)。被测系统的容积通常与数据库、系统硬件(如CPU、内存、磁盘等)等资源有关,容积测试的结果可用于规划未来当需求增长(如用户数量增加、业务量增加等)时数据库和系统资源的优化方案。
7.稳定性测试
稳定性测试(StabilityTesting)有时也被称为疲劳强度测试(Endurance Testing)或浸泡测试(SoakTesting)。
稳定性测试可以评估被测系统在一定运行周期和一定负载压力条件下的出错概率、性能劣化趋势等,以帮助减少被测系统上线后出现崩溃、卡死等现象,为被测系统的逐步优化提供方向上的建议。稳定性测试关注被测系统在特定运行环境下的稳定性,通常是给被测系统施加一定业务压力,例如正常负载压力或略高于正常负载的压力,使被测系统在特定的负载下连续运行一段时间,观察被测系统各个性能指标的变
化,以此验证被测系统是否能够连续稳定运行。在稳定性测试过程中,被测系统的运行时间较长,通常可以检测出是否存在内存泄漏、系统错误、数据库连接错误或线程池错误等问题。这些问题会导致被测系统在某个时间点(拐点)出现性能下降或者失效的情况。测试人员应根据被测系统在实际生产环境中的使用要求来确定被测系统进行稳定性测试需要持续的时间。例如,如果一个系统在设计时考虑在生产环境下的使用周期是一周中5个连续的工作日,那么该系统进行稳定性测试的持续运行时间可以是5x24小时。
8.可扩展性测试
可扩展性测试(Scalability Testing)通常用于评估被测系统在性能效率方面的扩展或增长能力,以确定被测系统适应外部性能需求变化的能力。例如,当被测系统需服务更多用户或存储更多数据时,通过可扩展性测试确定被测系统的性能是否能够扩展或增加,从而适应和满足这些需要。
可扩展性测试关注被测系统是否拥有满足未来效率需求的能力。因此,可扩展性测试是在系统的性能指标符合当前的性能需求且不造成系统失效的前提下,验证被测系统的增长能力。如果确定了被测系统可扩展性的极限,那么就可以在生产中设置相关指标的阈值并对此进行监控,在系统可能出现问题时发出警告。另外,可扩展性测试的结果数据也可以用于指导调整生产环境的硬件数量和配置。
9.配置测试
配置测试(Configuration Testing)是为了合理地调配资源以及提高系统运行效率,通过测试手段来获取、验证、调整配置信息的过程。配置测试通过对被测系统不断增加压力,并在加压过程中调整被测系统的软硬件环境配置,监控被测系统的资源使用情况和各项指标,了解各种配置参数对系统性能的影响程度,从而找出性能瓶颈,并在此基础上重新配置软、硬件环境,找到系统各项资源的最优分配原则和最佳配置标准,为设备选择、设备配置提供参考。配置测试也常常用于性能调优、容量规划等。
每种性能测试类型都有其侧重点。在性能测试实践中可以根据测试目标选择合适的性能测试类型应用于特定的项目。
不同需求的系统与软件宜采用的性能测试类型,空格中标注橙色的为推荐采用的测试类型
这些测试类型可以根据项目的需求单独进行,也可以结合在一起形成全面的性能测试策略,正确实施性能测试可以帮助团队发现潜在的问题,并在产品发布前解决它们。