软件下载地址: https://mirrors.tuna.tsinghua.edu.cn/apache/jmeter/binaries/
选择一个压缩包下载即可
然后解压缩后进入bin目录直接执行命令jmeter即可启动
jmeter内置的常用的插件不是很多,如果要额外安装其他插件需要先下载一个插件安装工具的jar包然后放到jmeter的目录下才能使用插件安装工具的功能。
2) 下载jar包之后放到 jmeter的 /lib/ext
目录下,重启Jmeter即可。
推荐勾选: 带jpgc相关的插件,可以做梯度增压
由于压测是通过Jmeter这个Java程序去跑的,所以压测的性能和能开启的线程数量都与这个程序本身运行的环境以及配置有关。 一般Jmeter部署在服务器那边性能会更强。
修改jmeter的 /bin/jmeter
文件 (mac环境),如果是window修改 jmeter.bat
。 修改下图的这一行就是调整堆内存信息
${HEAP:=“-Xms1g -Xmx8g -XX:MaxMetaspaceSize=656m”}
验证是否修改成功,重启使用jconsole工具连接Jmeter进程查看jvm信息即可看到是否修改成功。 或者使用jps命令查看进程号然后再jmap命令查看堆内存分配情况。
默认打开的界面如下, 一份测试计划就是一份jmx文件,点击保存就会弹出保存地址。 测试计划就是包含此次做压测的所有信息。 支持导入导出。
异常信息
用户自定义变量
${host}
即可。默认支持的配置元件列表,主要作用就是配置我们压测接口的一些参数配置
操作
: 右键点击测试计划-》 添加-》 配置元件-》 Http请求默认值组件
作用
:
比如下图配置默认的http协议,以及默认的域名。 这里的域名配置就使用我们前面配置的全局变量 ${host}
了
操作
: 右键点击测试计划-》 添加-》 配置元件-》 HTTP信息头管理器
作用
:
Http请求默认值
配置元件类似,都是配置压测接口的请求默认值。 不过这个元件就像其名字一样配置的是默认的Http请求头信息,这样压测接口就不用再配置Http请求头信息默认会带上Content-Type
和 Cookie
。 尤其是Cookie
请求头 这样即使是登录接口也能进行调通。操作
: 右键点击测试计划-》 添加-》 配置元件-》 CSV Data Set Config
作用
:
具体配置如下:
{变量名称}
。 比如下面配置使用格式就是 {userName}
.线程组就是用来模拟并发的数量以及并发的行为。 比如你是要启动10个并发还是100个并发去压测接口就是通过这个组件。并且启动压测程序其实就是通过启动我们的线程组的执行压测。
自带带的线程组如下,其中带gc的使我们添加插件后才有的。 不同的线程组的区别就是设置的并发行为不同
。
操作
: 右键点击测试计划-》 添加-》 线程-》 线程组
作用
:
具体该配置的并发行为可以用下图来形象的表示。 可以看到一开始是0个并发,然后随着时间增加不短增加并发,最终在第5秒达到最大并发20,然后就一直20个并发一直执行。
操作
: 右键点击测试计划-》 添加-》 线程-》 jp@gc - Stepping Thread Group
作用
:
具体配置对应的语义和并发行为如下图所示:
this goup will start语义
: 表示最多启动多大线程。对应图中的峰顶的值first wait for语义:
从运行之后多长时间开始启动线程;若设置为60秒, 对应图中开头的底部横线。then start语义:
表示第一次要启动几个线程。 对应图中第一个上升线。next add语义 + threads every 语义:
表示每隔多少秒启动多少个线程。对应图中的上升梯度线。 using ramp-up 语义:
其中与普通线程组一样表示启动线程的时间。 对应图中的上升梯度线的斜度,越大越斜表示用的时间越久。then hold load for语义:
表示达到最大线程后保持最大线程持续执行多久。 对应图中的峰顶的横线。finally sotp + threads every语义:
达到峰顶后,表示每隔多少秒释放多个线程。 对应图中的下降梯度线。如果说线程组就是我们Java的线程池,那么取样器就相当于我们线程池要执行的Runnable任务。比如我们要压测哪个接口就可以配置成取样器。
自带取样器如下
操作
: 右键线程组-》 添加-》取样器-》 Http请求
作用
: 主要就是用来配置Http接口的信息,包括请求域名,端口,接口路径、接口参数等等。 有了它就可以发起请求。
此处压测的接口代码逻辑: 模拟执行时间是500ms
@GetMapping
public String getA1(){
try {
Thread.sleep(500);
} catch (InterruptedException e) {
throw new RuntimeException(e);
}
return "33";
}
1、在测试计划下面添加线程组,设置100个并发,持续执行600秒。
2、添加压测的接口
添加http取样器,并且配置接口信息
3、添加接口执行结果监听器
操作
: 右键线程组-》添加-》监听器-》查看结果树。
这样我们接口是否调通以及返回结果都可以看到
4、添加压测接口汇总报告
操作
: 右键线程组-》添加-》监听器-》汇总报告。
这样看到这个线程组压测的统计报告,包括吞吐量TPS、响应时间、是否异常,网络请求量,执行次数。
5、添加吞吐量TPS实时统计图(可忽略)
操作
: 右键线程组-》添加-》监听器-》jp@gc - Transactions per Second。
这样就可以监测吞吐量的实时变化情况。
5、添加响应时间实时统计图(可忽略)
操作
: 右键线程组-》添加-》监听器-》jp@gc - Response Times Over Time
这样就可以监测接口响应时间的实时变化情况。
5、添加激活线程实时统计图(可忽略)
操作
: 右键线程组-》添加-》监听器-》jp@gc - Active Threads Over Time
这样就可以监测线程组的并发行为,因为线程组的组件有很多,如果不是非常熟悉可能都不知道自己配置的线程组正在模拟什么样的并发行为。
7、启动线程组执行压测
操作
: 右键线程组-》启动
原理
: 线程组会去并发执行线程组下面配置的所有取样器(这里只添加了一个还可添加多个)
最后我们看下各部分压测结果:
1、首先是接口执行情况:
2、看一下压测汇总报告统计
可以看到样本数就是总共请求的数量, 平均值就是平均响应时间(单位是毫秒)结果跟我们接口代码逻辑还是一致的,最小值和最大值也是接口响应时间。 异常率就是接口调不通(吞不下)的概率。 吞吐量就是每秒能处理168个请求。
3、看一下吞吐量变化情况
随着并发数增加,最终一直维持在180到200的吞吐量之间
1、新建一个CSV文件,里面放我们不同的请求参数,比如内容为
userId,userName
1, zhangShan
2, liSi
3, xaioming
2、新增CSV 数据文件设置组件
将我们刚才新增的csv文件路径配到这里,然后配置变量名,并且设置忽略首行(因为我们的csv文件内容首行不是请求参数)
3、在Http取样器里面直接使用变量即可。
请求参数要使用变量地方就用{}
包起来就行。
原理就是请求的时候会去随机读取该文件的的这个字段的值从而达到模拟不同请求参数的效果
这个看你们的登录验证逻辑,假如我们的登录信息是放在cookies里面,那么我们就可以添加HTTP信息头管理器,然后在里面配置cookie请求头信息。只要把我们的登录cookies放进去就可以执行成功。
缺点就是cookie失效后每次要重新配置,具体还有其他更自动化的解决方法
接口配置那选择文件上传, 配置配置具体的配置路径即可。会去读取上传。 然后参数名称写死file就行。 然后MIME根据具体来。 一般是application/octet-stream 或者 multipart/form-data即可。
如果要模拟上传不同的文件,同上面模拟不同请求参数一样,这里用变量填充代表文件路径即可。
之前我们是通过本地Jmeter的GUI界面去进行压测的。但是官方不建议压测通过GUI模式去跑,而是使用CLI命令行的模式去跑压测。 所以我们得先准备测试计划文件.jmx
, 然后使用jmeter的命令去跑测试计划。最终会将测试计划的结果报告保存到指定的文件。
具体命令:
jmeter -n -t [xxx.jmx] -l [results file] -e -o [Path to web report folder]
其实细心的可能会发现我们启动jmeter的日志输出默认就是告诉我们应该这样做
具体的官方文档: https://jmeter.apache.org/usermanual/best-practices.html
以下是我的执行命令案例:
jmeter -n -t 1.1版本xx测试计划.jmx -l result.txt -e -o report
(base) ➜ tmp6 ll
-rw-r--r--@ 1 burukeyou staff 16K 11 23 14:19 1.1版本xx测试计划.jmx
(base) ➜ tmp6 jmeter -n -t 1.1版本xx测试计划.jmx -l result.txt -e -o report
Creating summariser <summary>
Created the tree successfully using 1.1版本xx测试计划.jmx
Starting standalone test @ November 23, 2023 2:21:03 PM CST (1700720463057)
Waiting for possible Shutdown/StopTestNow/HeapDump/ThreadDump message on port 4445
summary + 1 in 00:00:01 = 1.6/s Avg: 556 Min: 556 Max: 556 Err: 0 (0.00%) Active: 13 Started: 13 Finished: 0
summary + 299 in 00:00:06 = 50.9/s Avg: 509 Min: 504 Max: 556 Err: 0 (0.00%) Active: 0 Started: 100 Finished: 100
summary = 300 in 00:00:07 = 46.0/s Avg: 510 Min: 504 Max: 556 Err: 0 (0.00%)
Tidying up ... @ November 23, 2023 2:21:09 PM CST (1700720469740)
... end of run
(base) ➜ tmp6 ll
total 216
-rw-r--r--@ 1 burukeyou staff 16K 11 23 14:19 1.1版本xx测试计划.jmx
-rw-r--r-- 1 burukeyou staff 44K 11 23 14:21 jmeter.log
drwxr-xr-x 6 burukeyou staff 192B 11 23 14:21 report
-rw-r--r-- 1 burukeyou staff 41K 11 23 14:21 result.txt
可以发现跑完压测报告后最终在生成了result.txt文件和report目录,进入report目录找到index.html浏览器打开即可看到报告如下
jmeter -n -t [xxx.jmx] -l [results file]
执行压测也可不指定 Path to web report folder参数
。 只生成 results file. 然后通过 jmeter -g result.txt -o output
命令使用结果文件去生成Html报告。
比如:
(base) ➜ tmp6 ll
total 136
-rw-r--r--@ 1 burukeyou staff 16K 11 23 14:19 1.1版本xx测试计划.jmx
-rw-r--r-- 1 burukeyou staff 5.3K 11 23 14:26 jmeter.log
-rw-r--r--@ 1 burukeyou staff 41K 11 23 14:21 result.txt
(base) ➜ tmp6 jmeter -g result.txt -o output
(base) ➜ tmp6 ll
total 152
-rw-r--r--@ 1 burukeyou staff 16K 11 23 14:19 1.1版本xx测试计划.jmx
-rw-r--r-- 1 burukeyou staff 14K 11 23 14:29 jmeter.log
drwxr-xr-x 6 burukeyou staff 192B 11 23 14:29 output
-rw-r--r--@ 1 burukeyou staff 41K 11 23 14:21 result.txt
如果看压测的每个请求结果响应类似GUI界面那样,可以在jmeter的GUI界面的查看结果树组件的浏览那里导入结果文件即可。