Jmeter压力测试
一、创建测试计划
目标机器:127.0.0.1, 压测接口:
http://127.0.0.1:32063/v1/auth/captcha?uuid=${uuid}
编写jmeter测试脚本,设置压力测试的标准为20个并发线程,在10秒内全部启动,持续压测时间1分钟,接着开始启动jemeter脚本进行测试。
1.1 前置
1.1.1 User Defined Variables
选中Test Plan,点击Add —>Config Element—> User Defined Variables;
Name value
BASE_URL_0 127.0.0.1
threadNum ${__P(loopNum,1)}
loopNum ${__P(rampupTime,1)}
duration ${__P(duration,60)}
1.1.2 Thread Group
这个就是我们通常使用的线程,一个线程组可以看做一个虚拟用户组,线程组中的每个线程都可以理解为一个虚拟用户,多个用户同时去执行相同的一批次任务。每个线程之间都是隔离的,互不影响的。一个线程的执行过程中,操作的变量,不会影响其他线程的变量值。
选中Test Plan,点击Add —>Thread(Users)—> Thread Group;
采样器失败后处理:
continue(继续):继续执行接下来的操作;Start Next Thread Loop(启动下一进程循环):开始下一次循环;stop Thread(停止线程):停止线程,退出该线程(不再执行此线程的操作);stop Test(停止测试):等待当前执行的采样器结束后,结束整个测试;Stop Test Now(立即停止测试):马上停止测试;
线程属性:
Number of Threads(users)(线程数):相当于模拟的用户数量;Ramp-up Period(in seconds):达到指定线程需要的时间,例如线程数为20,时间设定为10s,那么就是10s加载20个线程,每秒启动的线程数=20/10=2;Loop Count(循环次数):如果填具体的数值,就是循环对应的次数;如果选择Forever,则一直执行下去,直到手动停止;Delay Thread creation until needed:延迟线程创建,直到需要才创建。
调度器配置:
Duration(持续时间):设置测试计划的执行时间,单位是秒;Startup delay(启动延迟):设置测试计划的启动延迟时间,以确保测试计划在指定的开始时间开始执行;
注意:
- 注意:调度器一般在循环次数为
Forever时配合使用,否则会按照具体的循环次数执行; jmeter调度器只适用于jmeter的GUI模式(即通过jmeter界面直接执行脚本),不适用于cli模式(即进入到jmeter的目录下通过命令执行测试脚本);- 在
CLI模式下,需要使用其他的方式来控制测试计划的执行时间和频率,例如使用脚本语言编写定时执行脚本来实现。
1.2 token处理
在某些情况下,我们压测的接口是需要进行身份认证的,这种情况下我们需要先登录。
1.2.1 Once Only Controller
即先选中Thread Group,点击Add —>Logic Controller —>Once Only Controller;
(1) 选中Once Only Controller,点击Add —>Config Element—> Http Header Manager,并参考下文进行配置。
(2) 选中Once Only Controller,点击Add —>Sampler—> Http Request,并参考下文配置登录接口;
选中登录接口Http Request,点击Add —>Post Processors—>JSON Extractor;配置
Names of created variables:reponsetoken;JSON Path Expressions:$.data.token;
选中登录接口Http Request,点击Add —>Assertions—> Response Assertion;配置:
Field To Test:选择Text Response;Pattern Matching Rules:配置成Contains;Patterns to Test:配置成响应成功的业务状态码,比如00000。
如果登录用户名想从配置文件读取,可以选中登录接口Http Request,点击Add —>Config Element—> CSV Data SetConfig。
1.2.2 Loop Controller
即先选中Thread Group,点击Add —>Logic Controller —>Loop Controller;
接着将 Http Header Manager、 Http Request各种Listener等添加到Loop Controller下。
1.3 Config Element配置
1.3.1 Http Header Manager
选中Thread Group,点击Add —>Config Element—> Http Header Manager;
设置请求头参数,比如:
Name value
Content-Type application/json
Authorization ${reponsetoken}
1.4 Sampler配置
1.4.1 Http Request
选中Thread Group,点击Add —>Sampler—> Http Request;
进行如下设置:
-
Name:接口名称; -
Web Server配置:-
Protocol[http]:http; -
Server Name or IP:${BASE_URL_0}; -
Port Number:32063;
-
-
Http Request配置:配置请求接口,比如GET /v1/auth/captcha?uuid=${__UUID};
1.4.2 Response Assertion
选中Http Request,点击Add —>Assertions—> Response Assertion;
配置:
- `Field To Test`:选择`Text Response;`
- `Pattern Matching Rules`:配置成`Contains`;
- `Patterns to Test`:配置成响应成功的业务状态码,比如`00000`。
1.5 Listener配置
1.5.1 View Results Tree
选中Thread Group,点击Add —>Listener—> View Results Tree。
View Result Tree可以查看Http Request结果。
1.5.2 Aggragate Report
选中Thread Group,点击Add —>Listener—> Aggragate Report。
对于每个请求,Aggragate Report统计响应信息并提供请求数,平均值,最大,最小值,错误率,大约吞吐量(以请求数/秒为单位)和以kb/s为单位的吞吐量;

