通过命令行参数传递时,jmeter ${__threadNum} 不呈现
jmeter ${__threadNum} does not render when passed through command line argument
我正在设置一个 jmeter 负载测试,其中每个模拟用户都会提交对他们自己独特的内容源的引用。出于这个原因,在每次测试开始时,我都会创建一个新的文件夹结构,其中路径包含对每个模拟用户的编号引用。
该数字计划对应于 jmeter ${__threadNum}
值。
一旦测试为 运行,每个模拟用户将向 API 端点发送一个 POST 请求,其中请求的主体将包含每个文件的绝对路径在任何给定用户的目录中。
示例:
如果测试模拟两个用户,我将创建以下文件夹结构:
/storage
/testfiles_user1
test_file_1
test_file_2
/testfiles_user2
test_file_1
test_file_2
然后对于每个用户,POST 请求将在请求正文中包含以下 JSON
:
对于用户 1:
{
"files": [
"/storage/testfiles_user1/test_file_1",
"/storage/testfiles_user1/test_file_2"
]
}
对于用户 2:
{
"files": [
"/storage/testfiles_user2/test_file_1",
"/storage/testfiles_user2/test_file_2"
]
}
我的问题来了。
当我在 HTTP 请求正文中硬编码此路径时,按以下方式调用 ${__threadNum}
{
"files": [
"/storage/testfiles_user${__threadNum}/test_file_1",
"/storage/testfiles_user${__threadNum}/test_file_2"
]
}
然后一切都按预期工作=>路径用${__threadNum}
变量值更新,产生以下两个JSON
:
对于用户 1:
{
"files": [
"/storage/testfiles_user1/test_file_1",
"/storage/testfiles_user1/test_file_2"
]
}
对于用户 2:
{
"files": [
"/storage/testfiles_user2/test_file_1",
"/storage/testfiles_user2/test_file_2"
]
}
然而,当我尝试将 HTTP 请求正文 JSON 作为命令行参数传递时,${__threadNum}
在路径中作为普通文本呈现,而不被 jmeter 视为变量,从而产生以下两个 JSON
:
对于用户 1:
{
"files": [
"/storage/testfiles_user${__threadNum}/test_file_1",
"/storage/testfiles_user${__threadNum}/test_file_2"
]
}
对于用户 2:
{
"files": [
"/storage/testfiles_user${__threadNum}/test_file_1",
"/storage/testfiles_user${__threadNum}/test_file_2"
]
}
你对如何解决这个问题有什么建议吗?感谢您的帮助!
为了解析文件中的 JMeter 变量或通过命令行参数传递,您需要将调用包装到 __eval() function
例如,如果您之前有 ${__P(foo,)}
,则需要将其替换为 ${__eval(${__P(foo,)})}
- 这样就会调用嵌套的 __threadNum() function。
演示:
我正在设置一个 jmeter 负载测试,其中每个模拟用户都会提交对他们自己独特的内容源的引用。出于这个原因,在每次测试开始时,我都会创建一个新的文件夹结构,其中路径包含对每个模拟用户的编号引用。
该数字计划对应于 jmeter ${__threadNum}
值。
一旦测试为 运行,每个模拟用户将向 API 端点发送一个 POST 请求,其中请求的主体将包含每个文件的绝对路径在任何给定用户的目录中。
示例: 如果测试模拟两个用户,我将创建以下文件夹结构:
/storage
/testfiles_user1
test_file_1
test_file_2
/testfiles_user2
test_file_1
test_file_2
然后对于每个用户,POST 请求将在请求正文中包含以下 JSON
:
对于用户 1:
{
"files": [
"/storage/testfiles_user1/test_file_1",
"/storage/testfiles_user1/test_file_2"
]
}
对于用户 2:
{
"files": [
"/storage/testfiles_user2/test_file_1",
"/storage/testfiles_user2/test_file_2"
]
}
我的问题来了。
当我在 HTTP 请求正文中硬编码此路径时,按以下方式调用 ${__threadNum}
{
"files": [
"/storage/testfiles_user${__threadNum}/test_file_1",
"/storage/testfiles_user${__threadNum}/test_file_2"
]
}
然后一切都按预期工作=>路径用${__threadNum}
变量值更新,产生以下两个JSON
:
对于用户 1:
{
"files": [
"/storage/testfiles_user1/test_file_1",
"/storage/testfiles_user1/test_file_2"
]
}
对于用户 2:
{
"files": [
"/storage/testfiles_user2/test_file_1",
"/storage/testfiles_user2/test_file_2"
]
}
然而,当我尝试将 HTTP 请求正文 JSON 作为命令行参数传递时,${__threadNum}
在路径中作为普通文本呈现,而不被 jmeter 视为变量,从而产生以下两个 JSON
:
对于用户 1:
{
"files": [
"/storage/testfiles_user${__threadNum}/test_file_1",
"/storage/testfiles_user${__threadNum}/test_file_2"
]
}
对于用户 2:
{
"files": [
"/storage/testfiles_user${__threadNum}/test_file_1",
"/storage/testfiles_user${__threadNum}/test_file_2"
]
}
你对如何解决这个问题有什么建议吗?感谢您的帮助!
为了解析文件中的 JMeter 变量或通过命令行参数传递,您需要将调用包装到 __eval() function
例如,如果您之前有 ${__P(foo,)}
,则需要将其替换为 ${__eval(${__P(foo,)})}
- 这样就会调用嵌套的 __threadNum() function。
演示: