Jmeter - 如何在一个线程组中的所有线程的第一次请求中使用变量集

Jmeter - How to use the variable set in first request for all the threads in one thread group

我只想 运行 一个请求一次,并使用 Json 提取器从其响应中获取授权令牌,然后在另一个请求中将该令牌用作 header 运行在同一个线程组下。

我尝试使用“setup Thread Group”,但变量值对主线程组不可用。 所以,我在同一个线程组下使用了“If Controller”,条件如下:

${__groovy(ctx.getThreadNum() == 0 &&  vars.getIteration() == 1,)}

这是使特定请求只执行一次。 但是,变量值仅对后续请求的一个线程可用,而不是对所有线程可用。下面是结果树的图片:

我可以知道如何访问所有线程而不是一个线程的第一个请求中设置的变量值吗?

您不能在其他线程中使用在一个线程中创建的变量,这就是 JMeter 作用域提取变量的工作原理。

您已经接近解决方案,提供步骤以便任何人都可以像这样解决问题:-

  1. 使用If Controller 确保只有一次请求才能获得授权令牌
  2. 使用 post-processor
  3. 提取令牌
  4. 使用 post 处理器将令牌保存在 属性 中,以便可以在多个线程中使用相同的令牌
  5. 通过引用property函数而不是变量
  6. ,在后续请求中使用新创建的属性而不是变量

您可以像下面这样使用一个 JSR223 post-processor 从变量创建一个 属性:

请注意,如果您使用线程组模拟多个用户,理想情况下您应该为不同的用户创建不同的身份验证令牌。

P.S.:Balzemeter有一篇文章用BeanShell演示如何解决这个问题

根据JMeter Documentation

Properties are not the same as variables. Variables are local to a thread; properties are common to all threads

因此,如果您想对所有线程(虚拟用户)使用单个令牌,您需要先将其转换为 JMeter 属性,例如:

  1. 在 If 控制器下使用 __setProperty() function 将您的变量转换为 属性
  2. 在您的 GET 请求中使用 __P() function 读取 属性 值

另一种在线程之间共享数据的方法(即使它们在不同的线程组中)是使用 Inter-Thread Communication Plugin