在这里我们主要解释每一个表项是什么意思。
Label:请求的名称,就是我们在进行测试的Http Request Sampler的名称;Samples:总共发给服务器的请求数量,如果模拟20个用户,每个用户迭代60次,那么总的请求数为:20*60 =1200次;Average:所有样本的平均响应时间;Median:所有样本响应时间的中间值;90%Line:请求响应时间在97 ms的请求占比为90%;95%Line:请求响应时间在115 ms的请求占比为95%;99%Line:请求响应时间在180 ms的请求占比为99%;Min:最小的响应时间;Max:最大的响应时间;需要注意留言一下是否存在Error,可能是jmeter连接重置错误导致这个值很大;Error%:错误率=错误的请求的数量/请求的总数;Throughput: 吞吐量即表示每秒完成的请求数;KB/sec: 每秒从服务器端接收到的数据量。
1.5.3 Transactions per Second
选中Thread Group,点击Add —>Listener—> jp@gc - Transactions per Second。
每秒事务数。性能测试中,最重要的2个指标之一。该插件的作用是在测试脚本执行过程中,监控查看服务器的TPS表现,比如整体趋势、实时平均值走向、稳定性等。
1.5.4 Response Times Over Time
选中Thread Group,点击Add —>Listener—> jp@gc - Response Times Over Time。
事务响应时间。性能测试中,最重要的两个指标的另外一个。该插件的主要作用是在测试脚本执行过程中,监控查看响应时间的实时平均值、整体响应时间走向等。
1.5.5 Active Threads Over Time
选中Thread Group,点击Add —>Listener—> Active Threads Over Time。
统计每秒活动的线程总数;
1.5.6 Response Times Percentiles
选中Thread Group,点击Add —>Listener—> Response Times Percentiles。
统计响应时间百分比;
比如响应时间在200ms内的百分比为100%。
1.6 Timer配置
1.6.1 Constant Throughput Timer
选中Thread Group,点击Add —>Timer—> Constant Throughput Timer。
在测试环境进行压力测试时,我们可以把并发量设置的比较高,可以得出最大并发量。但是在生产环境下,有时候我们会根据客户的要求,可能只要求应用能满足用户使用就可以,且压测时要保证不系统正常、不崩溃。这时我们用到jmeter的限频。
Constant Throughput Timer(常数吞吐量定时器):常数吞吐量定时器可以让jmeter以指定数字的吞吐量(即指定TPS,只是这里要求指定每分钟的执行数,而不是每秒)执行。
吞吐量计算的范围可以为指定为当前线程、当前线程组、所有线程组,并且计算吞吐量的依据可以是最近一次线程的执行时延。
假设目标TPS为20,则设置Target Throughput (in samples per minute)参数为20*60=1200。
二、服务器压测
2.1 安装jmeter
在安装jmter之前默认你已经安装了jdk8。将jmeter上传到服务器/home/jmeter目录,将编写好的测试计划上传到的/home/jmeter/apache-jmeter-5.4.3/testplan目录。
配置Jmeter环境变量;
vi /etc/profile
export JMETER_HOME=/home/jmeter/apache-jmeter-5.4.3
exportCLASSPATH=${JMETER_HOME}/lib/ext/ApacheJMeter_core.jar:${JMETER_HOME}/lib/jorphan.jar:${CLASSPATH}
export PATH=${JMETER_HOME}/bin:$PATH
让配置文件立马生效:
source /etc/profile
查看是否安装成功,执行命令:
jmeter -v
如果提示 -bash: /home/jmeter/apache-jmeter-5.4.3/bin/jmeter: 权限不够,执行以下指令即可
chmod +x /home/jmeter/apache-jmeter-5.4.3/bin/jmeter
2.2 运行jmeter
创建一个jtl用来接收结果;
cd /home/jmeter/apache-jmeter-5.4.3/
touch test.jtl
在linux下执行:
jmeter -n -t /home/jmeter/apache-jmeter-5.4.3/testplan/*.jmx -l test.jtl
参数说明 :
-n: 告诉jmeter使用nogui模式运行测试;-t: 执行的测试脚本名;
出现下面的日志表示运行成功。
Aug 06, 2024 4:17:54 PM java.util.prefs.FileSystemPreferences$1 run
INFO: Created user preferences directory.
Creating summariser <summary>
Created the tree successfully using /home/jmeter/apache-jmeter-5.4.3/testplan/获取验证码.jmx
Starting standalone test @ Tue Aug 06 16:17:55 CST 2024 (1722932275291)
Waiting for possible Shutdown/StopTestNow/HeapDump/ThreadDump message on port 4445
summary + 97 in 00:00:04 = 22.9/s Avg: 22 Min: 15 Max: 107 Err: 0 (0.00%) Active: 20 Started: 20 Finished: 0
summary + 600 in 00:00:30 = 20.0/s Avg: 18 Min: 14 Max: 94 Err: 0 (0.00%) Active: 20 Started: 20 Finished: 0
summary = 697 in 00:00:34 = 20.4/s Avg: 19 Min: 14 Max: 107 Err: 0 (0.00%)
summary + 518 in 00:00:26 = 20.0/s Avg: 18 Min: 14 Max: 144 Err: 0 (0.00%) Active: 0 Started: 20 Finished: 20
summary = 1215 in 00:01:00 = 20.2/s Avg: 19 Min: 14 Max: 144 Err: 0 (0.00%)
Tidying up ... @ Tue Aug 06 16:18:55 CST 2024 (1722932335942)
... end of run
2.3 查看结果
执行结果保存到test.jtl文件,该文件可以在GUI模式下查看:
JMeter GUI界面 ->Test Plan->Aggragate Report-> 右侧filename-> 浏览按钮找到刚生成的jtl文件打开即可;JMeter GUI界面 ->Test Plan->Response Times Over Time-> 右侧filename ->浏览按钮找到刚生成的jtl文件打开即可;JMeter GUI界面 ->Test Plan->Transactions per Second-> 右侧filename ->浏览按钮找到刚生成的jtl文件打开即可;JMeter GUI界面 ->Test Plan->Active Threads Over Time-> 右侧filename ->浏览按钮找到刚生成的jtl文件打开即可;JMeter GUI界面 ->Test Plan->Response Times Percentiles-> 右侧filename ->浏览按钮找到刚生成的jtl文件打开即可;
比如查看Response Times Over Time:
三、支持https双向认证
Jmeter需要导入的证书是keystore证书。接下来,我讲会以一个例子来说明如何使用Jmeter来访问一个SSL双向认证的接口;
3.1 生产keystore证书
如果你拥有的是key和crt的话,那你要得到keystore的证书需要经历两个步骤。一步是根据key和crt生成p12,然后使用p12生成keystore。
3.1.1 生成P12证书
命令行执行下面的命令,会生成一个p12的文件,叫server.p12 ,注意同时还会设置一个p12的密码,需要记住,下一步会用到;
openssl pkcs12 -export -out client.p12 -inkey client.key -in client.crt
3.1.2 使用p12生成keystore文件
先cd到刚才生成的p12文件的路径下,然后执行下面命令;
keytool -importkeystore -srckeystore certificate.P12 -srcstoretype PKCS12 -srcstorepass certificate_password -keystore mystore.keystore -storepass keystore_password
其中:
certificate.P12: 就是之前生成的p12证书,在我们的例子里叫server.p12;certificate_password:p12的密码keystore_password: 设置keystore的密码,这个密码要记住,之后jmeter导入后需要使用。
我们这个例子里,我们的命令如下,p12的密码和keystore的密码我们都设置为123456;
keytool -importkeystore -srckeystore client.p12 -srcstoretype PKCS12 -srcstorepass 123456 -keystore client.keystore -storepass 123456
到这一步为止,我们就生成了一个名字为client.keystore密码为123456的证书。
3.2 导入证书
3.2.1 进入SSL管理页面导入证书
点击左上角的Options->SSL Manager,选中之前生产的client.keystore证书。
3.2.2 执行SSL双向认证的请求
执行测试计划请求,运行的时候会弹出一个框让你输入密码,这个密码就是client.keystore的密码。

浙公网安备 33010602011771号