如何在JMeter中将变量从一个线程组传递到另一个线程组

2022-08-31 16:07:48

我有一个带有2个线程组的JMeter测试 - 第一个是单个线程(创建一些库存),第二个线程有多个线程(购买所有库存)。我使用BeanShell Assertions和XPath Extractors来解析返回值(即XML)并存储变量(例如要购买的物品的ID)。

但是,在第一个线程组中创建的值(无论是提取到标准类型变量中还是类型 var)在第二个线程组中都不可用。是否无论如何都可以在第一个线程组中创建一个变量并使其对第二个线程组可见?${jmeter}${__BeanShell(vars.get("jmeter"))}


答案 1

我无法使用变量执行此操作(因为这些变量是单个线程的本地变量)。但是,我能够通过属性解决这个问题!

同样,我的第一个 ThreadGroup 完成了所有设置,我需要该工作中的一些信息才能提供给第二个 ThreadGroup 中的每个线程。我在第一个线程组中有一个BeanShell断言,其中包含以下内容:

${__setProperty(storeid, ${storeid})};

${storeid} 是使用 XPath Extractor 提取的。BeanShell Assertion还执行其他操作,例如检查storeid是否从上一次调用返回,等等。

无论如何,在第二个 ThreadGroup 中,我可以在 Samplers 中使用 “storeid” 属性的值,如下所示:

${__property(storeid)}

像魔咒一样工作!


答案 2

根据JMeter文档:

16.12 在线程和线程组之间共享变量

变量是线程的局部变量,在一个线程中设置的变量不能在另一个线程中读取。这是设计使然。有关可在测试开始之前确定的变量,请参阅参数化测试(上文)。如果在测试开始之前该值是未知的,则有多种选项:

  1. 将变量存储为属性 - 属性是 JMeter 实例的全局属性
  2. 将变量写入文件并重新读取它们。
  3. 使用 bsh.shared 命名空间 - 请参阅 16.8.2 共享变量
  4. 编写自己的 Java 类

在线程之间传递变量的另一种方法是使用jmeter插件,如Andrey Botalov下面所提到的

但是我发现第一次使用它有点令人困惑,但它可以在线程之间传递期间完全控制变量。按照我的例子使用BeanShell,你会看到它是多么容易:

Project stucture接下来参考图片中的部分:

(1.1)在这里,我在用户定义的变量中创建自定义变量(或者您可以使用BSF Proccessor执行此操作 - 在本例中禁用(1.2))

(2.1)(2.4)我在第一个线程中成功地使用了变量 - 没有什么特别:)

(2.2)添加了BeanShell后处理器并自定义了我的变量

(2.3)已将其添加到队列

(3.1) 在第二个线程中 - 变量取自队列 - 具有您想要的任何名称。但要小心,明智地使用超时,因为这个线程将等到以前的完成,所以它可以获得修改变量(尝试一些长响应)

(3.2)(3.3)(3,4)重复使用和修改变量的步骤

(3.5) 变量在新队列中再次发送 - 因此请为其提供新名称

(4.1)(4.2)(4.3) 从新队列中抓取修改后的变量就像 charm 一样工作

警告

  1. 如果添加更多线程,则使用变量向线程组添加一些计数器,并将此变量名称添加到队列名称 - 在线程组中尝试捕获队列以使其具有唯一的名称(如果需要更清晰的阐释,请写注释)

  2. 如果您在一个线程组中有多个 http 请求,则添加线程通信预处理器作为 last 的子级(或者,如果您想实现某些自定义操作,则添加其他)http 请求

播放,修改,自定义以获得最佳结果:)添加更多线程可能会导致不必要的行为,因此您需要保持警惕。

Information about project structure