课程贴:20230618 性能测试实战
性能实战
JMeter介绍
JMeter启动提示
# 不要使用GUI模式进行负载测试 GUI模式只是压测脚本的创建和调试
Dont use GUI mode for load testing !, only for Test creation and Test debugging.
# 如果想要进行负载测试 使用CLI模式 即非GUI模式 -- 静默压测会详细介绍
For load testing, use CLI Mode (was NON GUI):
jmeter -n -t [jmx file] -l [results file] -e -o [Path to web report folder]
# 可以增加Java的堆来满足压测需求
& increase Java Heap to meet your test requirements:
# 修改JMeter文件的Java堆变量
Modify current env variable HEAP="-Xms1g -Xmx1g -XX:MaxMetaspaceSize=256m" in the jmeter batch file
压测脚本四要素
用户定义的变量
线程组件
jmeter中文显示问题的解决
- 解决乱码问题 → 在<jmeter_home>/bin/jmeter.properties配置文件中设置 sampleresult.default.encoding=utf-8
- 解决Unicode 显示成可读中文的问题 → 将 <ijmeter_proj>/unicode2utf8/unicode2utf8.js 内容复制粘贴到 BeanShell PostProcessor 中
http 与 https 协议的区别
- HTTP: 超文本传输协议
- HTTPS:安全超文本传输协议
- 安全保障三原则:
- 内容加密:采用混合加密技术,中间者无法直接查看明文内容
- 验证身份:通过证书认证客户端访问的是自己的服务器
- 保护数据完整性:防止传输的内容被中间人冒充或者篡改
自动化压测
- 为啥要自动化压测呢?
- 手动逐步加压
- 需要人肉改并发数,然后等待完成
- 烦 !!!!!
- 所以,制定好策略,让程序自动加压,自动等待;完成后看压测监控记录,或者坐收报告
- 计算机努力的干活,我去做更重要的事情
- 希望测试生涯由此变得美好一些
自动化压测
- 源码解读与实操演练
- 源码位置:{iJMeter}/automation
并发数的配置:线程组
ramp-up:只包含请求发出去的时间,不包含请求返回结果的时间
项目的启动:这样展示表示已经运行成功
登录接口:
添加JSON断言:
调试取样器:
添加用户定义的变量:提取共用的参数变量
HTTP请求默认值:
浏览菜单接口:
后置处理器-JSON处理器
将JSON提取器提取的内容放到信息头当中
修改完后一定要进行重启,重启后配置才能生效
添加解决乱码的脚本:
订单确认接口:
用户注销接口:
1、需要查看异常是否在0.5%以内,或者是否在公司特定的异常值范围内
2、参考90%-99%以上的
3、吞吐量:1秒有多少个请求
添加一个事务:
mysql代码:增删改查 有个事务的提交
子请求内容看不到:
可以更加真实的去模拟场景:
添加CSV文件:
静默压测:
目的:后续和jenkins进行持续集成,节约人工劳动力
jmeter -n -t [jmx file] -l [results file] -e -o [Path to web report folder]
-n.:nongui
-t :testfile
-l: logfile
-e: 测试结束后的报告
-o :outputflolder 报告输出的文件地址
静默分析:
jmeter -n -t [jmx file] -l [results file] -e -o [Path to web report folder]
jmx file : /Users/gaigai/Desktop/http.jmx
results file: http.jtl
Path to web report folder:不存在的或者是存在为空的文件夹 http1
jmeter -n -t /Users/gaigai/Desktop/http.jmx -l http.jtl -e -o http1
对/Users/gaigai/Desktop/http.jmx进行压测,压测结果存储在http.jtl,压测的html报告存在http1文件夹内
jmeter -n -t /Users/gaigai/Desktop/http.jmx -l http2.jtl -e -o http2 -JthreadNum=3
jmeter -n -t 压测脚本.jmx -l 不存在的文件名.jtl -e -o 为空的文件夹名 -J参数名1=参数值1 -J参数名2=参数值2
jmeter -n -t /Users/gaigai/Desktop/http.jmx -l http5.jtl -e -o http5 -JthreadNum=3 -Jloop=2
使用命令行传参,需要用到函数助手
性能压测也可以持续集成,也可以设置定时任务
需要搭建实时监控平台
自己操作时的记录:
jmeter -n -t E:/apache-jmeter-5.1.1/apache-jmeter-5.1.1/bin/zl.jmx -l http.jtl -e -o http1
转码脚本:
String s2 = new String(prev.getResponseData(), "UTF-8");
//---------------一下步骤为转码过程---------------
char aChar;
int len = s2.length();
StringBuffer outBuffer = new StringBuffer(len);
for (int x = 0; x < len;)
{
aChar = s2.charAt(x++);
if (aChar == '\\') {
aChar = s2.charAt(x++);
if (aChar == 'u') {
int
value = 0;
for (int i = 0;
i < 4;
i++
)
{
aChar = s2.charAt(x++);
switch (aChar) {
case'0':
case'1':
case'2':
case'3':
case'4':
case'5':
case'6':
case'7':
case'8':
case'9':
value = (value << 4) + aChar - '0';
break;
case'a':
case'b':
case'c':
case'd':
case'e':
case'f':
value = (value << 4) + 10 + aChar - 'a';
break;
case'A':
case'B':
case'C':
case'D':
case'E':
case'F':
value = (value << 4) + 10 + aChar - 'A';
break;
default:
throw new IllegalArgumentException(
"Malformed \\uxxxx encoding.");
}
}
outBuffer.append((char)
value
)
;
} else {
if (aChar == 't')
aChar = '\t';
else if (aChar == 'r')
aChar = '\r';
else if (aChar == 'n')
aChar = '\n';
else if (aChar == 'f')
aChar = '\f';
outBuffer.append(aChar);
}
} else
outBuffer.append(aChar);
}
//-----------------以上内容为转码过程---------------------------
//将转成中文的响应结果在查看结果树中显示
prev.setResponseData(outBuffer.toString());