我正在开发一个JMeter脚本,如下所示:测试计划
Thread Group 1 Login Thread Group 2 Thread Group 3
Csrf令牌在其中一个登录采样器的响应中生成。因为我需要在后续线程组的请求头中使用它,所以我将其设置为属性。现在,当我为10个线程运行这个命令时,我观察到作为登录的一部分,生成了10个不同的csrf令牌,但是在每个后续线程组中,只有登录的最后一个csrf令牌被发送,而实际上我希望每个线程发送10个不同的csrf令牌。
ijxebb2r1#
让我看看我的水晶球,看看你是如何传递令牌的。如果您使用__setProperty()函数并在那里仅提供所需的属性名称-这绝对是预期的,因为JMeter属性对于所有线程都是全局的。最好的解决方案是将您的“登录”请求移动到您将使用令牌的线程组,并将其置于Once Only Controller下,以便它们仅在第一次迭代中执行。如果您的用例更具体,并且您迫切需要在Thread Group之间传递令牌,则只需使用当前线程号作为属性前缀或后缀。例如,您可以使用JSR 223 PostProcessor和以下代码将用户特定的令牌存储到用户特定的属性中:
props.put('token_' + (ctx.getThreadNum() + 1), vars.get('variable-holding-your-token-here'))
请参阅Top 8 JMeter Java Classes You Should Be Using with Groovy文章,了解有关这些props、vars和ctx对象的含义的更多信息。然后,你可以使用__P()和__threadbatch()函数组合来读取需要的token值:
props
vars
ctx
${__P(token_${__threadNum},)}
演示:
1条答案
按热度按时间ijxebb2r1#
让我看看我的水晶球,看看你是如何传递令牌的。如果您使用__setProperty()函数并在那里仅提供所需的属性名称-这绝对是预期的,因为JMeter属性对于所有线程都是全局的。
最好的解决方案是将您的“登录”请求移动到您将使用令牌的线程组,并将其置于Once Only Controller下,以便它们仅在第一次迭代中执行。
如果您的用例更具体,并且您迫切需要在Thread Group之间传递令牌,则只需使用当前线程号作为属性前缀或后缀。
例如,您可以使用JSR 223 PostProcessor和以下代码将用户特定的令牌存储到用户特定的属性中:
请参阅Top 8 JMeter Java Classes You Should Be Using with Groovy文章,了解有关这些
props
、vars
和ctx
对象的含义的更多信息。然后,你可以使用__P()和__threadbatch()函数组合来读取需要的token值:
演示: