0

我在使用 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
4

1 回答 1

0

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

  1. 在第一次迭代期间使用If 块为第一个线程生成令牌,并将其转换为JSR223 块中的 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以及单词propsvars含义

  2. 在您的第二个请求中,使用__P() 函数引用该属性

    http://url/user_token=${__P(auth_token,)}
    
于 2020-05-15T18:34:06.453 回答