一 压力测试的目的
- 评估系统的能力
- 识别系统的弱点:瓶颈/弱点
- 检查系统的隐藏的问题
- 检验系统的稳定性和可靠性
二 性能测试指标以及测算
- 【虚拟用户数】:线程=用户
- 【并发数】:指在某一时间,一定数量的虚拟用户同时对系统的某个功能进行交互。一般通过集合点实现。
- 【事务】:一个接口可以是事务,多个接口也可以是事务,一个流程可以是事务,事务代表一个完整的功能。由测试人员决定。
- 【场景】:性能测试的用例
- 【响应时间】:Response Time
平均响应时间:
中位数:从小到大排序,选择第50个。
90%:100 个,从小到大排序,选择第90个。
95%:从小到大排序,选择第95个。
99%:从小到大排序,选择第99个。
基准测试:1个用户请求接口。200-500MS
压力测试:N个用户并发请求接口,2秒
- 【TPS】TPS是系统的重要性能指标,用于衡量系统在一定时间内能够处理的事务数(交易数)。(一般在银行中经常看到 TPS)
每秒完成的事务数:Transactions per sencond
如果是一个接口的话,TPS=吞吐量。(多个接口的话不同)
计算公式:总的事务数/总的运行时间
比如1:某一系统1分钟处理1000个事务,那么 TPS=1000/60=16.7
比如2:按去年的经营数据,2022年最高的一天有10万笔交易。预测2023年TPS需要多少合格?
总事务数=10万,时间=24*60*60=86,400秒
理论上TPS = 100000/86400=1.2
(1)没有更详细的数据:根据二八定律(80%的事务在20%的时间完成)计算:
TPS = 100000*0.8 / 86400*0.2=80000/17280=4.6
(2)如果有更详细的数据:
- 5万比交易是晚上的8-9点完成的。
TPS=50000/3600=13.9
- 业务的增长:30%
TPS=(50000+50000*0.3)/3600=18
- 【QPS】每一秒的查询率。
TPS(每秒的事务数),QPS(一般是用于数据处理),RPS(每一秒的请求), HPS(每一秒的点击率)
如果一个事务只有一个接口,那么TPS=QPS=RPS
- 【吞吐量】衡量网络成功传输的数量量,单位Byte/S
- 【资源利用率】服务器:CPU,内存,磁盘,网络。
三 性能测试流程
1. 需求分析以及需求确定(指标值,场景,环境,人员)
一般提性能需求的(以下是否合理?测试人员要有自己的分辨能力):
- 客户:OA项目,1万员工,并发一万。
- 产品经理:单台阿里云服务器。支撑1万并发。
- 项目组领导:3年之后需要达到什么样的性能。
2. 性能测试计划和方案制定。
- 基准测试
- 负载测试
- 压力测试
- 稳定性测试
- 其他:配置测试,极限测试,浪涌测试?
3. 性能测试准备阶段
人力,硬件,软件,环境折算(不是很准确)。
一个很重要的:干净(环境/版本等一致,和生产环境一模一样最好)
4. 测试执行阶段
- 脚本生成和增强
- 场景设计
- 指标监控
- 性能瓶颈定位和性能调优
- php+nginx+mysql+centos
5. 测试报告和总结
四 脚本的生成(通过jmeter代理服务器录制脚本)
jmeter安装 mac版
jmeter安装windows版
1. 设置代理
- windows设置客户端的代理
控制面板-->Internet选项-->连接-->局域网设置-->勾上代理输入,jmeter所在电脑的ip(通过cmd-ipconfig查询)和8888端口。(或其他端口也行,只要和 jmeter保持一致。8080/8889 等都可以)
端口占用情况:
netstat -a| findstr “端口号”
- mac设置客户端代理(通过jmeter设置)
mac所在电脑的ip查询 ipconfig getifaddr en0
端口占用情况:
sudo lsof -i tcp:port //查看占用情况
sudo kill -9 PID //杀进程
系统设置--网络--高级--代理--网页代理
2. 设置 jmeter代理服务器
4.2.1 设置Requests Filtering
接口url:
http://47.107.116.139/phpwind/
4.2.2 设置Test Plan Creation
3. 启动代理(导入证书)
a. 生成ApacheJMeterTemporaryRootCA.crt
点击“启动”出现下面的情况,ok会在jmeter/bin下生成ApacheJMeterTemporaryRootCA.crt
b. 导入jmeter安全证书
菜单选项--ssl管理器--导入上一步生成的证书
c. 浏览器导入证书
上述证书在 jmeter安装目录的bin中
4. 录制脚本
步骤一 访问首页
步骤二 登录-版块--新板块--发帖--回贴--退出
录制的脚本如下:
****然后就可以关闭代理了****
五 脚本的增强
1.查看结果数
添加--监听器--查看结果树
运行所有的脚本
查看结果数中每个接口的响应是否正确,通过校验后,操作下面的步骤
2.正则表达式
访问接口增加正则表达式
增加csrf_token
(用正则表达式),因为响应数据中的csrf_token在后续的登录中会用到
"csrf_token" value="031fda279957e9b2"
"csrf_token" value="(.*?)"
调用${csrf_token}
3. 函数助手对话框--urldecode
“3.登录接口”的响应数据中,有个网站不大理解,可以通过网址解析函数助手对话框--urldecode
http%3A%2F%2F47.107.116.139%2Fphpwind%2Findex.php%3Fm%3Du%26c%3Dlogin%26a%3Dwelcome%26_statu%3DTXRGbmJET0g0QnVIRkVidUphRURSQkxuMFVIZWk5MVV0SDFnWU4lMkJ3RjZ6SUdzalFsRyUyRlJvWTZlVWVQRjEwbXV3aTUzb25nJTJCb3hBJTNEfGh0dHA6Ly80Ny4xMDcuMTE2LjEzOS9waHB3aW5kL3w
由上图可以看出:
符号 | 解析 |
%3A | : |
%2F | / |
%2F%2F | // |
%3D | = |
_statu%3D(.*?)"
4. 函数助手对话框--增加随机内容
发帖时,为了不重复,增加随机内容
函数助手对话框--RandomString
5. unicode编码解析
登录 unicode解析网站
6. 增加固定定时器
原因:
回贴接口右键--添加--定时器--固定定时器
7. 给指定的帖子回贴
为了给自己发的贴回贴,则将发帖后的 tid用正则表达式提取出来
发帖后响应的内容:
提取tid
tid%(.*?)%
8. 删除不需要的端口
全部运行一遍:
检查都正常,删除有些不需要被禁用的端口,以及------------部分,重新编号,然后再次运行
9. HTTP请求默认值
线程组右键--添加--配置元件--HTTP请求默认值
然后,各接口的web服务器部分可以清除
10. 重定向
下面这种情况是重定向的情况,在接口中设置的是“跟随重定向”
如果不显示重定向,那么就设置“自动重定向”
运行结果:
跟随重定向和自定义重定向,不影响性能
11. HTTP请求头管理
每个接口都有请求头,太多了,可以先禁用掉,再运行,如果没有报错,那么就可以删掉,如果报错了,那么就需要保留。
12. 用户定义的变量
添加--配置原件--用户定义的变量
调用$(fid)
13. 响应时间设置
http请求默认值-高级--响应
设置后,响应时间超过 50ms的就会报错
token:一般用于鉴权
JMeter的聚合报告中的吞吐量==TPS
六 简单的性能测试
设置线程属性
运行结果