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

新手上路,请多包涵

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

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

原文由 Todd R 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 781
2 个回答

我无法使用变量来做到这一点(因为它们对于单个线程是本地的)。但是,我能够用属性解决这个问题!

同样,我的第一个 ThreadGroup 完成所有设置,我需要从该工作中获得一些信息以供第二个 ThreadGroup 中的每个线程使用。我在第一个 ThreadGroup 中有一个 BeanShell 断言,其中包含以下内容:

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

${storeid} 是用 XPath Extractor 提取的。 BeanShell 断言做其他事情,比如检查 storeid 是否从上一个调用返回,等等。

无论如何,在第二个 ThreadGroup 中,我可以使用采样器中“storeid”属性的值:

 ${__property(storeid)}

奇迹般有效!

原文由 Todd R 发布,翻译遵循 CC BY-SA 2.5 许可协议

根据 JMeter 文档:

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

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

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

另一种在线程之间传递变量的方法是使用 jmeter-plugins,如 下面的 Andrey Botalov 所述

但我发现第一次使用它有点混乱,但它在从一个线程传递到另一个线程的过程中提供了对变量的完全控制。按照我的 BeanShell 用法示例,您会发现它是多么简单:

项目结构接下来参考下图中的部分:

(1.1) 在这里,我在用户定义变量中创建了自定义变量(或者您可以使用 BSF 处理器来完成 - 在本例 (1.2) 中禁用)

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

(2.2)添加BeanShell PostProcessor并自定义我的变量

(2.3)加入队列

(3.1) 在第二个线程中 - 变量取自队列 - 使用任何你想要的名称。但是要小心,明智地使用超时,因为这个线程会等到上一次完成,这样它才能获得修改后的变量(用一些长响应进行实验)

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

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

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

警告

  1. 如果您添加更多线程,然后将一些计数器添加到带有变量的线程组并将此变量名称添加到队列名称 - 在您尝试捕获队列的线程组中执行相同操作,以便队列将为每个线程具有唯一名称(如果您写评论需要一些更清楚的解释)

  2. 如果您在一个线程组中有多个 http 请求,则将线程通信预处理器添加为最后一个(或其他,如果您想实现一些自定义事物)http 请求的子项

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

有关项目结构的信息

原文由 pbaranski 发布,翻译遵循 CC BY-SA 4.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题