性能测试的最终目标是为了最大限度的满足用户的需求,我们通常为了达到以下目标而进行性能测试:
(1)评估系统的能力:测试中得到的负荷和响应时间数据可以被用于验证所计划的模型的能力,并帮助作出决策;
(2)寻找系统瓶颈,进行系统调优;
(3)检测软件中的问题;
(4)验证稳定性、可靠性;
在讲述性能测试类型前,先简单分析性能测试的压力模型。
如下图所示,随着单位时间流量的不断增长,被测系统的压力不断增大,服务器资源会不断被消耗,TPS值会因为这些因素而发生变化,而且符合通常情况下的规律
说明:
a点:性能期望值 b点:高于期望,系统资源处于临界点 c点:高于期望,性能处于拐点 d点:超过负载,资源不够用,系统处于崩溃 通过如上模型图中的情况,我们大致可以将当前性能测试分成如下4类:性能测试、负载测试、压力测试、稳定性测试,具体的特性及描述,请参考下表: 测试类型 | 简述 | 测试目的和特点 | 关注点及产出 |
性能测试 | 性能测试是指通过模拟生产运行的业务压力量和使用场景组合,测试系统的性能是否满足生产性能要求。 | 目的:验证系统是否有其宣称具有的能力。 特点:对系统性能已经有了解的前提,对需求有明确的目标,并在已经确定的环境下进行的。 | 关注的是系统性能是否和具体的性能需求相一致,而当系统性能超过性能需求的时候,系统的表现并不是测试人员关心的重点。 |
负载测试 | 是指对系统不断地增加压力或增加一定压力下的持续时间,直到系统的某项或多项性能指标达到安全临界值,例如某种资源已经达到饱和状态等 | 目的: 找到系统处理能力的极限。了解系统的性能容量,或是配合性能调优来使用。 | 1.得出线下系统最大TPS。 2.得出线下系统最大TPS时系统资源利用率。 3.得出线下系统极限并发数。 |
压力测试 | 压力测试是评估系统处于或超过预期负载时系统的运行情况。压力测试的关注点在于系统在峰值负载或超出最大载荷情况下的处理能力。 | 目的:检查系统处于大压力性能下时,应用的表现。 特点:一般通过模拟负载等方法,使得系统的资源使用达到较高的水平。 | 关注点:发现功能测试不能发现的非功能性缺陷。 产出: 1.得出线下系统崩溃点的TPS。 2.得出线下系统崩溃时资源使用率 3.得出线下系统极限并发数 |
稳定性测试 | 在给系统加载一定业务压力的情况下,使系统运行一段时间,以此检测系统是否稳定。 | 目的:主要目的是验证是否支持长期稳定的运行。 | 关注系统稳定性。 得出系统稳定状态下的资源利用、连接池、TPS、响应时间、DB健康情况等数据。 |
性能测试从实际执行层面来看,测试的过程一般分为这么几个阶段,见图:
1.性能需求分析
性能需求分析是整个性能测试工作开展的基础,如果连性能的需求都没弄清楚,后面的性能测试工具以及执行就无从谈起了。
在这一阶段,性能测试人员需要与PM、DEV及项目相关的人员进行沟通,同时收集各种项目资料,对系统进行分析,确认测试的目标。并将其转化为可衡量的具体性能指标。
测试需求分析阶段的主要任务是分析被测系统及其性能需求,建立性能测试数据模型,分析性能需求,确定合理性能目标,并进行评审;
2.性能测试准备
主要包括:设计场景,根据场景编写程序、编写脚本、准备测试环境,构造测试数据,环境预调优等;
针对系统的特点设计出合理的测试场景。为了让测试结果更加准确,这里需要很细致的工作。如建立用户模型,只有知道真实的用户是如何对系统产生压力,才可以设计出有代表性的压力测试场景。这就涉及到很多信息,如用户群的分布、各类型用户用到的功能、用户的使用习惯、工作时间段、系统各模块压力分布等等。只有从多方面不断的积累这种数据,才会让压力场景更有意义。最后将设计场景转换成具体的用例。
测试数据的设计也是一个重点且容易出问题的地方。生成测试数据量达到未来预期数量只是最基础的一步,更需要考虑的是数据的分布是否合理,需要仔细的确认程序中使用到的各种查询条件,这些重点列的数值要尽可能的模拟真实的数据分布,否则测试的结果可能是无效的。
预调优指根据系统的特点和团队的经验,提前对系统的各个方面做一些优化调整,避免测试执行过程中的无谓返工。比如一个高并发的系统,10000人在线,连接池和线程池的配置还用默认的,显然是会测出问题的。
3.执行性能测试
执行阶段工作主要包含两个方面的内容:一是执行测试用例模型,包括执行脚本和场景;其次测试过程监控,包括测试结果、记录性能指标和性能计数器的值
4.结果分析与性能调优
发现问题或者性能指标达不到预期,及时的分析定位,处理后重复测试过程。性能问题通常是相互关联相互影响的,表面上看到的现象很可能不是根本问题,而是另一处出现问题后引起的反应。这就要求监控收集数据时要全面,从多方面多个角度去判断定位。调优的过程其实也是一种平衡的过程,在系统的多个方面达到一个平衡即可。
5.性能报告与总结
编写性能测试报告,阐明性能测试目标、性能结果、测试环境、数据构造规则、遇到的问题和解决办法等。并对此次性能测试经验进行总结与沉淀。具体性能测试报告的编写可以参考《性能测试报告模板》。
上面所有内容中,如果排除技术上的问题,性能测试中最难做好的,就是用户模型的分析。它直接决定了压力测试场景是否能够有效的模拟真实世界压力,而正是这种对真实压力的模拟,才使性能测试有了更大的意义。可以说,性能测试做到一定程度,差距就体现在了模型建立上。
至于性能问题的分析、定位或者调优,很大程度是一种技术问题,需要多方面的专业知识。数据库、操作系统、网络、开发都是一个合格的性能测试人员需要拥有的技能,只有这样,才能从多角度全方位的去考虑分析问题。