性能测试的流程
- 性能测试的需求分析
- 测试用例设计
- 性能分析和调优
性能测试的指标
- 响应时间
- 概念:从客户端发送请求,到客户端收到服务器响应的总时间
- 组成:网络传输时间,服务器(应用服务器处理+数据库服务器处理)处理时间
- 并发数
- 概念:某一时间同时向服务器发送请求的用户数
- 系统用户数 系统注册的总用户数
- 在线用户数 某段时间内访问过系统的用户数 这些不一定同时向系统提交请求
- 并发用户数 某段时间同时向服务器发起请求的用户
- 参考数据的来源来自系统线上运行之后运营人员搜集的数据
- 概念:某一时间同时向服务器发送请求的用户数
- 吞吐量
- 单位时间内处理客户端请求数量,直接体现软件系统的性能承受能力
- RPS每秒请求数 控制服务器每秒处理的指定请求的数量
- TPS每秒事务数 服务器每秒钟能处理业务数量
- 错误率
- 指系统在负载情况下,失败业务的概率
- 错误率=(失败业务数/业务总数)*100%
- 错误率是一个性能指标(必须有负载),不是功能上的随机bug
- 10万用户发送1个请求,成功99990个,失败10个---》错误率=(10/100000)*100%=0.01%
- 1个用户发送10个请求,成功9个,失败1个---》这是一个随机功能bug(没有负载)
- 资源使用率
- 是指各种资源的使用情况,一般用:资源的使用量/总的资源可用量*100%形成资源利用率的数据
- CPU:75%-85%
- 内存:80%
- 磁盘I/O读写:90%
- 网络:不超过带宽80%
性能测试接口响应时间参考
- 项目什么指标都没有,可以参考以下指标确定响应时间,然后测试出来其他指标,作为一个参考的指标
- 通用接口响应时间分布情况:
- 100ms为优良
- 500ms为及格
- 1000ms以上为不可忍受
- 金融接口响应时间的分布情况:
- 100ms为优良
- 200ms为及格
- 300ms以上为不可忍受
- 业务场景的响应时间的各项指标是多少
- 1/3/5排除网络时间和前端增加时间
- 2/4/6加上网络时延,并发很严重的情况下6s
- 资源:
- cpu:不能超过80%
- 内存:不能超过80%
- 错误率:0.05%
- 通用接口响应时间分布情况:
一、秒杀场景(下单业务)的性能用例设计和执行
1.设计性能测试用例
1.并发测试【重点】
- 概念
在极短的时间内,发送多个请求,来验证服务器对并发的处理能力
- 作用
极短的时间内,发送大量请求,系统的并发处理能力达标后,才能上线
-
练习
- 需求: 50用户同时下单参与秒杀,观察是否出现超卖现象。 - Case1(超卖问题) : 秒杀商品的库存设置为10,模拟50个用户同时发送下订单的业务请求,检查下单成功率是否为20%
2.用例设计
Case1(超卖问题) : 秒杀商品的库存设置为10,模拟50个用户同时发送下订单的业务请求,检查下单成功率是否为20%
2.编写测试脚本(下单业务)
如何解决模拟不同用户登录,使用对应的用户登录token和地址下单问题?
1.CSV参数化【重点】
-
作用:让不同用户在多次循环时,可以从数据文件中取到不同的值
-
位置:测试计划 --> 线程组--> 配置元件 --> CSV 数据文件设置
-
参数:
2.完成脚本准备
1. 定义CSV数据文件
—— 准备好 用户登录成功后的token值 和 与之匹配的地址ID
2. 添加线程组,设置线程数和循环次数
3. 添加CSV数据文件设置
4. 添加HTTP请求 – 添加购物车
5. 添加信息头管理器
6. 添加HTTP请求 – 结算
7. 添加HTTP请求 – 下订单
8. 添加查看结果树
- 通过代码获取登录token,写入csv文件
# 1-导包
import requests
# 2-打开文件,将地址id与对应的登录token名称写入csv文件
with open(file='login.csv', mode='a', encoding='utf-8') as f:
f.write('add_id,token\n') # 写入字段名称,要换行
# 3-执行循环登录50个用户,获取对应的token,与地址id一起写入csv文件
for i in range(100001, 100051):
# 3-执行轻商城登录请求
req_url = "http://www.litemall360.com:8080/wx/auth/login" # 请求url
req_data = {"username": "user" + str(i), "password": "user123"} # 请求参数
resp = requests.post(url=req_url, json=req_data) # 获取响应
# print(resp.json())
token = resp.json().get("data").get('token') # 提取token
# print(token)
str1 = str(i) + ',' + str(token) + '\n' # 合并地址id和token值,要换行
f.write(str1) # 写入文件
print("登录数据获取完成啦!")
3.模拟多用户同时请求-同步定时器【重点】
-
作用:阻塞线程(累积一定的请求),当在规定的时间内达到一定的线程数量,这些线程会在同一个时间点一起释放,瞬间产生很大的压力。
-
位置:测试计划 --> 线程组--> HTTP请求 --> (右键添加) 定时器 --> Synchronizing Timer
-
参数介绍:
Number of Simulated Users to Group by:模拟用户的数量,即指定同时释放的线程数数量。 若设置为0,等于设置为线程组中的线程数量 Timeout in milliseconds:超时时间,即超时多少毫秒后同时释放指定的线程数; 如果设置为0,该定时器将会等待线程数达到了设置的线程数才释放,若没有达到设置的线程数会一直死等。 如果大于0,那么如果超过Timeout in milliseconds中设置的最大等待时间后还没达到设置的线程数,Timer将不再等待,释放已到达的线程。默认为0 -
练习:模拟20个用户同时发送访问百度首页的HTTP请求
3.准备测试环境
# 清空购物车
TRUNCATE table litemall_cart;
# 查询构造的库存数据
SELECT * FROM litemall_goods_product lgp WHERE goods_id >=100001 and goods_id <=200000;
# 修改构造商品的库存
UPDATE litemall_goods_product lgp set number = 1000000000 WHERE goods_id >=100001 and goods_id <=200000;
# 查看商品库存
SELECT * FROM litemall_goods_product lgp WHERE id=2;
4.性能测试指标监控 — 已完成
5.设置运行场景并分析结果
-
案例需求
秒杀商品的库存设置为10,模拟50个用户同时发送下订单的业务请求,检查下单成功率是否为20% -
执行记录
二、稳定运行场景的性能用例设计和执行
1.设计稳定运行场景下的性能测试用例
1.稳定性测试
-
概念
- 在服务器稳定运行(用户正常的业务负载下)的情况下进行长时间测试,并最终保证服务器能满足线上的业务需求
-
如何获取稳定性指标
什么是用户正常的业务负载? 系统日常运行时,用户所进行的主要业务操作 系统日常运行时,每种业务操作的并发/负载量 长时间测试? 1天-1周不等
2.用例设计
- 目标需求:所有业务按照日常场景运行12小时,响应时间满足各业务要求,成功率达到99.95%以上,资源使用率不能高于80%
2.编写测试脚本(所有业务)
3.准备测试环境 —已完成
4.性能测试指标监控 — 已完成
5.设置运行场景并分析结果
-
运行步骤
所有的脚本同时执行(解除前后依赖,取消勾选测试计划-》独立运行线程组) 每个脚本都是一个事务/业务 —— 事务控制器 在请求下添加常数吞吐量定时器,控制请求发送速率(每个用户1个请求/每秒,只有此线程) 按照要求设置虚拟用户数和运行时间(参考TPS+用户定义变量) 执行稳定性测试并监控 -
运行结果
三、补充:如何生成html测试报告
-
作用
- JMeter支持生成HTML测试报告,以便从测试计划中获得图表和统计信息
-
命令和参数说明(在cmd或终端执行哦)
【案例演示】通过cmd执行测试生成html测试报告
- jmeter html测试报告介绍
-
注意:
在执行时,需要删除对应目录下的report文件和report.jtl文件,否则运行生成html报告的命令会报错
-
报告汉化和参数说明参考
https://blog.csdn.net/smooth00/article/details/100769262
https://blog.csdn.net/qq_22200671/article/details/108641119
注意:
1-解压后将对应版本的report-template目录复制并替换apache-jmeter-x.x\bin\report-template目录即可,新生成的报告就被汉化了
2-如果生成的html报告显示中文乱码,自行将模板文件转存合适的编码格式
(Windows可以将\bin\report-template下的index.html.fmkr和\content\pages下所有的.fmkr文件都另存为ANSI/ASCII格式即可)
四、扩展:jmeter如何排错
jmeter接口测试排错思路【查看结果树+调试取样器】:
1.通过查看结果树查看接口的响应状态码和响应数据,根据提示排错
2.通过查看结果树查看接口实际的请求方法、URL、参数是否正确【不正确再查看对应的配置信息】
3.对于关联数据可以通过【调试取样器】查看提取的值是否成功,如果显示正常说明提取正确,否则就是提取有问题
绝招【借鉴一个对的请求】:
操作软件对应的功能,通过抓包获取一个执行正确的请求数据,与发送的数据对比【或者直接使用抓包的数据发送请求】,查看是哪里不一样
【本质】:
接口请求不管使用任何工具,不管什么错误,都逃不出以下内容:
请求行:请求方法、URL
请求头:请求数据类型、token/session认证
请求体:请求参数是否正确、关联数据是否取的正确
【如何描述一个错误】:
提交bug或者请求别人帮助时,提供如下信息,提高效率,显得专业:
请求内容:方法、url、请求头、请求体
响应的结果:响应状态码、响应体
其他:关联数据、参数化数据、断言
1-http请求默认值-域名出错
2-信息头管理器-空格
3-http取样器-路径出错
4-响应断言-测试字段出错
5-json断言-路径出错
6-计数器-计数值出错
7-结算-地址id出错