图文详解压力测试工具JMeter的安装与使用
压力测试是目前大型网站系统的设计和开发中不可或缺的环节,通常会和容量预估等工作结合在一起,穿插在系统开发的不同方案。压力测试可以帮助我们及时发现系统的性能短板和瓶颈问题,在这个基础在上再进行针对性的性能优化,也可以帮助我们预估系统的承载能力,使我们能根据其做出一些应对措施。
JMeter简介
![图文详解压力测试工具JMeter的安装与使用](https://www.isolves.com/d/file/p/2020/07-21/6d312772d9a89a3cf83b29658ddb0f5c.jpg)
JMeter是一个使用JAVA开发的Apache开源软件,用于软件的性能评估和压力测试。它最初是为测试Web应用程序而设计的,但此后又扩展到其他测试功能。
JMeter可用于静态和动态资源、Web动态应用程序的性能测试,例如:HTTP、 HTTPS、LDAP、TCP、FTP、SMTP、POP3、IMAP、Shell脚本、数据库、Java 对象,也可以用于对服务器、服务器组、网络或对象上的巨大负载,以测试在不同强度的压力测试下它们的强度和整体性能。
另外,JMeter还可以对应用程序做功能回归测试,通过创建带有断言的脚本来验证你的程序是否返回了你期望的结果。为了最大限度的灵活性,JMeter还支持使用正则表达式创建断言。
下载JMeter
访问JMeter的官网:https://jmeter.apache.org/download_jmeter.cgi,下载最新版本的JMeter,如下图:
![图文详解压力测试工具JMeter的安装与使用](https://www.isolves.com/d/file/p/2020/07-21/21bf328a57c96879c4a72cfb9c59bcb5.jpg)
运行JMeter
在运行JMeter之前,需要安装JDK8,详细安装步骤见图文详解在windows系统中安装JDK。
解压压缩包以后,进入bin目录,双击运行jmeter.bat,首先启动一个CMD窗口,如下图:
![图文详解压力测试工具JMeter的安装与使用](https://www.isolves.com/d/file/p/2020/07-21/60f1f597f7bd806a354e0a4da0caa88a.jpg)
然后又启动了JMeter的GUI,如下图:
![图文详解压力测试工具JMeter的安装与使用](https://www.isolves.com/d/file/p/2020/07-21/ea758b2d50cba1a84dafe8dd0f28edaf.jpg)
其中,注意CMD窗口中的提示:
================================================================================
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运行压力测试!GUI仅用于压力测试的创建和调试。执行压力测试使用CLI模式,就是非GUI。使用下面的命令来执行测试:
jmeter -n -t [jmx file] -l [results file] -e -o [Path to web report folder]
并且在批处理文件中修改当前环境变量:
HEAP="-Xms1g -Xmx1g -XX:MaxMetaspaceSize=256m"
JMeter默认是英文的,也可以修改为简体中文,通过点击Options->Choose Language进行修改,如下图:
![图文详解压力测试工具JMeter的安装与使用](https://www.isolves.com/d/file/p/2020/07-21/a401b05f72242d1e6af56cb3d426a38f.jpg)
创建第一个压力测试
为了演示写了一个网站,URL为http://127.0.0.1:8080/hello,当QPS大于100时HTTP状态码返回429(使用 Alibaba Sentinel实现 )。
1.添加线程组
右键测试计划,点击添加-->线程(用户)-->线程组,如下图:
![图文详解压力测试工具JMeter的安装与使用](https://www.isolves.com/d/file/p/2020/07-21/9eb720a62d4d553978cbcbf385f27d67.jpg)
设置线程数为10,Ramp-Up时间(秒)为10,循环次数为100,如下图:
![图文详解压力测试工具JMeter的安装与使用](https://www.isolves.com/d/file/p/2020/07-21/de224b8afeb88b3a3bf20614ad76aa30.jpg)
线程数:一个用户占一个线程, 10个线程就是模拟10个用户。
Ramp-Up时间(秒): 设置线程需要多长时间全部启动。如果线程数为10 ,准备时长为10 ,那么需要1秒钟启动1个线程。也就是每秒钟启动1个线程。
循环次数:每个线程发送请求的次数。如果线程数为10 ,循环次数为100 ,那么每个线程发送100次请求。总请求数为10*100=1000 。如果勾选了“永远”,那么所有线程会一直发送请求,直到选择停止运行脚本。
2.添加元件
右键线程组,点击添加-->配置元件-->HTTP请求默认值,如下图:
![图文详解压力测试工具JMeter的安装与使用](https://www.isolves.com/d/file/p/2020/07-21/e3f59a0a0459973ab99dc8ccdfa640de.jpg)
设置协议为HTTP,服务器名称或IP为127.0.0.1,端口号为8080,如下图:
![图文详解压力测试工具JMeter的安装与使用](https://www.isolves.com/d/file/p/2020/07-21/724b957be20d072f84ac6ce81fade2a0.jpg)
当所有测试的访问域名和端口都一样时,可以使用该元件,一旦服务器地址或端口变更,只需要修改该HTTP请求默认值即可。
3.添加取样器
右键线程组,点击添加-->取样器-->HTTP请求,如下图:
![图文详解压力测试工具JMeter的安装与使用](https://www.isolves.com/d/file/p/2020/07-21/b0e48709843fbccc653660a93005ffcd.jpg)
设置请求类型为GET,路径为/hello,如下图:
![图文详解压力测试工具JMeter的安装与使用](https://www.isolves.com/d/file/p/2020/07-21/4bcefa7a077472151455eb0168926ace.jpg)
4.添加响应断言
右键线程组,点击添加-->断言-->响应断言,如下图:
![图文详解压力测试工具JMeter的安装与使用](https://www.isolves.com/d/file/p/2020/07-21/5228d56ed69867ce497ee6db359e01af.jpg)
设置测试字段为响应代码,模式匹配规则为相等,测试模式添加200,如下图:
![图文详解压力测试工具JMeter的安装与使用](https://www.isolves.com/d/file/p/2020/07-21/46b54c22d6829ca4d87d28131b25d3c1.jpg)
5.添加察看结果树
右键线程组,点击添加-->监听器-->察看结果树,如下图:
![图文详解压力测试工具JMeter的安装与使用](https://www.isolves.com/d/file/p/2020/07-21/228fc9909199a3d31410a7f17b984c83.jpg)
6.添加汇总报告
右键线程组,点击添加-->监听器-->汇总报告,如下图:
![图文详解压力测试工具JMeter的安装与使用](https://www.isolves.com/d/file/p/2020/07-21/f61c772a7ef5238395ceb9e435fe3ad3.jpg)
7.启动压力测试
先点击保存按钮,把测试计划保存起来。然后点击启动按钮,如下图:
![图文详解压力测试工具JMeter的安装与使用](https://www.isolves.com/d/file/p/2020/07-21/3088f87e7a1d3b107d3b9a02c62f2a2e.jpg)
测试计划就跑起来了。
8.查看报告
察看结果树,请求成功的,如下图:
![图文详解压力测试工具JMeter的安装与使用](https://www.isolves.com/d/file/p/2020/07-21/45b4e69faa8c556dd6c14b487c9c0377.jpg)
察看结果树,请求失败的(QPS过高,被Alibaba Sentinel限流),如下图:
![图文详解压力测试工具JMeter的安装与使用](https://www.isolves.com/d/file/p/2020/07-21/ebd26f4389d897c685044e5ab5582373.jpg)
再看一下汇总报告,如下图:
![图文详解压力测试工具JMeter的安装与使用](https://www.isolves.com/d/file/p/2020/07-21/12f90dfb704d2d75be4dd449046bf6be.jpg)
9.执行测试计划
前面提到执行测试计划不能使用GUI,必须使用CLI模式,执行以下命令:
jmeter -n -t ../plan/万猫学社.jmx -l ../plan/result.txt -e -o ../plan/webreport
其中,../plan/万猫学社.jmx为测试计划文件,../plan/result.txt为测试结果文件,../plan/webreport为web报告目录。
执行过程如下图:
![图文详解压力测试工具JMeter的安装与使用](https://www.isolves.com/d/file/p/2020/07-21/8c58fd9b8fdd550c5a646c19e3539570.jpg)
最后生成的网页报告如下图:
![图文详解压力测试工具JMeter的安装与使用](https://www.isolves.com/d/file/p/2020/07-21/a390911212a5869d92f0953b7bd3b4e5.jpg)
使用CSV参数化
为了演示对之前的网站进行增强,URL为http://127.0.0.1:8080/hello/{name},其中{name}是一个参数,所以URL可以是http://127.0.0.1:8080/hello/Lucy,也可以是http://127.0.0.1:8080/hello/Lily,同样当QPS大于100时HTTP状态码返回429(也是使用 Alibaba Sentinel实现 )。
1.创建CSV文件
创建一个文本文件,内容为:
1,Alice
2,Eva
3,Jane
4,Lily
5,Lucy
分别为5行,每行分别是id和名称,用英文逗号分隔。然后,对之前的测试计划进行修改。
2.创建CSV Data Set Config
右键线程组,点击添加–>配置元件–>CSV Data Set Config,如下图:
![图文详解压力测试工具JMeter的安装与使用](https://www.isolves.com/d/file/p/2020/07-21/717af23c6d57b338b294508855af284f.jpg)
文件名称填入刚刚创建的文件,文件编码选择UTF-8,变量名称输入id,name,分别表示与文本文件中每一行的id和name两个变量,如下图:
![图文详解压力测试工具JMeter的安装与使用](https://www.isolves.com/d/file/p/2020/07-21/a211154175d126170a8aae39b926071a.jpg)
3.修改HTTP请求
修改之前的HTTP请求中的路径为/hello/${name},如下图:
![图文详解压力测试工具JMeter的安装与使用](https://www.isolves.com/d/file/p/2020/07-21/f155ed3ed9edb15ef32b04888ab96e39.jpg)
4.查看报告
启动测试计划,可以在察看结果树中看到URL的路径已经被替换了,如下图:
![图文详解压力测试工具JMeter的安装与使用](https://www.isolves.com/d/file/p/2020/07-21/6da2b2ee20aef762e87e87c34fcc417c.jpg)
使用HTTP请求参数化
为了演示对之前的网站新增一个接口,URL为http://127.0.0.1:8080/getName,该接口会随机返回上述文本文件中某个名字,返回格式为JSON,例如:
{"id":1, "name":"Alice"}
对之前的测试计划再进行修改:
1.添加HTTP请求
右键线程组,点击添加–>取样器–>HTTP请求,添加一个新的HTTP请求,名称设置为HTTP请求-getName,路径设置为/getName。为了区分把之前添加的HTTP请求的名称修改为HTTP请求-hello,如下图:
![图文详解压力测试工具JMeter的安装与使用](https://www.isolves.com/d/file/p/2020/07-21/fc328e7848ad7d6690ffa2f535ee441d.jpg)
2.添加JSON提取器
右键HTTP请求-getName,点击添加–>后置处理器–>JSON提取器,如下图:
![图文详解压力测试工具JMeter的安装与使用](https://www.isolves.com/d/file/p/2020/07-21/26eb497c959dabbc761ae0dfe6f86ae2.jpg)
- Names of created variables是创建变量的名字,要和HTTP请求-hello的路径/hello/${name}保持一致,所以设置为name。
- JSON Path expressions是需要提取的key,参照getName接口返回的JSON字符串,设置为$.name。
- Match No.是在JSON中同样的key取第几个,这里设置为1。
- Default Values是没有找到key时的默认值,这里设置为OneMore。
最终配置如下图:
![图文详解压力测试工具JMeter的安装与使用](https://www.isolves.com/d/file/p/2020/07-21/0918364eae430c6ef1e60f83cc7fef34.jpg)
4.查看报告
启动测试计划,可以在察看结果树中看到一次getName返回的name是Lily,如下图:
![图文详解压力测试工具JMeter的安装与使用](https://www.isolves.com/d/file/p/2020/07-21/1df97797c1895750c4e46388f64b368b.jpg)
接下来,调用hello接口时传入的参数就为Lily,所以返回的就是Hello, Lily,如下图:
![图文详解压力测试工具JMeter的安装与使用](https://www.isolves.com/d/file/p/2020/07-21/67beeaa6ede4e578e10c2f0b73ad4fc5.jpg)
总结
JMeter的功能很强大,还有很多值得大家继续挖掘的。不过,你如果掌握了本文所讲述的功能,基本上可以应付一般的Web压测了。