性能测试是不断的通过不同场景的系统表现去探究系统设计与资源消耗之间的平衡。
我们可以认为性能测试是:通过在测试环境下对系统或构件的性能进行探测,用以验证在生产环境下系统性能是否达到预估的性能需求,发现系统可能存在的性能瓶颈,进而改善优化并系统的性能,提高系统的可扩展性、稳定性。
从上面的描述可以看出,性能测试的主要工作包括:获得预估的性能需求、搭建测试环境、执行测试、分析测试结果。其中,最为重要两个工作是确定测试的目的、方案,并对结果进行分析。
二、确认测试目的
性能测试的需求包含但不限于用户的需求。在性能测试前我们同样需要充分了解开发、运维对系统的关注点。此外,要对被测模块的设计有深入了解,基本判断该模块是cpu密集型或是io密集型。以上这些是为更确立测试的目的,并有针对性的梳理测试方案和分析做好准备。
性能测试的目的包括:
(1)验证系统是否满足预期需求;
(2)验证系统在高压下的表现;
(3)验证系统是否能持续稳定的运行;
(4)探测系统的瓶颈和产生瓶颈的原因;
(5)探测系统设计与资源之间的最佳平衡,改善并优化系统的性能。
三、确认测试方案
根据性能测试目的的不同,所实施的测试方案也不同。
一般,性能测试主要包括如下几种:
1)验证系统在预估负载下的表现:负载测试
2)验证系统在极端负载下的表现:压力测试
3)验证系统是否能持续稳定的运行:稳定性测试
以下是对上述三种测试的图示。一般,常态负载低于瓶颈负载,从常态负载到瓶颈负载区间系统的承受能力可以看作是可扩展能力。当瓶颈负载小于等于常态负载时,说明该系统的性能没有满足预计要求,是存在问题的。探测常态负载与瓶颈负载的关系,正是负载测试所要完成的工作。压力测试则验证从系统到达瓶颈之后,继续持续加压时系统的表现。
根据性能测试的目的,选择是进行负载、压力、稳定性测试还是几种测试。每种测试中一般会安排几个场景,场景的变换主要根据压力值、系统配置等参数而改变。首次测试一把根据预估的性能需求和经验值开决定,后续的测试场景依赖于首次测试的各项指标的特征。例如,首次测试后,发现系统的性能很好,完全满足预期且机器各项负载指数很低,后续可以考虑n倍压力值探测系统瓶颈。如果首次测试的结果表现出不能满足预期,则需要调整各参数值进行测试,通过比较个参数值下的性能表现来分析系统瓶颈。
四、准备环境数据
1 搭建测试环境
什么是测试环境?测试环境=软件+硬件+网络+数据+测试工具。
原则1 以假乱真
软、硬件配置要与生产环境的配置一致,如果条件有限,则要尽量逼近于生产环境的真实条件。同时,要保证测试工具的稳定性。如果性能测试环境不够真实、稳定,则测试的结果的可靠性无法满足。
原则2 以静制动
一般,我们将压力程序、被测模块部署在不同的机器上。(即便是生产环境中压力来自于被测模块所在的机器,我们一般也是分开部署;这是保证被测模块的干净,避免对测试结果的干扰)。因此信息交互是通过网络来完成的。保证环境干净的另一个原因是,一般线上部署是多模块统计部署,在线下没有必要搭建通线上一样的模块,因此使用一套干净的环境进行测试,可以在后期分析中引入多模块统计部署的因素进来,推算上线后的效果。
2 准备测试数据
原则3 以小见大
测试数据是测试环境的一部分,但与环境不同,测试数据很难达到与生产环境一模一样。一方面,生产环境的数据是动态、持续变化的,而测试中我们需要的数据是静态的,我们无法保证数据的实时性;另一方面,生产环境的数据是庞大的,而测试环境中数据量是有限的。
在数据准备中既要关注数据的质、又要关注量。
1)质——指数据的频率、分布要尽可能和线上一致。
2)量——指数据的规模要达到、接近或者超过线上现有水平。
通常,可以采用同比例缩放或扩放的方式,即使用过去一段时间的生产环境数据来进行测试。一般可以保证数据的频率、分布和真实环境中是一致的。
五、性能指标分析
1 性能指标的关注
性能测试的指标可分为产品指标和资源指标两类。对测试人员而言,性能测试的需求来自于用户、开发、运维的三方面。用户和开发关注的是与业务需求相关的产品指标,运维关注的是与硬件消耗相关的资源指标。
1)从用户角度关注的指标:用户关注的是单次业务相关的体验效果,譬如一次操作的响应快慢、一次请求是否成功、一次连接是否失败等,反映单次业务相关的指标包括:
(1)成功率=成功响应次数/统计时间
(2)失败率=失败响应次数/统计时间
(3)响应时间
2)从开发角度关注的指标: 开发人员更关注的是系统层面的指标。
(1)容量:系统能够承载的最大用户访问量是多少?系统最大的业务处理量是多少?
(2)稳定性: 系统是否支持7*24小时(一周)的业务访问?
3)从运维角度关注的指标:运维人员更关注的是硬件资源的消耗情况。
需要注意的是,在预估性能压力和指标时,需要给线上运维操作留有必要的性能空间。