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
的密码。