Apache JMeter是Apache组织开发的基于Java的压力测试工具.它可以用于测试静态和动态资源,例如静态文件、Java 小服务程序、CGI 脚本、Java 对象、数据库、FTP 服务器, 等等。JMeter 可以用于对服务器、网络或对象模拟巨大的负载,来自不同压力类别下测试它们的强度和分析整体性能。另外,JMeter能够对应用程序做功能/回归测试,通过创建带有断言的脚本来验证你的程序返回了你期望的结果。为了最大限度的灵活性,JMeter允许使用正则表达式创建断言。
Jmeter的作用
1.能够对HTTP和FTP服务器进行压力和性能测试, 也可以对任何数据库进行同样的测试(通过JDBC)。
2.完全的可移植性和100% 纯java。
3.完全 Swing 和轻量组件支持(预编译的JAR使用 javax.swing.)包。
4.完全多线程 框架允许通过多个线程并发取样和 通过单独的线程组对不同的功能同时取样。
5.精心的GUI设计允许快速操作和更精确的计时。
6.缓存和离线分析/回放测试结果。
*
JMeter的高可扩展性**
1.可链接的取样器允许无限制的测试能力。
2.各种负载统计表和可链接的计时器可供选择。
3.数据分析和可视化插件提供了很好的可扩展性以及个性化。
4.具有提供动态输入到测试的功能(包括Javascript)。
5.支持脚本编程的取样器(在1.9.2及以上版本支持BeanShell)。

JDK

Jmeter使用,需要依赖JDK1.8,可前往官网进行下载

1
2
3
归档版:
https://www.oracle.com/java/technologies/javase/javase8-archive-downloads.html
#最好不采用最新版本的JDK进行使用

这里使用自己下载好的下载链接

1
2
https://nmk0718.com.com/jdk/jdk-8u181-windows-x64.exe
https://nmk0718.com.com/jdk/jdk-8u181-linux-x64.tar.gz

windows安装JDK

双击下载好的exe一直下一步即可

配置环境变量:右键我的电脑>属性>高级系统设置>环境变量

新增用户变量

1
2
3
4
5
6
7
8
变量名:JAVA_HOME
变量值:C:\Program Files\Java\jdk1.8.0_181

变量名:CLASSPATH
变量值:.;%JAVA_HOME%\lib\dt.jar;%JAVA_HOME%\lib\tools.jar

变量名:Path
变量值:%JAVA_HOME%\bin;%JAVA_HOME%\jre\bin;

通过cmd查看是否已经配置完成

linux安装JDK

1
2
3
4
5
6
7
8
9
10
11
12
13
[root@centos ~]# cd /usr/local/
[root@centos local]# wget https://nmk0718.com.com/jdk/jdk-8u181-linux-x64.tar.gz
--2021-03-19 11:00:06-- https://nmk0718.com.com/jdk/jdk-8u181-linux-x64.tar.gz
Resolving nmk0718.com.com (nmk0718.com.com)... 119.130.113.242
Connecting to nmk0718.com.com (nmk0718.com.com)|119.130.113.242|:443... connected.
HTTP request sent, awaiting response... 200 OK
Length: 185646832 (177M) [application/octet-stream]
Saving to: ‘jdk-8u181-linux-x64.tar.gz’

100%[================================================================================================================================================================>] 185,646,832 57.6MB/s in 3.1s

2021-03-19 11:00:09 (57.6 MB/s) - ‘jdk-8u181-linux-x64.tar.gz’ saved [185646832/185646832]
[root@centos local]# tar zxvf jdk-8u181-linux-x64.tar.gz

配置环境变量

1
2
3
4
5
6
7
8
9
10
[root@centos local]# vi /etc/profile
输入大写的G,到达文本的最后,输入i进入编辑模式加入以下配置,按esc键盘退出编辑模式,输入:wq保存并退出
JAVA_HOME=/usr/local/jdk1.8.0_181
CLASSPATH=$CLASSPATH:$JAVA_HOME/lib/
PATH=$PATH:$JAVA_HOME/bin
[root@centos local]# source /etc/profile
[root@centos local]# java -version
java version "1.8.0_181"
Java(TM) SE Runtime Environment (build 1.8.0_181-b13)
Java HotSpot(TM) 64-Bit Server VM (build 25.181-b13, mixed mode)

windows

官网下载地址

1
https://mirrors.bfsu.edu.cn/apache//jmeter/source/

下载

1
wget https://mirrors.tuna.tsinghua.edu.cn/apache/jmeter/binaries/apache-jmeter-5.2.zip

解压jmeter包,进入apache-jmeter-5.2\bin目录双击jmeter.bat

界面更改语言为简体中文(此次生效)

修改jmeter.properties文件中的#language=en为language=zh_CN,就可以实现永久中文界面了

虚拟用户压测

添加线程组

配置线程数和时间

线程数:配置几个就代表有几个虚拟用户

Ramp-Up 时间(秒):表示从第一个虚拟用户开始生成直到最后一个虚拟用户开始生成的时间,加入配置了5个虚拟用户,Ramp-Up 设置成10s,那么jmeter会每隔2s生成1个虚拟用户,这个选项主要的作用是控制并发的强度,不让虚拟用户在同一时间产生从而对系统造成多大的复杂,Ramp-Up设置成0,那么所有用户将会同时立即产生

