性能测试
性能测试是一种评估在指定工作负载下系统或应用的响应能力、可靠性、吞吐量、互操作性以及可扩展性的测试。
性能测试也可以定义为一种评估计算机、网络、软件应用或设备的速度或效率的过程。
可以对软件应用、系统资源、目标应用元件、数据库等进行性能测试。通常测试会包含一个自动化的测试套件,该测试套件能够很容易地反复模拟各种正常值、峰值以及异常负载的情况。这种形式的测试可以评估一个系统或应用是否能达到供应商所声明的规格要求。测试过程可以比较应用在速度、数据传输率、吞吐量、带宽、效率或可靠性等方面的变化。性能测试也作为评估瓶颈和单点故障的诊断工具。通常性能测试在一个可控的环境下进行,与压力测试同时进行。性能测试也是评估系统或应用在恶劣条件下仍能保持一定级别效率的能力的过程。
这对任何软件产品的成功运行和维护来说都是不可缺少的关键部分。同时性能测试也是衡量应用是否可以支持更大用户群的重要手段。
有效的性能测试的其他优点
从宏观上看,性能测试可节约成本,树立公司的品牌。
性能测试的实施标志着软件应用的发布已经准备就绪,网络和系统资源充足,架构稳定,应用的可扩展性强等。
在发布应用之前收集评估应用和系统资源的性能特性,可以帮助提前解决问题,并为项目干系人提供有价值的反馈,帮助他们做出关键的战略决策。
性能测试覆盖的范围
性能测试覆盖了几乎所有范围,例如:
- 评定应用和系统产品成熟度;
- 根据性能基准(例如,每秒事务处理量、每日页面浏览量、每日注册量等)对系统进行评估;
- 对比多个系统或不同系统配置下的性能特性;
- 识别影响性能的资源瓶颈;
- 辅助性能和系统调优;
- 帮助识别系统吞吐量级别。
性能测试实施过程的几个关键活动
- 定义验收标准:响应时间、吞吐量和资源利用率都是性能测试的关键指标。验收标准通常由项目干系人确定,测试过程中通常需要持续关注,标准也可能要根据实际情况进行调整。
- 定义测试环境
- 规划并设计测试用例
- 准备测试环境
- 准备测试计划
- 运行测试:脚本录制完成后,在轻量负载下运行测试计划,验证测试脚本和输出结果的正确性。
- 分析结果、报告和重测试:检查每一次成功执行的结果,识别需要解决的瓶颈。瓶颈可能与系统、数据库或应用有关。出现系统相关的瓶颈可能需要调整基础设施,例如,增加应用的可用内存,降低CPU使用率,增大或减小线程池,调整数据库连接池大小,调整网络设置等。出现数据库相关的瓶颈需要分析被测应用中的数据库I/O操作、高级查询,分析SQL查询,增加索引,执行数据采集,改变表中的页大小和锁等。最后,出现应用相关的瓶颈可能需要重构应用元件,降低应用内存使用率,减少数据库中的读取/写入等。识别到的瓶颈问题解决后,应该重新运行测试并和之前的运行比较。为了跟踪哪些调整解决了特定瓶颈问题,按顺序同一时间只做一个调整至关重要。换句话说,一旦进行了调整,就应该重新按照测试计划运行一次并与之前的测试结果进行比较,看这次调整对结果产生了正面还是负面的影响。这个过程将一直重复,直到达到项目要求的性能指标。
性能测试和调优
性能测试和调优的关系非常紧密。通常,端到端的测试会揭示系统或应用的瓶颈,这些瓶颈导致无法达到项目要求的目标。一旦发现瓶颈问题,大多数团队随后会进行各种调优,以提升应用性能。调优工作包括但不限于以下内容:
- 调整系统资源设置;
- 优化数据库查询;
- 减少应用的调用次数,有时需要重新设计有问题的模块并调整架构;
- 扩展应用和提高数据库服务器性能;
- 减少应用资源占用量;
- 优化和重构代码,包括消除冗余和缩短执行时间。
即使应用性能已达标,如果团队希望削减使用的系统资源数量,减少硬件数量或进一步提升系统性能,则也需要进行调优。经过调整(或一系列调整),重新执行测试以查看性能是否因此而提高。即使性能结果已达到可接受的目标,这个过程仍会继续。测试-调优循环的结果通常会产生一个基线。
基线
基线是为评估系统或应用连续调整的效果而获取性能指标数据的过程。除为了对比性能而特意变化的特征和配置之外,保持相同的特征和配置对于有效对比某个调整(或一系列调整)在性能调优中的正面作用非常重要。对于系统设置或应用的调整之后,对应的测试结果可以与基线结果比较,以确定调整是否有意义。
在收集基线数据时需要考虑如下几点。
- 基线数据应该是应用程序特定的。
- 可以为系统、应用或者模块建立基线。
- 基线数据是指标数据/结果。
- 基线数据不应该过于概括。
- 随时间变化可能需要重新定义基线数据。
- 基线数据可以当作共享的参考框架。
- 基线数据应该是可重用的。
- 基线数据可以帮助识别性能的变化
负载和压力测试
负载测试是给系统加压并测量其响应的过程,主要用于确定系统能承受的最大负荷。
压力测试是通过给系统施加比正常情况下高出很多的负载并判定其响应能力的过程。
压力测试与性能测试有所区别,性能测试的唯一目的是确定系统的响应和有效性,即系统有多快。因为都关注负载对系统响应的影响,所以性能测试通常几乎都会和压力测试同时进行。