目录:
性能测试理论
—概述、策略、指标、流程
性能测试工具 JMeter
—JMter基本使用、JMeter参数化、
—断言、关联、JMeter录制脚本、
—连接数据库、分布式、测试报告等
性能测试理论
要点:
理解性能测试的定义和目的
理解性能测试中常见的测试策略
理解性能测试中常见的性能指标
理解性能测试的流程
能够对比说出Loadrunning和meter的优缺点
一、性能测试概述
为什么要进行性能测试
-
满足真实场景的业务需求
-
招聘需要
性能的概念:
什么是性能?
- 时间:系统处理用户请求的响应时间
- 资源:系统运行过程中,系统资源的消耗情况
什么是性能测试
- 使用 自动化工具,模拟 不同的场景,对软件各项性能指标进行测试和评估的过程。
什么是性能测试的目的?
- 评估当前系统能力
- 寻找性能瓶颈,优化性能
- 评估软件是否满足未来的需要
性能测试和功能测试:
功能测试和性能测试有什么不同?
-
功能测试:验证系统的功能需求规格。焦点:功能 (正向、逆向)
-
性能测试:验证系统的业务需求场景。焦点:时间、资源
功能测试和性能测试有什么关系?
-
一般项目中,先功能测试通过后,再进行性能测试
二、性能测试分类
基准测试:
什么是基准测试?
-
狭义上讲:就是单用户测试。(单用户循环多次得到的数据)
-
广义上讲:建立基准线,当系统的软硬件环境发生变化之后再进行一次基准测试以确定变化对性能的影响。
基准测试数据的用途?
-
基准测试不会单独存在
-
为多用户并发测试和综合场景测试等提供参考依据
-
为系统/环境配置、系统优化前后的性能提升/下降提供参考指标
负载测试:
概念
通过逐步增加系统负载,确定在满足系统的性能指标 (如响应时间等)情况下,找出系统所能够承受的最大负载量的测试。
作用
系统最大负载量达到用户要求时,系统才能正式上线使用。
举例:
- 电梯行业规范:电梯从1楼到5楼 (15秒)的运行时间不超过24s.
进行负载测试:
case1: 1人乘坐电梯,从1楼到5楼,运行时间为20s
case2: 7人乘坐电梯,从1楼到5楼,运行时间为20s
case3: 13人乘坐电梯,从1楼到5楼,运行时间为20s
case4: 16人乘坐电梯,从1楼到5楼,运行时间为25s
case5: 19人乘坐电梯,从1楼到5楼,运行时间为28s
case6: 21人乘坐电梯,从1楼到5楼,运行过程中绳子断了...
注意:
-
通过负载测试,可以确定系统的最大负载量
-
系统对外宣称的最大负载量
-
负载测试的时间一般为1-2小时
稳定性测试:
概念:
在服务器稳定运行 (用户正常的业务负载下)的情况下进行长时间测试 (1天-1周等),并最终保证服务器能满足线上业务需求。
作用
系统在用户要求的业务负载下运行达到规定时间时,系统才能正式上线使用。
其他分类:压力测试:
概念:
在强负载下的测试,查看系统在峰值情况下是否功能隐患、系统是否具有良好的容错能力和可恢复能力。
测试场景
-
极限负载情况下的破坏性压力测试
-
高负载下的长时间稳定性压力测试
并发测试:
概念:
并发测试 (绝对并发):是指在极短的时间内,发送多个请求,来验证服务器对并发的处理能力。
应用场景
特定活动场景,如:抢红包、秒杀、抢购等。
与负载测试对比:
-
负载测试:主要目的是测试高负载情况下,对系统资源的消耗,是否会耗尽的问题 (双11活动)
-
并发测试:主要目的是测试极短时间内,并发请求时,系统资源争强的问题 (抢红包、秒杀)。
三、性能测试的指标
响应时间:
-
指从客户端发起请求开始,到客户端接收到结果的总时间
-
包括:服务器处理时间 + 网络传输时间
并发用户数:
某一时刻同时向服务器发送请求的用户数。
吞吐量:
指的是单位时间内处理的客户端请求数量,直接体现软件系统的性能承载能力。
QPS:
每秒查询数:即控制服务器每秒处理的指定请求的数量
点击数:
所有的页面元素 (如:图片、链接、框架等)的请求总数量
注意:
点击数是请求数,不是页面上的一次点击。
错误率
指系统在负载情况下,失败业务的概率
注意:
错误率是性能指标,是高负载下的失败业 概率
随机bug是功能bug,先解决随机bug才能进行性能测试。
资源利用率:
什么是资源利用率?
系统各种资源的使用情况 "资源的使用量/总的资源可用量*100%"
常见资源指标有哪些?
- CPU使用率:不高于75%-85%
- 内存(大小)使用率:不高于80%
- 磁盘IO(速率):不高于90%
- 网络(速率):不高于80%
四、性能测试的流程
性能测试的核心:需求分析、性能测试执行、性能分析调优
需要掌握:性能测试执行。
需求分析:
性能测试计划:
性能测试用例:
性能测试执行:
测试分析和调优
说明:性能测试分析人员经过对结果的分析以后,如果不符合性能需求,则会提出性能bug,然后由开发人员进行后续的调优。
性能测试报告
测试工作的经过回顾
缺陷分析和调优
风险评估
性能测试结果
测试工作总结与改进
目标:
- 掌握Jmeter环境搭建
- 理解Jmeter的主要元件及相关的作用域
- 理解线程组、HTTP请求的配置使用
- 掌握Jmeter参数化的应用
性能测试工具
JMeter 和 Loadrunner工具对比:
主流性能测试工具 Loadrunner 和 Jmeter 对比 —相同点
- 都能模拟大量用户
- 都能支持多协议 (常见的协议都支持,如:HTTP)
- 都能支持多协议 (常见的协议都支持,如:HTTP)
- 都有监控及分析报表功能
主流性能测试工具Loadrunner和Jmter对比 —不同点
结论:项目日常性能测试 Jmeter 足够用,出商业报告有限 Loadrunner
一、Jmeter环境搭建
安装JDK
下载JDK – 安装JDK – 配置环境变量 – 验证
安装Jmeter:
下载Jmeter – 安装Jmeter – 配置环境变量 – 启动验证
注意点:
- 下载JDK时,注意电脑操作系统是32位/64位
- 下载Jmeter时,注意与本机安装的JDK版本匹配
- 安装 Jmeter时,安装路径中不能有中文/空格
Jmeter的功能概要:
jmeter文件目录结构:
基本配置:
Jmeter界面汉化:
jmeter主题修改
二、jmeter元件及基本作用域
基本元件
作用域的原则:
- 取样器:核心,没有作用域
- 逻辑控制器:只对其子节点中的取样器和逻辑控制器起作用
其他元件:
-
如果是某个取样器的子节点,则该元件只对其父节点起作用
-
如果其父节点不是取样器,则其作用域是该元件父节点下的其他所有后代节点(包括子节点,子节点的子节点等)
元件执行顺序:
在同一个作用域(目录/级别/缩进)的不同元件的执行顺序:
- 配置元件 - 前置处理程序 - 定时器 - 取样器 - 后置处理程序 - 断言 - 监听器
在同一个作用域(目录/级别/缩进)的相同元件的执行顺序:
- 从上到下的顺序依次执行
Jmeter第一个案例:
需求:使用 Jmeter访问百度首页接口,并查看请求和响应信息
步骤:
1.启动Jmeter
2.在测试计划下添加 "线程组"
3.在 "线程组"下添加 'HTTP请求'取样器
4.填写 'HTTP请求'的相关请求数据
5.在 '线程组'下添加 '查看结果树'监听器
6. 点击 '启动'按钮进行,并查看结果
三、理解线程组
线程组的介绍: 特点: •控制Jmeter用于执行测试的一组用户
线程组的分类:
-
Setup线程组:预测试操作,所有脚本之前执行
-
普通线程组:执行测试用例,可以有1个或 多个(并行/串行)
-
Teardown线程组:测试后操作,所有脚本之后执行
线程组的属性: 参数介绍:
如下场景如何设置线程组
案例分析:
使用1个线程组,添加HTTP请求(百度)
-
配置线程数为2,循环次数为3时,运行观察结果
-
配置线程数为3,循环次数为2时,运行观察结果,对比不同
分析:
-
线程数代表虚拟用户数,用户数越多,负载越大
-
循环次数代表运行时间,次数越多,运行时间越长
四、HTTP请求的配置使用
参数介绍:
作用 向服务器发送http及https请求
位置:选中线程组->右键->添加->取样器->HTTP请求
参数:
案例一(使用HTTP请求路径来传递get请求参数):
(1)使用1个线程组,添加HTTP请求(百度),路径为:/S
-
使用HTTP协议,GET请求方法,路径中添加参数为: wd = test,运行观察结果
案例二(使用参数列表来传递get请求的参数):
-
使用HTTPS协议,GET请求方法,路径中添加参数为: wd = test,运行观察结果
案例三(使用参数列表来传递POST请求的form格式参数):
-
使用HTTPS协议,POST请求方法,消
案例四:
-
数据中添加参数为: wd = test,运行观察结果
-
使用HTTP协议,POST请求方法,消息体数据中添加参数为: wd = test,运行观察结果
查看结果树
各部分的含义:
五、Jmeter参数化
定义:使用不同的测试数据,调用相同的测试方法进行测试
本质:实现测试数据与测 方法的分离。
实现方式:
-
用户定义的变量 —— 全局变量
-
用户参数 — 为每个用户分配不同的参数值
-
CSV数据文件设置 —— 文件方式参数化
-
函数 —— 随机数据
-
数据库
用户定义的变量
什么时候使用用户定义的变量?
- 定义全局变量
使用 "用户定义的变量"进行参数化的步骤?
1.添加线程组
2.添加用户定义的变量。格式:变量名 - 变量值
3.添加HTTP请求,引用定义的变量名。格式:${变量名}
4.添加查看结果树
用户参数
什么时候使用用户参数?
- 针对同一组参数,当不同的用户来访问时,可以获取到不同的值
使用 "用户参数" 进行参数化的步骤?
1.添加线程组,设置线程数为n (表示模拟的用户数)
2.添加用户参数
第一列添加多个变量名
后续每一列为一组用户的数据
3.添加HTTP请求,引用定义的变量名。格式:${变量名}
4.添加查看结果树
CSV数据文件设置
函数
四种参数化方式的对比:
目标:
掌握Jmeter断言使用
掌握Jmeter关联使用
掌握Jmeter自动录制脚本
进阶使用
一、Jmeter 断言
断言:让程序自动判断预期结果和实际结果是否一致。
提示:
Jmeter在请求的返回层面有个自动判断机制 (响应状态码)
但是请求成功了,并不代表结果一定正确,因此需要检测机制提高测试准确性。
JMeter常用断言:
-
响应断言
-
JSON断言
-
持续时间断言
响应断言:
案例1:检查百度首页的接口响应中包含“百度一下,你就知道”
案例2:响应断言中,有多个待校验的测试数据
JSON断言
参数:
案例:
请求: http://ww.weather.com.cn/data/sk/101010100.html
检查:让程序检查响应的JSON数据中,city对应的内容是否为“北京”
断言持续时间
作用:检查HTTP请求的响应时间是否超出要求范围
位置:测试计划 --> 线程组 -->HTTP请求 -->(右键添加) 断言 --> 断言持续时间
参数介绍:
持续时间 (毫秒):HTTP请求允许的最大响应时间 (单位:毫秒)。超过则认为失败。
案例:
检查 让程序检查响应时间是否大于100毫秒
二、Jmeter关联
关联:当请求之间有依赖关系,比如一个请求的入参是另一个请求返回的数据,这时候就需要用到关联处理。
JMeter 中常用的关联方法
-
正则表达式提取器
-
XPath提取器
-
JSON提取器
正则表达式介绍:
正则表达式:就是一个公式,或者说一套规则,使用这套规则可以从任意字符串中提取出想要的数据内容
公式格式:左边界(匹配符号)右边界:可以提取出想要获取的数据内容
.:是通配符,可以代表任意字符(除换行回车)
*: 代表前面的字符出现0次或者多次
.*匹配规则:找到左边界值后,往右查找有边界,找到最后面的右边界,中间的所有数据都被记录下来
?: 代表非贪婪匹配,找到左边界后,往右查找匹配右边界,只要有匹配的右边界就停止继续查找;
查找
左边界和右边界
公式格式:左边界(.*?)右边界
<title>百度一下,你就知道</title><title>百度一下,你就知道</title>
<title>(.*?)</title>
案例二:
原始文本:
021-1234-1234
022-1234-1235
023-1234-1236
024-1234-1237
025-1234-1238
026-1234-1239
027-1234-1230
要求:匹配出 城市号、地区号、个人号码三组
正则表达式匹配:
(.?)-(.?)-(.*?)\n
结论:
通过一个正则表达式 以提取出多组数据,每组数据设置对应的左边界和右边界即可
每一组数据都可以有一个或者多个值
正则表达式提取器
案例1:获取传智播客首页的title,并作为参数传递
案例2:获取传智播客首页的地址,把第5个校区地址作为参数传递(span为地址的校区)
响应中的地址格式显示:
<p><span>地址</span>上海市浦东新区航头镇航都路18号万香创新港</p>
方法1:
方法2:
-
引用:以列表索引的方式来引用。格式:${变量名_索引} ,索引从1开始
案例3:获取传智播客首页的地址,把第5个校区地址作为参数传递(span为地址/后面带一、二、三)
地址格式1:
<p><span>地址一</span>昌平区建材城西路金燕龙办公楼一层</p>
地址格式2:
<p><span>地址</span>上海市浦东新区航头镇航都路18号万香创新港</p>
xpath提取器
案例:
//a[@id='kw']: 在HTML页面中,找出a标签(有一个属性为id,且id的值为kw)
//a : 找出所有的a标签
案例:获取传智播客首页的title,并作为参数传递
Json提取器
案例:提取天气接口中的 市信息,作为参数在访问百度首页时传递
三、JMeter属性
案例:
1、线程组1:请求获取天气的接口,http://www.weather.com.cn/data/sk/101010100.html,获取返
回结果中的城市名称“北京”**
2、线程组2:请求百度安全验证北京 ,把获取到的城市名称作为请求参数
四、自动录制脚本
原理:
JMeter录制脚本:在没有接口文档的旧项目当中,快速录制web页面产生的http接口请求,帮助编写接口测试脚本。
jmeter脚本录制
-
添加HTTP代理服务器,并进行配置
-
加HTTP代理服务器:测试计划(右键)->非测试元件->HTTP代理服务器
-
配置代理服务器的参数
- 开启windows操作系统的浏览器代理
-
启动代理服务器,开始录制
-
在浏览器页面中进行操作,成功后,就能在JMeter当中看到抓取到的接口请求了。
当使用代理的过程中,发现抓不到包,几个可能的情况:
过滤规则设置有问题
重启Jmeter代理服务器或者重启Jmeter
换浏览器来使用(Chrome、IE)
检查PC机中的代理设置是否处于可用状态
拔掉网线,抓包
高级使用
掌握Jmeter直连数据库
理解Jmeter逻辑控制器
理解Jmeter常用定时器
一、直连数据库的作用
步骤:
添加MySQL驱动jar包
方式一:在测试计划面板点击“浏览…“按钮,将你的JDBC驱动添加进来
方式二:将MySQL驱动jar包放入到lib/ext目录下,重启JMeter
配置数据库连接信息
-添加方式:测试计划 --> 线程组--> (右键添加) 配置元件 --> JDBC Connection Configuration
案例1:
连接tpshop商城数据库获取商品名包含:小米手机5的商品id
需求:
1、在tpshop首页中搜索商品名称“长虹(CHANGHONG) 49A1U 49英寸双64位4K超清智能网络LED液晶
电视”,
请求URL:http://127.0.0.1/Home/Goods/search.html
请求方法:GET
请求参数:q=
2、在搜索的响应数据中检查是否有该商品对应的商品链接:/Home/Goods/goodsInfo/id/65.html
(id:65需要通过数据库查询返回,才保证每次都是有效的)
编写JDBC脚本步骤(搜索指定商品,在返回结果中检查是否包含指定商品的ID的详情URL):
1.添加线程组
2.添加 JDBC Connection Configuration
3.添加 JDBC request
4.添加 HTTP请求 - 搜索商品
5.在搜索HTTP请求下,添加响应断言,
检查响应结果中的字符是否包含商品URL。
引用格式:${变量名_索引}
6.添加查看结果树
二、逻辑控制器
如果 (if) 控制器
案例:
1、使用‘用户定义的变量’定义一个变量name,name的值可以是baidu或itcast
2、根据name的变量值实现对应网站的访问
循环控制器
案例:
1、循环访问百度10次
(3)思考:线程组属性可以控制循环次数,那么循环控制器有什么用?
不同点:线程组的循环次数对线程组下的所有HTTP请求有效,循环控制器的循环次数对子节点下的
HTTP请求有效
关联:循环控制器次数为M,线程组循环次数为N,
-
循环控制器下的请求运行:M * N 次
-
线程组下,非循环控制器下的请求运行:N次
ForEach控制器:
与用户定义的变量配合使用(案例1):
案例1需求
1. 有一组关键字 [hello,python,测试],
使用用户定义的变量存储
2. 要依次取出关键字,并在百度搜索,
例如:https://www.baidu.com/s?wd=hel
步骤:
1.添加线程组
2.添加用户定义的变量
3.添加ForEach控制器
4.添加HTTP请求-百度
5.查看结果树
与正则表达式配合使用(案例2):
案例2:
1. 访问传智播客首页http://www.itcast.cn,
获取首页中的地址信息,并全部保存下来
2. 要依次取出地址关键字,并在百度搜索,
例如:https://www.baidu.com/s?wd=地址
注意:结束循环字段可以设置为0,自动读取到最后一个
三、定时器
同步定时器
1、模拟100个用户同时访问百度首页,统计各种高并发情况下运行情况
使用同步定时器的操作步骤?
1.添加线程组,设置线程数为n
2.添加HTTP请求
3.添加同步定时器
•设置并发线程数:同时发送请求的虚拟用户数
•设置超时时间:
Ø建议设置:不设置的话,若没有达到设置的线程数会一直死等
Ø不能设置太小:等待时间后还没达到设置的线程数,会释放已到达的线程
4.添加查看结果树
5.添加监听器-聚合报告
常量吞吐量定时器
案例:
(1)一个用户以 20QPS (20 次/s) 的频率访问百度首页,持续一段时间,统计运行情况
(2)2个用户针对 (服务器的QPS要求:20QPS (20 次/s)) 的频率访问百度首页,持续一段时间,统计运行情况
固定定时器:
案例:
(1)IHRM系统登录错误3次后,锁定1分钟,1分钟后重新输入正确的用户名密码登录成功
步骤:
添加线程组
添加HTTP请求1 - 错误1次
添加HTTP请求2 - 错误2次
添加HTTP请求3 - 错误3次
添加HTTP请求4 - 正确用户名密码
在HTTP请求4下,添加固定定时器
添加查看结果树
注意:
-
固定定时器,必须添加在需要等待的HTTP请求的子节点下
-
在HTTP信息头管理器中,修改HTTP请求的头域