优品软件培育计划【第五期】—— 性能测试测试策略制定(上)
图片


优品软件培育计划百场前沿技术系列讲座直播的第五场邀请到的是负责参与过多项国家级性能测试项目的上海市软件评测中心高级测试工程师曹骏。他从用例设计、脚本编写、场景设置等方面带大家一起探究了性能测试策略的制定。现将整场讲座的内容整理如下,供大家继续学习使用。


图片

-正文-

在直播的开始,让我们先一起来看一组数据:


4982亿
23.21亿
 
4982亿是2020年天猫双11的成交额,而23.21亿是2020年天猫双11的物流订单总量。大家可能或多或少都参与了这次线上活动,对于它的疯狂应该深有体会。但是对性能测试的从业人员来说,这些数字还有另外一层含义。
 
我们再来看一组数据,截至2020年11月1日0点到11月11日00:30分,天猫双11成交额达到3723亿元,短时间内巨大的交易量也带来了巨大的性能压力,在零点零分26秒,天猫双11迎来流量洪峰,订单创建峰值达58.3万笔/秒,再创新纪录,这个58.3万笔/秒其实是对性能的一次严峻的考验。双十一不但是广大网民的一次狂欢,更是对天猫、淘宝运维团队的一次大阅兵。
 
我们把时间往前推一下,在2014年双11当天,阿里巴巴的销售额超过了571亿元,在现在看来并不高的一个交易额,由于用户访问量的爆发式增长,造成淘宝服务器多次宕机,致使网站短时间无法访问也一度占据各大新闻的头条。
 
无独有偶的是,亚马逊在第二届Prime Day,全球订单增长超过60%,亚马逊在这一天里也倍受技术问题的困扰。许多亚马逊Prime用户希望在Prime Day获得优惠和折扣,但在购物时遭遇了“不能将商品加入购物车”的故障。
 
我们现在回头看一下,从2014年的571亿元到今年的4982亿,能抗住这种成倍增长的瞬间访问量以及交易量是保障购物体验是否顺畅的至关重要的一环,而我们的性能测试恰恰也是为此而存在的。
 
性能测试是什么呢?性能测试要怎么测呢?为什么要开展性能测试呢?这都是我们今天要去探讨的内容。
 
我们平时接触的大部分性能测试其实用一句话去概括就可以了:通过一个设计好的性能测试有效定位系统的瓶颈,从而有目的地、有针对性地对系统进行调优。因此性能测试测试策略的制定就是性能测试中非常重要的一环。
 
接下来会从以下几个方面去展开:性能测试的目的、性能测试的类型、常见问题概述、测试需求理解以及计划制定、测试脚本编写、实际运行场景的设置、最后综合以上几点进行一下总结。
 

01

性能测试的目的


性能测试的目的其实就是为了验证软件系统是否能够达到用户的性能指标,发现软件系统中存在的性能瓶颈,随后优化软件,最后起到优化系统的目的。主要有以下几点:
 
图片

02

性能测试的类型


为了达到性能测试的目的,需要通过不同的性能测试策略来实现,而性能测试的测试策略又基于不同的性能测试的类型。接下来就给大家介绍一下最常见的性能测试类型:
 
图片
 
负载测试


负载测试是测试软件在各种不同负荷下的表现。在这种测试中,将使测试对象承担不同的工作量,以评测和评估测试对象在不同工作量条件下的性能行为,以及持续正常运行的能力。


负载测试的目标是确定并确保系统在超出最大预期工作量的情况下仍能正常运行。此外,负载测试还要评估性能特征,例如,响应时间、事务处理速率和其他与时间相关的方面。
 
压力测试


压力测试是为了发现系统性能在可以接受的范围内能支持的最大负载的测试,是对系统不断施加压力的测试,是通过确定一个系统的瓶颈或者不能接受的性能点,来获得系统能提供的最大服务级别的测试。例如测试一个 Web站点在大量的负荷下,何时系统的响应会退化或失败。
 
基准测试


基准测试是一种测量和评估软件性能指标的活动,通过基准测试建立一个已知的性能水平(称为基准线),当系统的软硬件环境发生变化之后再进行一次基准测试以确定这些变化对性能的影响。
 
疲劳强度测试


疲劳强度测试是采用系统在要求支持的最大并发用户数情况下持续执行一段时间,通过综合分析交易执行指标数据和系统资源监控数据来确定系统处理要求最大工作量强度性能的过程,以验证系统是否能够稳定运行。
 
大数据量测试


大数据量测试主要针对数据库有特殊要求的系统进行的测试,可以分为实时大数据量测试和极限状态下的测试。实时大数据量测试主要目的是测试用户较多或者某些业务产生较大数据量时,系统能否稳定运行;极限状态下的测试,测试系统使用一段时间即系统累计一定量的数据时能否正常的运行业务。
 

03

性能问题常见特征


性能测试的类型其实不仅仅只有这五种。在系统使用的过程中,往往会遇到不同的性能问题,在这里我们总结一下常见的性能问题的六个特征:
 
1、持续缓慢:应用程序一直特别慢,改变负载,对整体响应时间影响很少


2、随着时间推进越来越慢:负载不变,随着时间推进越来越慢,可能到达某个阈值,系统被锁定或出现大量错误而崩溃


3、随着负载增加越来越慢:每增加若干用户,系统明显变慢,用户离开系统,系统恢复原状


4、零星挂起或异常错误:可能是负载或某些原因,用户看到页面无法完成并挂起,无法消除


5、可预见的锁定:一出现挂起或错误,就加速出现,直到系统完全锁定。通常重启系统才解决


6、突然混乱:系统一直运行正常,可能是一个小时或三天之后,系统突然出现大量错误或锁定
 
