不同环境下的 JMeter 性能测试,设置基本一致,只是地址,账户等信息不同,本文利用 Shell 脚本和 JMeter 变量进行统一处理
安装 JMeter
wget https://mirror.cogentco.com/pub/apache//jmeter/binaries/apache-jmeter-5.4.1.tgz
tar -zxvf apache-jmeter-5.4.1.tgz -C /opt
把执行目录加入 PATH
1 | export PATH="$PATH:/opt/apache-jmeter-5.4.1/bin" |
- 这样就可以从任何地方执行 jmeter 命令了
设置测试计划
运行 JMeter GUI
jmeter
常规设置
- 右键单击 Test Plan,把鼠标移至 Add,再移至 Threads(User),点击 Thread Group,设置合适的 Number of Threads (users) 值

- 右键单击 Test Plan 下新增的 Thread Group,把鼠标移至 Add,再移至 Config Element,点击 HTTP Request Default,设置 Server Name or IP 为
${__P(HOST)},Port Number 为${__P(PORT)}
- 右键单击 Thread Group,把鼠标移至 Add,再移至 Sample,点击 HTTP Request,设置 Name 为 Frontend,Path 为 /

- 右键单击 Thread Group,把鼠标移至 Add,再移至 Sample,点击 HTTP Request,设置 Name 为 Backend,Path 为 /api/currentUser

- 右键单击 Thread Group,把鼠标移至 Add,再移至 Assertion,点击 Response Assertion,设置 Field to Test 为 Response Code,Patten Matching Rules 为 Equals,点击下方的 Add,输入 200

__P为 JMeter 获取命令行参数的函数
权限处理
以上的后端接口是需要先登录才能有权限访问的,权限认证方式为 cookies 或 Authorization Header 中的 token,所以需要先获取这个 token, 并在每次访问时带上
- 右键单击 Test Plan,把鼠标移至 Add,再移至 Threads(User),点击 setUp Thread Group

- 右键单击 Test Plan 下新增的 setUp Thread Group,把鼠标移至 Add,再移至 Sample,点击 HTTP Request,设置 Name 为 Login,Server Name or IP 为
${__P(HOST)},Port Number 为${__P(PORT)},HTTP Request 的方法为 POST,Path 为 /api/login/account,点击 下方的 Add,分别增加 Name 为 username 和 password,Value 为${__P(USERNAME)}和${__P(PASSWORD)}
- 右键单击 setUp Thread Group,把鼠标移至 Add,再移至 Post Processors,点击 Regular Expression Extractor,设置 Name of created variable 为 token,Regular Expression 为
"token":"(.+?)",Template 为$1$
- 右键单击 setUp Thread Group,把鼠标移至 Add,再移至 Sample,点击 BeanShellSampler,设置 Name 为 Token,Script 为
${__setProperty(token, ${token})}
- 右键单击 Thread Group,把鼠标移至 Add,再移至 Config Element,点击 HTTP Cookie Manager,点击下方的 Add,设置 Name 为 token,Value 为
${__property(token)},Domain 为${__P(HOST)}:${__P(PORT)},Path 为 /
"token":"(.+?)"将返回结果中的 token 的值捕捉为$1$__setProperty为 JMeter 设置全局变量的函数__property为 JMeter 获取置全局变量的函数
运行测试计划
直接运行
以上的计划设置,把地址和账户信息都作为变量,可以在命令行传递,形如:
mkdir report
HEAP=”-Xms1g -Xmx1g -XX:MaxMetaspaceSize=256m”
jmeter -n -t test.jmx \
-J HOST=127.0.0.1 \
-J PORT=80 \
-J USERNAME=USERNAME \
-J PASSWORD=PASSWORD \
-l log/local-20210620095700.txt \
-e -o report/local-20210620095700
report文件夹必须存在,才能写入报告目录,所以首次需用mkdir新建- 以上命令使用了 jmeter 的命令选项
-n,-t,-J,-l,-e和-o - local-20210620095700 里面的 html 格式的测试报告,包括表格数据和可视化图表,如下图所示


脚本处理
以上命令相对繁琐,而且不同环境需要重新设置每个参数,所以通过 Shell 脚本简化
设置变量
1 | export LOCAL_HOST=127.0.0.1 |
调用变量
1 | #!/bin/sh |
$(echo $VAR | tr 'a-z' 'A-Z')表示全部大写,等效于版本 4.0 以上的 Bash 的${VAR^^}- 如果
report文件夹存在就不用再重新创建,所以先通过-d判断 ${!HOST}表示$HOST的值为另一变量的名称,最后解析出来的是这另一个变量的值
运行脚本
本地环境
./test.sh
测试环境
./test.sh testing
正式环境
./test.sh product
- 在不设环境的时候,
${1:-"local"}把默认环境设置为 local
总结
以上计划和脚本可以在此 GitHub 仓库 下载,主要实现了:
- JMeter 通过接收命令行输入的参数进行动态设置测试计划
- 通过启动线程组进行登录处理,并将 token 设置为全局变量
- 通过 Shell 脚本简化命令并进行不同环境的统一处理