在 JMeter 线程组中共享变量

Share Variables Within JMeter Thread Group

我有一个线程组,其中 运行 多个线程并发。 每个线程使用来自 csv 文件的 ID 发出请求。 因此,随着时间的推移,线程组中的不同线程最终可能会发出具有相同 ID 的请求。 我想将返回的 cookie 用于请求中的特定 ID,即使它是由不同的线程创建的。

目前我有一个提取 cookie 值的正则表达式提取器,它根据其 ID 创建了一个变量,例如,ID 为 56789 且 cookie 为 1234,该变量将为 56789_1234 .

然后我使用 ${__V(${id}_g1)} 提取与另一个请求的特定 ID 关联的 cookie。

(本质上是创建了一堆变量,以ID和最后返回的cookie值作为前缀,然后每个后续请求都可以使用ID为其请求拉出正确的cookie)

然后创建 cookie:

import org.apache.jmeter.protocol.http.control.CookieManager;
import org.apache.jmeter.protocol.http.control.Cookie;
CookieManager manager = sampler.getCookieManager();

Cookie AWSALB = new Cookie("AWSALB","${cookieVal}","domain","path",false,Long.MAX_VALUE);
manager.add(AWSALB);

(我使用 jp@gc - 设置变量操作将 ${__V(${id}_g1)} 分配给 'cookieVal')

但是,我仍然无法在所有线程之间共享正在创建的变量范围。

我试过属性,但我相信它只适用于线程组,并且如果组 运行 连续。

我希望组内的所有线程都能够读取其他线程提取的所有变量。

  1. 您可以将每个线程(虚拟用户)“粘贴”到它自己的 ID(或 CSV 中的一组 ID),即为每个用户使用单独的文件和 __CSVRead() function or single file and __groovy() 函数来读取值
  2. 如果您仍想继续使用您的方法,请查看Inter-Thread Communication Plugin which provides a FIFO 队列
  3. 另一种方法是使用 JMeter Properties 如果 ID 的名称-值对形式=cookie_value,如果 ID 没有 cookie 值 - 将值写入 属性 , 如果有 - 从 属性 读取值而不是请求新的 cookie

虽然尝试了属性,但我似乎没有让它工作。即使创建了属性(如调试后处理器中所标识),出于某种原因我仍然无法在线程之间访问它们。

但是我通过在请求前后使用 Beanshell 采样器解决了这个问题,将单个 cookie 值写到每个 ID 的单独 txt 文件中,txt 文件名是 ID。每次任何线程使用此 ID 发出请求时,它都会更新相应的 txt 文件中的值,然后在每次请求之前,读取该 ID 的特定 txt 文件以检索最后返回的 cookie。

更新

随着线程数量的增加,线程在尝试同时 access/write 同一个 .txt 文件时被阻塞的可能性也会增加。

我改用 __CSVRead(),到目前为止效果很好。