压力测试-Jmeter
jmeter是apache的一个开源项目,是Java语言构建的,用来进行功能测试和性能测试。
简单的说,jmeter可以做到:
-
可以测试相当多的不同的服务 协议 web ftp mail tcp等等
-
功能非常齐备的测试IDE
-
支持CLI模式
-
良好的多线程测试模式的支持
-
良好的测试报告,多样的维度展示测试结果
-
高扩展性,支持自定义测试取样
总的来说,Jmeter什么都可以测试,如果不能测试,那么你就自己加个插件。而且产生的报告质量是很高的。jmeter最好是使用最新的,毕竟都2020年了,对自己好一点。
安装
jmeter是java构建的,所以需要先安装java环境,自行搜索。jmeter-5.3要求java版本是1.8+
访问apache-jmeter主页 找到download页面,下载 apache-jmeter-5.3.zip
windows下双击bin/jmeter.bat
linux下运行/bin/jmeter
将/bin目录加入到系统的环境变量,便于执行后续命令。
能正常打开说明安装成功了
基本配置
-
将软件界面改为中文
-
选项 - 选择语言-中文 (这种重启后就变为英文了)
-
修改jmeter/bin/jmeter.properties 找到 language=cn 取消掉注释 修改为language=zh_CN(永久改变)
-
-
当最终报告显示有乱码时,可以试试修改下面的参数
-
当需要大量线程进行测试时,需要修改jmeter启动参数 修改bin/jmeter文件里的HEAP相关参数,相应的增加
-
jdk8默认线程大小是1m,当有大量线程时会由于内存过大造成线程创建失败,所以可以将该值适当减少,修改jmeter的启动配置参数,增加如下参数,适当修改。该值也可以加在HEAP或者JAVA_ARG里,只要生效就可以。
配置测试计划
创建普通线程组
在测试计划上添加线程组。
配置线程组的参数
关键参数说明
| 参数名 | 参数解释 |
|---|---|
| 线程数 | 并发线程的数量 |
| Ramp-Up 时间 | 在该时间内启动所有并发线程 比如线程数为10 该值设置为10s 表示 每一秒启动一个线程 10s结束后启动了10个线程 |
| 循环次数 | 每个线程对接口调用的次数 |
| 持续时间 | 调度器选择情况下, 指定压力测试持续多长时间 |
| 启动延迟 | 调度器选择情况下,指定延迟多久启动测试 |
创建用于阶梯压测的线程组
普通的线程组的并发数是指定好的,不能在一次测试过程中动态的改变,对于需要通过不断增加并发来分析系统瓶颈和拐点的需求我们可以使用 Concurrency Thread Group 插件来实现。
首先安装jmeter的插件管理器。下载地址:jmeter-plugins.org/wiki/Plugin…
解压后将其放入jmeter安装目录的/lib/ext路径下,然后重启。
然后安装 Concurreny Thread Group 插件,
打开插件管理器。选项-Plugins Manager
在Avaliable Plugins搜搜Custom Thread Gourps,勾选应用即可。或者直接下载jar包放到jmeter安装目录/lib/ext里。
添加阶梯压测线程组:
关键参数说明
| 参数名 | 参数含义 |
|---|---|
| Target Concurrenry | 最终并发数 |
| ramp-up | 达到最终并发数用时 |
| ramp-up step count | 达到最终并发数需要的步数 |
| hold target time | 保持最终并发数的时间 |
可以从图中很清晰的看到随时间变化线程数的变化。
添加取样器
添加取样器。取样器实际就是测试服务的具体功能,有HTTP、LDAP、TCP等多种取样器,用户还可以开发自定义的取样器。
配置HTTP请求。
添加断言
添加断言。断言是用来说明请求成功的标准。这里我们添加响应断言。
对于http请求,可以认为返回状态码200就是成功的。也可以根据自己的具体的请求结果进行指定。
添加监听器
添加监听器,用于查看响应结果和各种统计。
保存测试计划,点击运行执行测试计划。可以查看测试结果。
添加元件
元件用于指定一次测试中的通用配置,比如HTTP信息头、HTTP的cookie信息等,在测试中,我们一般会对请求使用不同的参数,来模拟真实的访问情况,
那么我们可以使用CSV Data Set Config这个元件。
比如我们请求中需要id和name两个参数,那么我们首先准备一个data文件,具体内容为:
然后在CSV数据设置中进行相应的设置。变量名称处填写相应的名称,分隔符要和data文件中的一致。
在请求中使用:
执行测试
在命令行启动jmeter时会有提示:
Don't use GUI mode for load testing !, only for Test creation and Test debugging.
For load testing, use CLI Mode (was NON GUI):
jmeter -n -t [jmx file] -l [results file] -e -o [Path to web report folder]
& increase Java Heap to meet your test requirements:
Modify current env variable HEAP="-Xms1g -Xmx1g -XX:MaxMetaspaceSize=256m" in the jmeter batch file
Check : https://jmeter.apache.org/usermanual/best-practices.html
大意是使用GUI模式仅用于配置测试计划,真正的测试一定要在CLI模式下运行。
测试计划保存后是一个jmx文件,比如test.jmx。
准备好后在命令行里执行
jmeter -n -t test.jmx -l test.jtl
测试启动后会持续的输出一些信息。
summary + 2228700 in 00:00:30 = 74299.9/s Avg: 176 Min: 20 Max: 1414 Err: 0 (0.00%) Active: 7444 Started: 7444 Finished: 0 比如这一行,表示在30s时间内完成了2287000次请求,吞吐量为74299.9,Avg Min Max分别表示平均耗时 最低耗时和最高耗时。后面的Active Started Finished表示线程的信息。 生成了测试结果文件后,就可以生成web报告了。
jmeter -g 测试结果文件 -o 文件夹路径
jmeter -g report.jtl -o report/
完成后就可以打开report文件夹下的index.html看详细的记录了。
集群测试
有时候测高并发时单台测试机会成为测试瓶颈,这时就改使用集群进行测试。
集群测试需要使用一台控制机,若干台测试机。控制机称为client,测试机称为server
首先修改每一台server机器里的jmeter目录/bin/jmeter.properties,将里面的#server.rmi.ssl.disable=false 取消注释,同时改为true
# Set this if you don't want to use SSL for RMI
#server.rmi.ssl.disable=false
server.rmi.ssl.disable=true 改为true 取消注释
然后启动所有的server机器。
jmeter-server -Djava.rmi.server.hostname=本机ip
启动成功后输出如下消息。
然后配置client机器。
修改jmeter.properties文件,添加remote机器。
# Remote Hosts - comma delimited
remote_hosts=192.168.1.1:1099,192.168.1.2:1099 //多台server机器
#remote_hosts=localhost:1099,localhost:2010
client机器会将jmx测试脚本传递给所有的server,测试启动后,server会将数据传输给client,用于最终的报告。
运行命令:
jmeter -n -t test.jmx -R 192.168.1.1 -l test.jtl //-R表示指定某些server进行测试
jmeter -n -t test.jmx -r -l test.jtl //-r 表示启动所有server机
参考资料
https://www.cnblogs.com/shenh/p/10288868.html