我在使用金牛座时遇到了问题。有人可以帮我吗?我正在尝试模拟300个用户,但是在向这300个用户发送POST请求之前,我需要生成一个令牌。令牌以这种方式附加到请求:
- url: http://url?user_token=${auth_token}
现在我有以下情形:
load_api:
requests:
- once:
- url: https://endpoint/authenticateUser
method: POST
headers:
Content-Type: application/json
body:
username: username
password: pass
generateToken: true
extract-jsonpath:
auth_token:
jsonpath: $.token
label: get_token
- url: http://url/user_token=${auth_token}
method: POST
headers:
Content-Type: application/json
body-file: test_data/body.json
label: sending_300
如您所见,将为每个线程生成一个令牌。我需要在脚本之前生成它,然后将令牌作为参数附加到URL。我曾尝试将这两种情况分开,但那样一来,一个脚本中的变量就不能在另一个脚本中使用。我也在查看全局变量,但似乎只能在执行之前创建这种变量。因此,如果有人可以帮助我,我将不胜感激您所花费的时间。
编辑(非常感谢Dmitri T):
这是一个可行的脚本:
execution:
concurrency: 300
scenario: load_test
scenarios:
load_test:
requests:
- if: ${__groovy(ctx.getThreadNum() == 0 && vars.getIteration() == 1,)}
then:
- url: https://url/authenticateUser
method: POST
headers:
Content-Type: application/json
body:
username: username
password: pass
generateToken: true
extract-jsonpath:
auth_token:
jsonpath: $.token
label: get_token
jsr223: props.put('auth_token', vars.get('auth_token'))
else:
- url: http://endpoint?user_token=${__P(auth_token,)}
method: POST
headers:
Content-Type: application/json
body-file: test_data/body.json
label: sending_300_reqs
think-time: 10s # waiter for processing auth request
答案 0 :(得分:0)
如果您想一次生成令牌并在300个线程中共享它:
在第一次迭代期间使用If block为第一个线程生成令牌,并将其转换为JSR223 block中的JMeter属性。 If块的条件为:
${__groovy(ctx.getThreadNum() == 0 && vars.getIteration() == 1,)}
以及JSR223块的代码:
props.put('auth_token', vars.get('auth_token'))
查看Top 8 JMeter Java Classes You Should Be Using with Groovy文章以了解这些ctx
,props
和vars
单词的含义
在第二个请求中,使用__P() function
引用属性http://url/user_token=${__P(auth_token,)}