当这些问题出现的时候,往往需要通过性能测试去寻找这些问题的成因,以此来制定相应的解决方法。比如,持续缓慢可能是中间层的一些问题,也有可能是web系统或者web瓶颈的一些问题,或者是代码拼写得过于糟糕导致的。随着负载增加越来越慢可能是服务器资源的一些原因。零星的挂起或异常错误可能是因为内部资源过度使用或者分配不足导致的。可预见的锁定和突然混乱都可能是后端系统的宕机或者网络原因造成的。
 
这些都是可以通过制定性能测试的策略去进行定位的。
 
前面我们大体讲了下什么是性能测试,为什么要进行性能测试以及怎样进行性能测试,就是what、how、why的一个思路,接下来我们通过实际流程的操作,来针对性能测试中测试策略的制定去做一个详细的讲解。
 

04

测试需求理解以及计划制定


首先我们需要先明确测试的需求,而定位需求需要确认两点,一个是测什么?一个是测多少?而测什么就是性能测试的测试场景。
 
针对测试场景来说,有明确的性能需求要求,按照要求确认测试内容即可。但是大多时候我们的测试是没有明确的测试需求的,那可以利用以下几种方法,根据系统运行背景(如系统类型、运行环境、用户数等);在关键功能中选择不超过10%的用户最关注、最重要的业务功能,作为性能测试的测试场景。打个比方,一个电商网站,测试场景就是一个用户搜索商品、加入购物车、提交订单这块重点来做,而我们不会把重点放在后台管理那些操作上。
 
测多少其实就是每一个测试场景所对应的并发用户数。有明确的并发用户数要求,则按照要求确认并发用户数。没有明确的并发用户数要求时,建议大家分析系统上线使用时的终端用户数量,按照终端用户数的10%以上作为性能测试的并发用户数。而当我们无法确认上线后的终端用户数量有多少时,建议并发用户数从最少取50个取起,然后慢慢累加,以实际的情况去进行调整,也可以去参考同行业内的相关标准。下面我们就拿几个例子去具体说明一下。
 
性能指标需求模型-二八模型


第一个标准是大家很熟悉的二八定律。它是19世纪末20世纪初意大利经济学家帕累托发现的。


他认为,在任何一组东西中,最重要的只占其中一小部分,约20%,其余80%尽管是多数,却是次要的。
 
下面我们就以一个具体的案例去说明
 
某系统总容量达到日交易量15万笔,根据这一要求对系统进行性能测试并开发性能测试需求:


 下面是计算的步骤:


采用2/8比例,即80%的业务在20%的峰值时间内完成,20%的业务在80%的非峰值时间内完成,那么可以得到峰值处理业务量15万的80%为12万,非峰值处理业务量15万的20%为3万


1天系统运行时间为20小时,另4小时为非营业的后台处理时间,那么峰值时间20小时的20%为4小时,非峰值时间20小时的80%为16小时。
 
可以计算到:
1)平均峰值处理速度12万/(4*3600)秒接近9个/秒;
2)平均非峰值处理速度3万/(16*3600)秒约0.5个/秒;]
 
考虑到特殊情况的发生,建议实际峰值处理速度要能达到理论计算的平均峰值处理速度的1.5到2倍


所以最终确定下来的建议峰值处理速度为9个/ 秒*2=18个/秒。
 
2-5-8原则


另外一个业内广泛使用的原则就是“2-5-8原则”
 
所谓的“2-5-8原则”,简单说,就是当用户能够在2秒以内得到响应时,会感觉系统的响应很快;当用户在2-5秒之间得到响应时,会感觉系统的响应速度还可以;当用户在5-8秒以内得到响应时,会感觉系统的响应速度很慢,但是还可以接受;而当用户在超过8秒后仍然无法得到响应时,会感觉系统糟透了,或者认为系统已经失去响应,而选择离开这个Web站点,或者发起第二次请求。
 
我们可以将258原则作为考量性能测试平均响应时间的一个标准。2秒是很快的标准,5秒也是可以的,8秒很慢但是可以接受,超过8秒的话就需要去定位一下瓶颈,去改进一下。
 
根据以上的测试需求及测试内容,我们就需要去制定相应的测试计划,将其转换成实际的工作量。
 
计划的制定需要根据以下几点:软件自身特点、用户对性能的关注程度以及项目周期、项目经费等。
 
具体内容包括:
测试时间:何时开始介入测试,测试周期
测试地点:测试环境、生产环境
测试内容:性能验证?故障诊断?性能调优?
所用测试方法
测试工具的选取
 
计划制定之后,在测试开始前,还需要一些准备工作,包括:测试环境、测试工具、测试数据和测试人员培训等。
 
展开来讲,首先性能测试环境搭建的基本原则主要有以下几点:
尽可能接近真实环境
营造相对简单、独立的测试环境
无毒的环境
考虑测试工具的安装条件
 
针对测试工具的选择,现在比较常用的主要以LoadRunner和JMeter为主。值得一提的是,还有道普云,它是一个可以开展线上测试的云测试SaaS平台,目前已经集成了LoadRunner Enterprise 2020、Fortify SCA 20.1、Fortify WebInspect 20.1这三款工具。
 
接下来针对测试环境我们还需要准备测试数据,主要包括:基本数据(如用户名、密码)
历史业务数据、测试脚本中参数数据等。
 
如果生产环境中的数据足够多时,建议导入生产库数据作为性能测试的基础数据。


如果生产环境中的数据无、或者数据量不够需要手工生成数据时,建议批量生成有规律的数据作为性能测试的基础数据。


数据库在性能测试执行之前备份,在性能测试之后还原。可以减少脚本调试时间,从而缩短性能测试周期。
 
以上这些就是我们性能测试中需要做的一些准备工作,准备工作做好之后,我们就可以进行第一步测试脚本的编写。