循环数:要么是N次,要么是永远

调度器:就是定时执行的设置方式。我们可以设置在未来的某个时间开始执行也可以设置多少秒后开始执行。

添加HTTP请求

配置请HTTP请求

添加结果树和聚合报告

配置HTTP信息头

执行请求

聚合报告中可查看到请求总数,异常数,吞吐量等

查看结果树中可查看到请求的接口返回结果

点击清除按钮,清除上次执行请求的结果

保存测试计划,保存后格式为jmx

真实用户参数化压测

模拟多用户请求

配置CSV数据文件

浏览中引入定义的CSV文件,指定文件的编码格式为UTF-8,定义变量名{phone,code},变量名称个数与CSV中的列数相对应,变量名以逗号分隔

CSV数据示例

更改HTTP请求中的请求数据为参数化,把请求的手机号和二维码信息配置为上面定义的参数,参数格式为${参数}

添加表格查看结果

压测请求后,可看到具体请求时间,请求时间,连接大小等参数

修改jmeter启动内存

修改jmeter.bat文件

1
2
3
4
修改前:
HEAP=-Xms1g -Xmx1g -XX:MaxMetaspaceSize=256m
修改后
HEAP=-Xms1024m -Xmx2048m -XX:MaxMetaspaceSize=600m

启动meter.bat,发现弹窗里出现的还是256m,经检测发现该弹窗内显示的只是引导语,类似欢迎你,是写死的,不是真实的配置

可使用java中的jconsole(jdk\bin\jconsole.exe)查看真实的内存配置

连接本地的Jmeter进程,选择VM概要可查看到真实的内存配置

Linux

官网下载地址

1
https://mirrors.bfsu.edu.cn/apache//jmeter/source/

下载

1
wget https://mirrors.tuna.tsinghua.edu.cn/apache/jmeter/binaries/apache-jmeter-5.2.zip

解压jmeter包

1
unzip apache-jmeter-5.2.zip

配置环境变量

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
#编辑系统环境变量
[root@centos ~]# vi /etc/profile
#使用快捷键 shift+g 到最后一行,加入以下配置
#JMETER_HOME为jmeter解压目录

export JMETER_HOME=/usr/local/apache-jmeter-5.2
export CLASSPATH=$JMETER_HOME/lib/ext/ApacheJMeter_core.jar:$JMETER_HOME/lib/jorphan.jar:$CLASSPATH
export PATH=$JMETER_HOME/bin:$PATH

#使加入的环境变量生效
[root@centos ~]# source /etc/profile

#查看jmeter版本,验证安装成功
[root@centos ~]# jmeter -v
Mar 12, 2021 11:40:02 AM java.util.prefs.FileSystemPreferences$1 run
INFO: Created user preferences directory.
_ ____ _ ____ _ _ _____ _ __ __ _____ _____ _____ ____
/ \ | _ \ / \ / ___| | | | ____| | | \/ | ____|_ _| ____| _ \
/ _ \ | |_) / _ \| | | |_| | _| _ | | |\/| | _| | | | _| | |_) |
/ ___ \| __/ ___ \ |___| _ | |___ | |_| | | | | |___ | | | |___| _ <
/_/ \_\_| /_/ \_\____|_| |_|_____| \___/|_| |_|_____| |_| |_____|_| \_\ 5.2

Copyright (c) 1999-2019 The Apache Software Foundation

上传windows保存的测试计划.jmx文件到jmeter的bin目录下

1
2
3
4
5
6
7
8
9
[root@centos bin]# pwd
/home/apache-jmeter-5.2/bin
[root@centos bin]# ls
ApacheJMeter.jar create-rmi-keystore.sh jaas.conf jmeter.properties krb5.conf report-template stoptest.sh user.properties
BeanShellAssertion.bshrc examples jdk-8u281-linux-x64.tar.gz jmeter-server log4j2.xml rmi_keystore.jks system.properties utility.groovy
BeanShellFunction.bshrc hc.parameters jmeter jmeter-server.bat mirror-server saveservice.properties templates wget-log
BeanShellListeners.bshrc heapdump.cmd jmeter.bat jmeter.sh mirror-server.cmd shutdown.cmd threaddump.cmd
BeanShellSampler.bshrc heapdump.sh jmeter-n.cmd jmeter-t.cmd mirror-server.sh shutdown.sh threaddump.sh
create-rmi-keystore.bat HttpRequest.jmx jmeter-n-r.cmd jmeterw.cmd reportgenerator.properties stoptest.cmd upgrade.properties

执行测试计划

1
2
3
4
5
6
7
8
9
10
11
12
13
[root@centos bin]# jmeter -n -t HttpRequest.jmx -l request.log
Creating summariser <summary>
Created the tree successfully using HttpRequest.jmx
Starting standalone test @ Mon Mar 15 16:34:43 CST 2021 (1615797283522)
Waiting for possible Shutdown/StopTestNow/HeapDump/ThreadDump message on port 4445
summary = 10 in 00:00:02 = 5.3/s Avg: 1490 Min: 1343 Max: 1636 Err: 0 (0.00%)
Tidying up ... @ Mon Mar 15 16:34:46 CST 2021 (1615797286014)
... end of run

