一、基础
1、什么是性能测试?
软件的性能:效率、时间、资源
性能测试:针对软件进行的测试,自动化工具来验证多用户并发,系统的稳定性、响应时间。
重要性:12306
2、性能测试的目的及注意事项
目的:
- 评估系统的能力
- 寻找瓶颈
- 预测未来
注意事项:
- 尽早的执行
- 需要多个部门配合
- 需要独立的环境
- 明确测试指标
3、性能测试的分类
基准测试:
(模拟单用户运行,产生基准性能测试数据。)
为多用户并发测试和综合场景测试等性能分析提供参考依据。
并发测试:
(模拟多用户运行,验证服务器是否有问题)
通过模拟多用户并发访问,测试多用户同时访问同一应用、模块或数据,观察系统是否存在问题。
负载测试:
(找到系统最大的负载能力)
通过对被测系统上不断加压,直到超过预定的指标或者资源达到了一种饱和状态不能加压为止。
压力测试:
(系统达到一定饱和时,系统处理业务的能力)
系统已经达到一定的饱和程度,例如cpu、磁盘等处于饱和状态下,此时系统能够处理业务的能力,系统是否会出现错误。
稳定性测试:
(测试系统在一定的业务压力下,系统可持续运行的时间)
又称可靠性测试,在给系统加载一定业务压力的情况下,使系统运行一段时间7*24,以此检测系统是否稳定。
配置测试:
(通过环境的调整来分析系统的性能,从而进行调优)
配置测试通过对被测系统的软\硬件环境的调整,了解各种不同配置对系统性能影响的程度,从而找到系统各项资源的最优配置。
4、性能测试的指标
系统指标
① RT(Response Time,响应时间):
从用户发送一个请求到用户接受到服务器返回的响应数据这段时间。
② 并发数:
并发用户数:某一物理时刻同时向系统提交请求的用户数
在线用户数:某段时间内访问系统的用户数,这些用户并不一定同时向系统提交请求
系统用户数:系统注册的总用户数据
三者之间的关系:系统用户数>=在线用户数>=并发用户数
③ TPS(Transactions Per Second,每秒事务数):
单位时间内系统处理的客户端请求的事务次数
计算方法:
tps=并发数/平均响应时间
④ QPS(Queries Per Second,每秒查询率):
是一台服务器每秒能够对应的查询次数
TPS vs QPS:
QPS和TPS类似,不同点在于,对一个页面的访问,形成一个TPS;但一次页面请求,可能产生多次对服务器的请求,就会有多个QPS.
举例:访问一个页面会请求服务器2次,一次访问。产生1个TPS,2个QPS
资源指标
资源利用率:对不同系统资源的使用程度,通常以占用最大值的百分比来衡量
服务器资源指标:
① cpu使用率:
长时间情况下,一般可接受上限不超过85%
② 内存利用率:
一般至少有10%可用内存,内存使用率可接受上限为85%
③ 磁盘IO:
一般使用%Disk Time(磁盘用于读写操作所占用的时间百分比)度量磁盘读写性能
④ 网络带宽:
判断网络连接速度是否是瓶颈,可用用该计数器的值和目前网络的带宽比较。8b=1B,100Mbps = 12.5M
5、性能测试的流程
需求分析、测试计划及方案、测试执行、结果分析
① 性能需求分析
被测系统:
测试内容:
测试策略:
- 基准测试
- 压力测试
- 负载测试
- 稳定性测试
测试指标:
无明确需求指标:
需要自己挖掘或者团队一起分析(只能靠自己查找相关资料,和类似的系统对比,以及对未来浏览的预估,确定性能测试需求的指标)
明确需求指标:
只需要根据执行分析结果与预期指标做对比,如有不满足的,就需要分析问题所在。
确定性能指标:
资源利用率
响应时间
并发用户数
TPS:
根据28定律:80%的用户请求,集中在20%的热点数据或者时间段
6、性能测试计划和方案
① 计划
测试目标:确定此次性能测试的目标
登录
支付
人力资源: 明确性能测试的时间,计划需要多少人来进行测试
时间进度:
风险: 列出可能存在的风险
② 方案
测试环境:
架构设计
软硬件配置
服务器
数据库
注意:尽量和生产坏境一致
测试工具:
性能测试工具
LoadRunner
Jmeter
监控工具
Linux
nmon
分析Linux性能的免费工具
rpc
安装在Linux,结合LoadRunner来使用
jvisualVm
主要监控JAVA程序,监控内存等
Spotlight
监控数据库相关的信息
Windows
Spotlight
permon.exe
性能监视器,windows自带监控工具
测试策略:
满足规定的服务器资源性能指标范围内,模拟不同的用户数量的性能测试,以确定系统能够承受的最大并发数
一般的性能测试
单一场景
登录
下单
混合场景
登录-》查看商品->下单
稳定性测试
混合业务场景下,在负载测试的并发数下,延长测试时常到至少3*24小时,考察系统的稳定性
7、性能测试用例执行设计及执行
① 性能用例设计
按场景设计分类:
预期性能指标的测试
单业务并发性能的测试
混合场景并发性能测试
测试用例设计:
测试性能点
登录
注册
用例的编写:
1)、预期性能指标用例
2)、单业务并发性能
3)、混合场景并发性能测试
② 性能用例执行
脚本编写: 根据测试用例设计编写对应的脚本
场景监控设计: 把编写好的脚本去设计执行
场景运行
监控场景:使用工具对服务器进行监控
测试报告:
压测结果
通过表格方式描述结果是否满足需求
监控图
包括性能指标的结果以及图形
tps
响应时间
性能评估
根据结果进行性能分析及评估,提供可优化的方案
二、性能测试工具——LoadRunner
1、工具介绍及安装事项
LoadRunner的安装和破解
介绍:
全部安装,只能安装在windows
LoadRunner Generator负载生成器,可以安装在windows或linux上
安装系统要求:
建议在Windows7
内存建议2G以上
浏览器支持IE8,最新能支持到IE9
安装注意事项:
注意事项:破解前把loadrunner相关程序全部退出
汉化:建议不要汉化,可能出现一些未知的问题
2、LoadRunner基本组成
① 用户脚本(Virtual user generator)
② 控制台(Controller)
③ 压力生成器(Load Gengerator)
④ 结果分析器(Analysis)
3、LoadRunner自带的测试环境
4、LoadRunner——Virtual User Generator
简介:
基于录制回访的工具,可以把操作的步骤录制下来,自动转化为脚本
在Vugen中录制得到用户的行为就好比虚拟了一个用户的行为,所以我们称之为Vuser,脚本称为Vuser Script
Vugen进行用户行为模拟的流程
详细介绍:
Vugen脚本组成及函数:
脚本:
vuser_init
虚拟用户初始化
运行1次
action
具体操作
vuser_end
结束操作
运行1次
总结:
vuser_init和vuser_end都只能存在一下
Action可以分成无数多个部分
在迭代执行测试脚本时,vuser_init和vuser_end中的内容只会执行一次,迭代的是Action内容
函数: 在脚本模式下,每行脚本都是函数,函数中的参数记录了客户端发送给服务器(请求request)的数据
① web_url:直接请求了一个网页。生成GET请求
② web_submit_data:用来生产表单的GET或POST请求
③ web_custom_request:模拟浏览器发出HTTP支持的任何方式的请求
④ web_image:通过单击图片链接请求打开一个网页
脚本运行及查看结果:
脚本运行
点击run或F5
查看结果
包含录制、回放、关联等相关信息的输出管理
Replay Log(回放日志)
Recording Log(录制日志)
Correlation Results(关联结果)
Generation Log(生成日志)
运行时设置:
访问方式
运行设置 run logic
运行时设置Pacing
运行时设置log
运行时设置think time
运行时设置Miscellaneous虚拟用户运行时进程和线程
Multithreading:
5、LoadRunner——协议探测器
协议选择的重要性:
录制脚本之前,选对协议很重要,否则错误的协议会导致Virtual User Generator 录制不到脚本,或录制的脚本不完整,有些应用可能需要选择多个协议才能完整的记录 客户端与服务器端的请求
如何选择协议:
咨询开发人员
根据经验判断
自带的协议探测工具
协议探测器的使用:
6、LoadRunner——脚本录制
案例:实现自带web系统功能:登录-退出操作
录制前准备:
录制脚本:
7、Recording Options(录制设置)
设置打开方式
录制模式
两种录制方式优点对比
如何选择两种模式
HTML高级配置
根据界面录制的脚本、根据接口方式录制的脚本
注意事项:
8、LoadRunner运行流程
需求分析——>测试计划及方案——>测试执行——>结果分析
运行流程:
Vuser——>Controller(Load Generator)——>Analysis
Vuser:创建测试脚本
Controller(Load Generator)
运行测试场景
监控测试环境
Analysis:分析测试结果
三、性能测试工具——JMeter
1、简介
Apache JMeter是Apache组织开发的基于Java的压力测试工具。用于对软件做压力测试,最初被设计用于Web应用测试。
可用于对静态的和动态的资源(文件,Servlet,Perl脚本,java对象,数据库和查询,FTP服务器等)的性能进行测试。
可用于对服务器、网络或对象模拟繁重的负载来测试应用的强度或分析不同压力类型下的整体性能
windows下启动:bin——>jmeter.bat文件
Jmeter文件目录结构:
bin:用于存放可执行程序、日志文件、配置文件
docs:存放api文档。主要提供第三方插件开发
printable_doc:存放用户使用手册
lib目录:存放jmeter所支持的jar包。第三方插件一般放到lib——>ext目录下
基本配置:
汉化:
临时修改:options——>language——>choose language——>chinese
永久修改:打开jmeter.properties——修改language=zh_CN——重启jmeter
主题修改:选项——主题——选择对应的主题,并重启
基本步骤:
① 启动jmeter
② 添加线程组
③ 添加HTTP请求的取样器,并配置
④ 添加查看结果树的监听器
⑤ 点击“启动”运行jmeter,并查看结果
2、JMeter体系结构及运行原理:
由四部分组成:负载模拟、结果验证(断言)、结果收集(监听器)、线程组
负载模拟
结果验证
存储结果
放到取样器之前,在请求发送前需要做环境或参数的准备。
放到取样器之后,对响应数据做处理的元件
确定取样器的处理顺序和逻辑控制等。
运行原理:
3、元件执行顺序和作用域
执行顺序:
JMeter测试计划呈树形结构排列,元件的执行顺序是先执行根节点,再执行子节点。在同一层次中,各个元件的执行顺序逻辑是:
元件执行顺序注意:
定时器、断言、前置处理器、后置处理器只有在适用于取样器的情况下才会按照顺序进行处理。
逻辑控制器和取样器按照在测试计划树中的顺序进行处理
其它测试元件根据其范围和测试元素的类型进行处理
如测试元件是同一种类型,则元件按照在树中出现的顺序进行处理。
JMeter测试计划数包含的元件是分层并且有序的:
元件执行作用域:
测试计划的树形结构的父子节点为基础
取样器
无作用域
逻辑控制器
只针对其子节点有效
其它元件
若父节点为取样器,作用域就是父节点本身
若父节点不是取样器,作用域就是父节点下的所有节点(包括子节点的子节点等)
4、线程组(用户)
分类:
setUp线程组:一种特殊类型的线程组,可用于执行预测试操作(最先执行)
线程组:普通的、常用的线程组,可以看作一个虚拟用户组,线程组中的每一个线程都可以理解为一个虚拟用户
tearDown线程组:一种特殊类型的线程组,可用于执行测试之后的工作(恢复环境、数据的操作)
属性:
Ramp-up时间:虚拟用户启动所需要的时间
线程数:模拟虚拟用户数
循环次数:
配置指定次数:控制脚本循环执行的次数
配置循环永远:
需要调度器配置使用
运行时间:脚本执行的时间
延迟启动时间:脚本等待待定的时间才能开始运行
线程数m和循环次数n的关系:
如果同时配置,实际发送的HTTP请求数一共为m*n
虽然发送请求的次数相同,但不能相互替换
线程组:代表并发用户数,体现服务器的负载量
循环次数:代表执行时间
5、取样器(Sampler)
取样器元件简介
HTTP取样器:
[web服务器]
协议http/https
http协议端口(80)——默认
https协议端口(443)
http主机名/ip
端口号(80/443)
[HTTP请求]
请求方法
路径:目录+参数(/s?wd=hello)
编码格式:默认IOS国际标准,推荐utf-8
6、查看结果树
监听器——>查看结果树
取样器结果:统计请求相关的信息
请求:HTTP请求的请求头和请求体的响应信息
响应数据:HTTP响应体的信息和响应头的信息:
响应体中乱码的处理:修改Jmeter.properties文件中,sampleresult.default.encoding=utf-8.重启jmeter
7、JMeter参数化常用方式
① 用户定义的变量:
方式1(局部变量)
添加方式:线程组——>配置元件——>用户定义的变量
配置:参数名+参数值
使用:在HTTP请求的取样器中引用定义的变量。${变量}
方式2(全局变量)
添加方式:测试计划——>用户定义的变量
使用:在HTTP请求的取样器中引用定义的变量。${变量}
② 用户参数(针对每个用户取不同的值,但是不能针对同一个用户的不同循环取不同的值)
添加方式:测试计划——>线程组——>前置处理器——>用户参数
配置:
参数:添加变量
参数值:添加用户——针对每个用户配置不同的参数值
使用:在HTTP请求的取样器中引用定义的变量。${变量}
③ CSV Data Set Config(CSV数据文件,针对每个用户的每次循环取不同的值)
添加方式:测试计划——>线程组——>配置元件——>CSV数据文件设置
编写csv数据文件:
多个参数写为多列,其中用逗号分隔
多组参数值,则使用多行来设置
配置:
文件名:填写CSV文件的路径。建议使用相对路径。放到bin目录同级,利用../data.csv
文件编码:utf-8
变量名称:从csv数据文件中读取的数据需要保存的变量名。有多个变量时使用逗号分隔
是否忽略首行:要求与csv数据文件中多列的分隔符一致
分隔符:要求和csv数据文件中多列的分隔符一致
遇到文件结束符是否再次循环:默认True
遇到文件结束符是否停止线程:当前一个参数为false,该参数有效,一般设置为True
④ 函数(_counter)(不需要提前准备数据,jmeter自动添加计数方式来完成参数化)
计数函数,一般做执行次数统计使用
counter:
TRUE:每个用户使用独立的计数器
FALSE:所有用户使用全局的计数器
引用:在取样器中使用${_counter(FALSE,)}来引用对应的值
应用场景:当需要参数化的数据只有唯一性要求,但是对具体的参数值无明确要求时,建议使用函数方式
8、JMeter断言(自动判定执行结果是否正确)
① 响应断言
添加方式:测试计划——线程组——HTTP请求——(右键添加)断言——响应断言
配置:
测试字段:需要检查的字段
常使用响应文本、响应代码
模式匹配规则:需要使用什么规则来进行检查
且、或者、非
测试模式:需要校验的值
可填写多个值
② JSON断言
适用于返回的HTTP响应为JSON格式
添加方式:测试计划——线程组——HTTP请求——(右键添加)断言——JSON断言
配置:
JSON PATH: $.weatherinfo.city
勾选“Additional assert value”
在expected value里填写期望值
③ 持续时间断言(Duration Assertion)
添加方式:测试计划——线程组——HTTP请求——(右键添加)断言——断言持续时间
适用于性能测试时,检查HTTP请求的响应时间是否超过预期值
配置:持续时间
9、JMeter关联
当多个请求之前有依赖关系,后一个请求的参数需要使用前一个请求的相应数据时,需要用到关联
① 正则表达式提取器
添加方式:测试计划——线程组——HTTP请求——(右键添加)后置处理器——正则表达式提取器
配置:
要检查的响应字段:默认主体
引用名称:匹配后的数据要存储的变量名
正则表达式:<titile>(.*?)</title> ( )里是要保存的数据
模板:$1$
数字1代表上面正则表达式中第几个( )
匹配数字:0代表随机值,1代表第一个结果,-1代表所有结果
缺省值:当没有匹配上时将该值保存到变量里
引用:
如果匹配数字为1,则直接使用变量名来引用:${变量名}
如果匹配数字为-1,则使用变量名+后缀的方式来引用:${变量名_数字} 通过设置线程组——取样器——Debug Sampler,在查看结果树中来查看匹配的数字
② Xpath提取器
添加:线程组——HTTP请求——后置处理器——xpath提取器
配置
引用名称:匹配后的数据要存储的变量名
xpath:xpath匹配规则
匹配数字:1代表第一个结果,-1代表所有结果,0代表随机
缺省值:当没有匹配上时将该值保存到变量里
③ JSON提取器
添加:线程组——HTTP请求——后置处理器——JSON提取器
配置:
引用名称:匹配后的数据要存储的变量名
JSON path:json路径。$.weatherinfo.city
引用:直接引用变量名即可
10、JMeter直连数据库
连接准备
打开数据库,确定数据库的表以及对应的字段
加载mysql的jdbc驱动
方法一:将jdbc驱动通过测试计划,浏览的方式添加
方法二:将jdbc驱动jar包放入到lib\ext目录下,并重启jmeter
配置jdbc connection configuration
created pool name:给连接池命名,用于后续引用
数据库URL:jdbc:mysql://127.0.0.1:3306/tpshop2.0
用户名
密码
使用:
添加JDBC Request:在取样器下添加
配置
配置连接池的名称
配置SQL语句
配置保存的变量名
如果SQL语句返回了多个参数,输入相同个数的变量名来保存
HTTP断言中,就可以引用变量来进行判断
11、JMeter逻辑控制器(控制元件的执行顺序)
① 如果(If)控制器
用来控制它下面的测试元素是否运行
添加:线程组——逻辑控制器——if控制器
配置:
使用JS语法:"${name}" == 'itcast'
使用jmeter函数的方式:${__jexl3("${name}" == 'itcast',)}
推荐使用函数的方式,效率高
② 循环控制器
通过设置循环次数,来实现循环发送请求
添加:线程组——逻辑控制器——循环控制器
配置:
次数
永远
循环控制器中的循环次数配置m和线程组中的循环次数n配置对比:
关系:如果同时配置,循环控制器下HTTP请求实际的执行次数应该是m*n
区别
两个循环次数作用域不同
③ ForEach控制器
与用户定义的变量或者正则表达式提取器配合使用,循环读取返回的变量中的值,执行一次或者多次。
① 与用户定义的变量配合
添加:线程组——逻辑控制器——ForEach控制器
配置
用户定义的变量
变量名:固定前缀+连续数字
值
ForEach控制器
变量前缀:用户定义的变量中配置的固定前缀
起始数字:连续数字的最小值-1
结束数字:连续数字的最大值
输出变量名称:依次读取变量值后存储到参数中,供HTTP请求来用
HTTP请求
引用输出的变量名称
② 与正则表达式配合使用
先通过正则表达式提取器,提取出请求中所有满足条件的数据
添加ForEach控制器,并配置提取所有满足条件的数据,并保存为变量
在其子节点下,添加HTTP请求并引用变量,即可循环读取正则表达式中匹配的所有数据
12、JMeter定时器
① 同步定时器(Synchronizing Timer)【集合点】
当需要进行大量用户的并发测试时,为了让用户能真正的同时执行,添加同步定时器,用于阻塞线程,直到线程数达到预先配置的数值,才开始执行取样器的操作
添加方式:测试计划——线程组——HTTP请求——(右键添加)定时器——Synchronizing Timer
配置:
并发数:同时达到多少用户才开始发送请求
超时时间
必须配置:否则当虚拟用户数无法被并发数整除时,就会有部分的用户挂起无法执行
配置不能太短:必须比并发数加载的时间要长。否则无法达到并发数的要求,数据就会被释放
② 常数吞吐量定时器(Constant Throughput Timer)
用于性能测试时模拟用户产生的业务压力,通过指定QPS来对服务器发送固定频率的请求
添加:线程组——HTTP取样器——常数吞吐量定时器
配置:
吞吐量的值:QPS*60/虚拟用户数
另外:在性能测试时常使用聚合报告对结果进行检测
添加:线程组——监听器——聚合报告
13、JMeter分布式
应用场景:当测试机无法模拟用户需要的业务负载量时,需要使用多台测试机配合测试
分布式测试原理:
分布式测试时分为一台控制机和多台代理机
控制机负责分发测试任务给代理机
代理机接受任务并向服务器发送请求,并接收服务器返回的响应,然后将测试结果返回给控制机
由控制机对测试结果数据进行汇总统计
分布式测试注意事项:
所有的测试机防火墙都已经关闭
所有的测试机以及服务器都在同一个网络中
所有的测试机的jmeter版本和JDK版本完全相同
关闭jmeter里的RMI SSL开关
分布式配置:
代理机
server_port:不重复。如果使用多台机器做代理机,可不用配置
关闭RMI SSL
控制机
remote_server:所有代理机的IP+port,有多台代理机时用逗号隔开
分布式测试运行:
代理机
jmeter-server.bat运行
控制机
jmeter.bat运行
控制代理机执行脚本:运行——远程启动所有