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调度器只适用于jmeterGUI模式(即通过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 variablesreponsetoken
  • 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 ManagerHttp 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 Number32063

  • 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,只是这里要求指定每分钟的执行数,而不是每秒)执行。

吞吐量计算的范围可以为指定为当前线程、当前线程组、所有线程组,并且计算吞吐量的依据可以是最近一次线程的执行时延。

假设目标TPS20,则设置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证书

如果你拥有的是keycrt的话,那你要得到keystore的证书需要经历两个步骤。一步是根据keycrt生成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的密码。

  • 12
    点赞
  • 20
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Graceful_scenery

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值