文章目录
- 基本
- Jmeter主要元件
- 元件执行顺序
- 提取器
- Json提取器
- 边界值提取器
- 高级
- 动态参数
- 参数化
- 前后关联
- 设置Jmeter语言为中文环境
- 非GUI模式压测
- 分布式压测
- 监控
- 模板
基本
Jmeter主要元件
1、测试计划:是使用 JMeter 进行测试的起点,它是其它 JMeter测试元件的容器
2、线程组:代表一定数量的用户,它可以用来模拟用户并发发送请求。实际的请求内容在Sampler中定义,它被线程组包含。
3、配置元件:用于初始化变量,以便采样器使用。类似于框架的配置文件,参数化需要的配置都在配置元件中。
4、前置处理器:负责在请求之前工作,常用来修改请求的设置
5、定时器:负责定义请求之间的延迟间隔。在没有定时器的情况下,JMeter 发送请求是不会暂停的。
6、取样器(Sampler):是性能测试中向服务器发送请求,记录响应信息、响应时间的最小单元,如:HTTP Request Sampler、FTP Request Sample、TCP Request Sample、JDBC Request Sampler等,每一种不同类型的sampler 可以根据设置的参数向服务器发出不同类型的请求,也可以使用 Java 类型的请求进行自定义编写。
7、后置处理器:负责在请求之后工作,常用获取返回的值。
8、断言:用来判断请求响应的结果是否如用户所期望的。
9、监听器:负责收集测试结果,同时确定结果显示的方式。不过图形化的呈现非常消耗客户端性能,在正式性能测试中并不推荐使用。
10、逻辑控制器:可以自定义JMeter发送请求的行为逻辑,它与Sampler结合使用可以模拟复杂的请求序列。
元件执行顺序
配置元件->前置处理器->定时器->取样器->后置处理器->断言->监听器
使用Jmeter进行接口测试的基本步骤如下:
1.测试计划
2.线程组
3.HTTP Cookie管理器
4.Http请求默认值
5.Sampler(HTTP请求)
6.断言
7.监听器(查看结果树、图形结果、聚合报告等)
提取器
当请求之间有依赖关系,比如一个请求的入参是另一个请求返回的数据,这时候就需要用到关联处理,Jmeter可以使用后置处理器中的一些组件来处理关联,
常用的关联方法:
-
正则表达式提取器 - 适用于所有返回的格式
-
边界值提取器 - 适用于所有返回的格式
-
Json提取器 - 只适用于返回的是json格式的数据(现在基本都是restfulAPI,选这个)
-
XPath提取器 - 只适用于返回的是html或者xml格式的数据
Json提取器
JsonPath的语法推荐在此网站调试:http://jsonpath.com
示例
{
"data":[
{
"name":"张三",
"age":18
},
{
"name":"李四",
"age":28
}
]
}
要取第一个人的姓名
JSON Path expressions:$.data[0].name
要取年龄>18 的姓名
JSON Path expressions:$.data[?(*@*.age>18)].name
边界值提取器
举例
view=1&token=721652512141&name=ggui
左边界:token=
右边界:&name
可得到结果 721652512141
PS:注意,左右边界尽可能唯一,能更精确匹配到想提取的字符
高级
动态参数
对于 POST 请求,我使用了以下 Jmeter 函数
__UUID()
– 返回一个唯一的 GUID 结构
{
"project": {
"uuid": "${__UUID()}"
}
}
参数化
3 种比较常见的 JMeter 参数化的实现方式。
- CSV Data Set Config:将参数化的数据放入文件中,参数化读取依赖于文件操作。这样的参数化方式很常用,尤其适用于参数化数据量较多的场景,而且维护比较简单灵活。
- User Defined Variables:一般来说可以配置脚本中的公共参数,如域名,端口号,不需要随着压测进行动态改变,比较方便环境切换。
- Function Helper 中的函数:使用函数的方式生成参数,如果你需要随机数、uuid 等都可以使用函数生成。JMeter 还提供了相应的接口给你二次开发,自定义需要的功能。
前后关联
-
边界提取器,通过左右边界的方式关联需要的数据;
-
Json Extractor提取器,针对返回的 json 数据类型;
-
正则表达式提取器,通过正则表达式去提取数据,实现关联。
设置Jmeter语言为中文环境
1、临时设置
Jmeter菜单栏选择Options -> Choose Language -> Chinese (Simplified)
这种方法,重启软件后又变为英文环境了。
2、永久设置
进入apache-jmeter\bin目录,找到“jmeter.properties”文件,在文件搜索并修改“language=zh_CN”,保存之后再打开jmeter就永久变为中文环境了。
非GUI模式压测
在linux上部署好Jmeter后,把xxx.jmx脚本上传。
# 切换目录
cd /usr/laker/apache-jmeter-5.5/bin
# 执行脚本
./jmeter -n -t /usr/laker/apache-jmeter-5.5/go-laker.jmx -l /usr/laker/result/result.jtl -e -o /usr/laker/result/WebReport
/usr/laker/apache-jmeter-5.5/go-laker.jmx
:此路径是Jmeter脚本的绝对路径。
/usr/laker/result/result.jtl
: 运行脚本后生成的jtl结果。
/usr/laker/result/WebReport
:运行脚本成功后生成的html图形化报告的绝对路径,如果不需要此结果,删除“-e -o /usr/laker/result/WebReport”压缩
zip -r archive.zip folder/
参数说明:
-
-n: 非GUI模式执行JMeter
-
-t: 执行测试文件所在的位置
-
-l: 指定生成测试结果的保存文件,如:jtl文件格式,txt文件格式
-
-e: 测试结束后,生成测试报告
-
-o: 指定测试报告的存放位置
分布式压测
单机的 JMeter 最好将线程数控制在 1000 以内;如果超过了 1000 线程,则建议使用 JMeter 分布式压测,这在一定程度上可以解决 JMeter 客户端自身形成的瓶颈问题。
JMeter 的工作方式是一个控制节点在多个工作节点上发起测试。
-
控制器节点
运行 JMeter GUI 的系统,它控制测试
-
工作节点
运行jmeter-server 的系统,它从 GUI 获取命令并将请求发送到目标系统
-
目标
我们计划进行压力测试的网络服务器
重要重要重要
-
控制节点,工作节点,待压测节点要网络互通(互相ping下试试可通,小心防火墙挡住了)
-
控制节点,工作节点使用相同版本的JDK和Jmeter(非常重要)
-
控制节点,工作节点的
jmeter.properties
文件开启配置server.rmi.ssl.disable=true
-
工作节点单独运行No GUI的Jmeter测试是正常的。
-
工作节点上添加 远程工作节点IP地址,打开jmeter.properties配置
remote_hosts=192.168.0.10,192.168.0.11,192.168.0.12,192.168.0.13
-
详细文档:https://jmeter.apache.org/usermanual/jmeter_distributed_testing_step_by_step.html
1.启动单个工作节点
2.启动所有工作节点
常见错误
错误日志1
[root@localhost bin]# ./jmeter-server
Server failed to start: java.rmi.RemoteException: Cannot start. localhost is a loopback address.
An error occurred: Cannot start. localhost is a loopback address.
如果启动出现An error occurred: Cannot start. localhost is a loopback address报错
解决方案:指定启动ip
cd /usr/laker/apache-jmeter-5.5/bin
sh jmeter-server -Djava.rmi.server.hostname=x.x.x.x
# 或 nohup ./jmeter-server -Djava.rmi.server.hostname=10.22.66.10 &
错误日志2
ERROR o.a.j.e.ClientJMeterEngine: Error in rconfigure() method
java.lang.IllegalStateException: Engine is busy - please try later
...
解决方案:确保控制节点和所有的工作节点的JDK和jmeter版本要保证一致。
我上面的错误是JDK版本不一致导致。
正确的日志如下:
Created remote object: UnicastServerRef2 [liveRef: [endpoint:[10.2.66.197:39798 ](local),objID:[-243708a9:18831fb2c04:-7fff, -9195443886642911871]]]
Starting the test on host 10.224.76.197 @ May 19, 2023 3:09:09 AM GMT (1684465749583)
Finished the test on host 10.224.76.197 @ May 19, 2023 3:10:10 AM GMT (1684465810986)
监控
PerfMon插件:监控服务器硬件,如CPU,内存,硬盘读写速度等
监控指标如下:
硬件监控
- 磁盘读写速度 剩余量
- CPU使用率 大小
- 内存使用率 大小
- 网络读写速度
- 文件句柄数
系统监控
-
应用
- GC
- 连接请求数、拒绝数、丢包率、请求超时等
- 链路监控
- 业务监控 高并发下业务逻辑运行是否正常
- 线程数
-
数据库
- 慢查询
- 长事务
-
缓存
- 连接数
- 慢命令
- 缓存命中率
-
MQ
- 生产速度
- 消费速度
- 消息堆积量
注意哪些是进程级别,哪些是系统级别
模板
- Http模板
- Websocket模板