#因jmx文件和执行命令相同,故无须指定jmx的绝对路径,当执行命令与jmx不在同一目录下时,需要指定绝对路径
#-n:以NoGUI方式运行脚本 -t:后面接脚本名称 -l:后面接日志名称,保存运行结果
#注意:客户端和服务器的Jmeter版本最好保持一致,不然运行脚本时会报错
#-l后的文件后缀可随意取名,建议以jtl结尾

查看结果

1
2
3
4
5
6
7
8
9
10
11
12
13
14
[root@centos bin]# cat request.log 
timeStamp,elapsed,label,responseCode,responseMessage,threadName,dataType,success,failureMessage,bytes,sentBytes,grpThreads,allThreads,URL,Latency,IdleTime,Connect
1615797284375,1343,HTTP请求,200,,线程组 1-10,text,true,,816,357,10,10,https://nmk0718.com/host-api/v3_0/login/VerificationCodeLogin,1340,0,1009
1615797284375,1378,HTTP请求,200,,线程组 1-9,text,true,,816,357,9,9,https://nmk0718.com/host-api/v3_0/login/VerificationCodeLogin,1377,0,999
1615797284375,1406,HTTP请求,200,,线程组 1-2,text,true,,816,357,8,8,https://nmk0718.com/host-api/v3_0/login/VerificationCodeLogin,1406,0,1004
1615797284371,1412,HTTP请求,200,,线程组 1-7,text,true,,816,357,7,7,https://nmk0718.com/host-api/v3_0/login/VerificationCodeLogin,1412,0,1013
1615797284375,1504,HTTP请求,200,,线程组 1-4,text,true,,816,357,6,6,https://nmk0718.com/host-api/v3_0/login/VerificationCodeLogin,1504,0,1008
1615797284389,1513,HTTP请求,200,,线程组 1-1,text,true,,816,357,5,5,https://nmk0718.com/host-api/v3_0/login/VerificationCodeLogin,1513,0,990
1615797284388,1517,HTTP请求,200,,线程组 1-6,text,true,,816,357,4,4,https://nmk0718.com/host-api/v3_0/login/VerificationCodeLogin,1516,0,992
1615797284388,1578,HTTP请求,200,,线程组 1-8,text,true,,816,357,3,3,https://nmk0718.com/host-api/v3_0/login/VerificationCodeLogin,1578,0,995
1615797284373,1619,HTTP请求,200,,线程组 1-5,text,true,,816,357,2,2,https://nmk0718.com/host-api/v3_0/login/VerificationCodeLogin,1619,0,1005
1615797284375,1636,HTTP请求,200,,线程组 1-3,text,true,,816,357,1,1,https://nmk0718.com/host-api/v3_0/login/VerificationCodeLogin,1636,0,1007

#可以看到responseCode这一列都是200,代表请求成功

查看聚合报告

把request.log下载到桌面,添加一个新的聚合报告,导入request.log即可看到聚合报告

查看请求结果

从linux导出的文件,是看不到请求返回的数据的

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
[root@centos bin]# pwd
/home/apache-jmeter-5.2/bin
[root@centos bin]# vi jmeter.properties
修改前:
#jmeter.save.saveservice.response_data=false
#jmeter.save.saveservice.samplerData=false

修改后:
jmeter.save.saveservice.response_data=true
jmeter.save.saveservice.samplerData=true

[root@centos bin]# vi user.properties
#在文件的最后面加入以下配置
jmeter.save.saveservice.output_format=xml
jmeter.save.saveservice.response_data=true
jmeter.save.saveservice.samplerData=true
jmeter.save.saveservice.requestHeaders=true
jmeter.save.saveservice.url=true
jmeter.save.saveservice.responseHeaders=true

再重新执行脚本

1
2
3
4
5
6
7
8
9
10
[root@centos bin]# jmeter -n -t HttpRequest.jmx -l request.jtl
Creating summariser <summary>
Created the tree successfully using HttpRequest.jmx
Starting standalone test @ Fri Mar 19 15:51:56 CST 2021 (1616140316075)
Waiting for possible Shutdown/StopTestNow/HeapDump/ThreadDump message on port 4445
summary + 45 in 00:00:03 = 13.8/s Avg: 2299 Min: 2061 Max: 2663 Err: 0 (0.00%) Active: 56 Started: 100 Finished: 44
summary + 55 in 00:00:01 = 63.7/s Avg: 3070 Min: 2649 Max: 3478 Err: 0 (0.00%) Active: 0 Started: 100 Finished: 100
summary = 100 in 00:00:04 = 24.2/s Avg: 2723 Min: 2061 Max: 3478 Err: 0 (0.00%)
Tidying up ... @ Fri Mar 19 15:52:00 CST 2021 (1616140320872)
... end of run

在windows查看结果树

导入request.jtl文件,即可看到请求的响应数据