使用jmeter命令行动态传递参数进行自动化测试
需求
对于使用 jmeter 进行接口测试来说,使用 GUI 方式只能是手工测试,而无法与 Jenkins 等集成为自动化测试。
例如:我们要对于用户登录接口进行测试,可能部署环境有 2 个,测试环境和预发环境。假设测试环境域名 host=test.localhost.com
,预发环境域名 host=pre.localhost.com
那么测试的接口地址,就不可能是静态固定的。因此,我们需要将接口地址转化为这样的形式https://${host}/login
。这样,使用 CI 集成测试的时候,可以通过命令行将 host 传递过来,那么不同环境下就可以重用已经编写好的 jmeter 的 jmx 脚本,提升工作效率。
命令行传参
jmeter 命令行传参(变量),有 2 种形式。
- 使用 -J 选项,用于本地运行 jmeter 时传递参数
- 使用 -G 选项,用于分布式运行 jmeter 是传递参数
jmeter.sh -n -t test.jmx -J变量名=变量值
如何配置 jmeter 的 jmx 脚本
直接执行jmeter.sh
进入 jmeter 的图形界面。
添加用户定义的变量
在测试计划中右键添加【用户定义的变量】,如下图所示:
我们定义的变量host=${__P(host)}
,其中的__P
函数用于定义属性及默认值,如有默认值,则__P
的第 2 个参数设置默认值。
注意:如果你定义的变量默认值是空的字符串,那么千万不要${__P(host,"")}
,因为这样定义出来的默认值是""
(即两个双引号),而不是一个空的字符串。
当然你如果一定要定义的话,可以这样${__P(host,)}
就行了。
添加察看结果树
在测试计划中右键添加【察看结果树】,如下图所示: 可以将结果写入到文件当中,文件的路径可以使用变量。
保存后,即可在命令行传入参数
执行
此时按照上面的需求,测试环境下,我们执行本地 jmeter 测试的命令行如下:
jmeter.sh -n -t test.jmx -Jhost=test.localhost.com -l test.txt -e -o ./test
对于预发环境,则本地执行命令行变更为:
jmeter.sh -n -t test.jmx -Jhost=pre.localhost.com -l pre.txt -e -o ./pre
即可。
技巧
jmeter 图形界面中的很多可以填写的文本框或文件选择框,基本上都可以使用变量。 例如加载 csv 文件的路径,或结果树输出文件等。 例如:
/response/${db}_cart_result.csv
其中${db}是用户自定义的变量