Taurus 预请求身份验证

Taurus pre-request authentication

我在使用 Taurus 时遇到了问题。有人可以帮我吗?我正在尝试模拟 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

如果您想生成一个令牌一次并在 300 个线程之间共享它:

  1. 在第一次迭代期间使用 If block and convert it to JMeter Property in JSR223 block 为第一个线程生成令牌。 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 文章以了解这些 ctxpropsvars 词的含义

  2. 在您的第二个请求中,使用 __P() function

    引用 属性
    http://url/user_token=${__P(auth_token,)}