一、性能测试理论
(一)性能测试的概念及其分类
性能测试:主要是通过自动化的测试工具模拟多种正常、峰值以及异常负载条件来对系统的各项性能指标进行测试。
性能测试的分类:
(1)性能测试(狭义)
方法:通过模拟生产运行的业务压力量和使用场景组合,测试系统的性能是否满足生产性能的要求
目的:验证系统是否有系统宣称具有的能力
(2)负载测试
方法:通过在被测系统上不断加压,直到性能指标达到极限
目的:找到系统处理能力的极限
(3)压力测试(强度测试)
方法:测试系统在一定饱和状态下,系统能够处理的会话能力,以及系统是否会出现错误
目的:检查系统处于压力性能下时,应用的表现
(4)并发测试
方法:通过模拟用户并发访问,测试多用户并发访问同一个应用、模块或者数据记录时是否存在死锁或者其他性能问题
目的:发现系统中可能隐藏的并发访问时的问题
(5)配置测试
方法:通过对被测系统的软硬件环境的调整,了解各种不同对系统的性能影响的程度,从而找到系统各项资源分配的自由分配原则
目的:了解各种不同的因素对系统性能影响的程度
(6)可靠性测试
方法:在给系统加载一定业务压力的情况下,使系统运行一段时间,以此检测系统是否稳定
目的:验证系统是否支持长期稳定的运行
(二)性能测试流程
在测试计划阶段(例如制定压力/负载测试计划):
(1)明确分析被测对象
- 预计会有多少用户会连到系统
- 客户机的配置情况(CPU、内存、操作系统、软件工具等)
- 服务器会使用什么类型的数据库以及服务器的配置情况
- 客户机和服务器之间如何进行通讯
- 还有什么组建会影响Response Time指标(如Modem等)
(2)确定测试目标
- 系统完成某个事务所花费的时间
- 明确何种配置能够使系统性能最优
- 系统能够无差错运行的最大时间
(三)性能测试工具:主要有Loadrunner,jmeter
测试工具主要是由四部分组成:脚本生成器、压力生成器、结果分析器、压力控制器
性能测试工具的原理:Loadrunner是通过代理的形式,截获客户端和服务端之间的数据请求,当客户端向服务器端发送请求时,会被Loadrunner(代理服务器)截获数据流后,充当服务器为客户端发送响应。再由代理服务器向服务器发送请求。
(四)Loadrunner的学习
1、Loadrunner的组件
- Virtual User Generator(VUG)录制最终用户业务流程,并创建性能测试脚本(VUG录制的并不是操作,而是底层协议的通讯情况)
首先要创建自动测试脚本,测试脚本的录制和维护是负载测试的重要步骤之一,成千上万个虚拟的用户正是通过执行测试脚本来对系统进行施压的。VUG可以监视并记录客户端和服务器之间的通话,让虚拟用户模拟实际的业务流程,并将其转化为特定的测试脚本语言
- Controller组织、驱动、管理并监控负载测试
包括创建,监控,运行三个操作,进行实时监控场景,可监控的信息包括:系统资源、网络设备、Web服务器和数据库等交易数据。
- Analysis用于查看、剖析和比较性能结果
2、Loadrunner的功能
(1)VUG能够生成虚拟用户,以虚拟用户的方式模拟真实的用户操作行为,它先记下业务流程(比如怎么下单,进行机票预订等),然后转化为测试脚本,利用虚拟用户,在Windows,Linux等机器上同时产生成千上万的用户访问。因此Loadrunner能极大地减少负载测试所需的硬件和人力资源
(2)创建真实的负载,使用controller组织起用户的测试方案
(3)定位性能问题,实时显示性能参数变化评估系统组件的运行性能
(4)分析结果以精确定位问题所在
(5)重复测试保证系统发布的高性能
3、Loadrunner测试步骤
(1)使用VUGen创建脚本,脚本可以是手写的也可以是录制的,用来模拟用户的操作,向服务器端发送请求报文
录制选项
进行录制选项的设置,主要是设置General的recording下的选项,选择哪种方式的录制,参考以下原则:
- 基于浏览器的应用程序,推荐使用HTML-based Script
- 基于非浏览器的应用程序,推荐使用URL-based Script
- 基于浏览器的应用程序中使用了HTTPS安全协议,推荐使用URL-based Script
其次是设置HTTP Properties 下的Advanced选项勾选上Support charset
事务:为了衡量某个action的性能,需要在action的开始和结束位置插入这样一个范围,这就定义了一个transaction
在Loadrunner中,使用事务来度量系统的性能指标,度量在一组操作下的每一步的响应时间
关联:就是将脚本中某些固定不变的数据,转变成是选取自服务器所送的、动态的、每次都不一样的数据。服务器会动态的向客户端返回标识码(Session),因此我们要进行相关的关联操作。
(2)使用Controller创建测试场景,在场景里设置并发用户数量,设置加压模型
(3)使用Analysis分析测试结果
测试Web Tours的服务的性能测试:
启动Web Tours服务(是Loadrunner自带的飞机系统订票网站)服务,可以实现用户的登录注册(1_log)、寻找航班(2_find)、预定航班(3_reserve)、支付操作(4_pay)、退出操作(5_exit),将每一个操作都看作是一个事务
(1)使用VUG进行录制脚本,录制性能测试脚本,回放脚本,进行调试脚本
将整个订票的过程,划分为多个事务,分别测试每个事务的响应时间 ,预定一张票的操作完成后,当点击进行回放时,并没有按照预期增加到两张票,原因在于我们没有进行相关的关联。需要写关联函数,进行关联操作。需要替换脚本中所有的与该参数相关的
//name="outboundFlight" value="242;193;06/15/2016")
web_reg_save_param("outboundFlight",
"LB=name=\"outboundFlight" value=\"",//左边部分
"RB=\")" //右边部分
LAST);
再进行depart city和arrive city的参数化设置:将各城市的名称写入.dat文件中,确保每次订票时随机的选择起始和到达的城市
关联函数写在操作的上面,判断函数写在操作的下面
判断函数:判断是否订票成功
if(strstr(lr_eval_string("{msg}","Thank you for booking through Web Tours")!=NULL))
{//查找在参数msg中有无Thank you...
lr_end_transaction(“4_payment”,LR_PASS);//有的话以PASS作为标志,输出信息
lr_output_message("订票成功,departCity:%s,arriveCity:%s",
lr_eval_string("{departCity}"),lr_eval_string("{arriveCity}"));
}
else
{
lr_end_transaction("4_payment",LR_FAIL);//没有的话以Fail作为标志
lr_output_message("xxx订票失败xxx")
}
将脚本中的登录事务放入vuser_init,将退出事务放入vuser_end中,这样登录和退出事务只进行一次,不管回放多少次脚本。
运行后进行脚本回放,可以看到生成了多张票,往返程目的地在不断地变化着,这样脚本就算是调试成功了。
(2)使用已经编辑好的脚本来录制场景
- 手动测试场景
将调试好的脚本进行add操作进行添加,进入Global Schedule框进行设置 (按场景设置用户数,当然也可也按用户组设置用户数)
Initialise(可以设置每隔多长时间初始化多少个虚拟用户数)
Start Vusers(设置每隔多长时间同时启动多少虚拟用户数)
Duration(持续的时间,设置按时间结束,或迭代完就结束)
Step Vusers(每隔多长时间停止多少虚拟用户数)
- 面向目标的测试场景
面向目标场景是一个闭环回馈的关系,首先要定义达到的目标,然后LoadRunner会自动基于这些目标创建场景,运行过程中,会不断的将结果与目标进行比较,以决定下一步该怎么走
场景创建完之后要先进行保存场景,在进行场景的设置(在Run Time中设置时间,表明该场景在达到目标场景以后,还会持续运行这么长的时间 )
Virtual Users目标类型:用来测试服务器对并发用户的处理能力,场景类型与手动测试场景类型相似
Hit per Second目标类型:测试每秒的点击数,同时设置最小和最大的虚拟用户数,当controller运行时会先从最小的虚拟用户数开始,自动的增长虚拟用户数
Transaction per Second目标类型:每秒处理的事务数
Transaction Response Time:每秒的响应事务数
Pages per Minute目标类型:每秒处理的页面数
(3)场景的执行
- 场景控制
对Tools下的option操作进行设置
- 对虚拟用户组进行相关的操作