59

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

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

4

10 回答 10

76

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

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

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

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

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

${__property(storeid)}

奇迹般有效!

于 2009-04-02T15:16:36.470 回答
17

根据 JMeter 文档:

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

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

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

在线程之间传递变量的另一种方法是使用下面 Andrey Botalov 提到的jmeter-plugins 。

但是我发现第一次使用它有点令人困惑,但它可以在从线程传递到线程期间完全控制变量。按照我的 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 请求,则将线程通信预处理器添加为 last 的子级(或其他,如果您想实现一些自定义的东西)http 请求

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

项目结构信息

于 2013-05-17T18:55:50.270 回答
12

我发现我认为这是完成这项工作的最简单方法。

采用

Bean Shell PostProcessor

设置在一个线程组中

设置变量(http://jmeter.apache.org/usermanual/best-practices.html#bsh_variables

import org.apache.jmeter.util.JMeterUtils;
JMeterUtils.setProperty("PC_CREATED_PROMO_CODE", "value");

或者,如果您想将其设置为另一个变量中包含的值

import org.apache.jmeter.util.JMeterUtils;
JMeterUtils.setProperty("PC_CREATED_PROMO_CODE", vars.get("Extracted_PC_CREATED_PROMO_CODE"));

进入另一个线程组

然后从另一个线程组,通过(http://jmeter.apache.org/usermanual/functions.html#__property)阅读它

${__property(PC_CREATED_PROMO_CODE)}
于 2015-08-12T13:51:09.803 回答
9

为此,JMeter 插件具有线程间通信。

有两种使用方法:

  • 后处理器/预处理器
  • 功能__fifoPut__fifoPop

在我看来 PostProcessor/PreProcessor 更容易使用。

于 2012-10-13T09:03:43.587 回答
5

JMeter Bean Shell 断言

只需添加一个 bean shell 断言,使用属性函数将值分配给一个变量(如全局变量),即使在它转到其他线程之后,该变量也会保存该值。

线程组 >> 添加 >> 断言 >> Bean Shell 断言

${__setProperty(Global_variable_Name,${Variable_name_whose_Value_to_be_Passed})}

然后在另一个线程中你可以调用这个全局变量并可以使用它

以下是您需要用来调用存储值的函数:

${__property(global_variable_name)}

https://medium.com/@priyank.it/jmeter-passing-variables-between-threads-a4dc09903b59

于 2018-06-01T14:37:09.993 回答
4

这在 JMeter 中是不可能的,因为这不是正常的客户端行为(线程之间共享参数)。取而代之的是使用一个带有控制器的线程组:

Thread Group
+ Create inventory
+ + XPath
+ Loop
+ + Purchase inventory
于 2009-04-02T09:01:34.360 回答
4

好吧,这是一种方法;按照这些步骤操作,它会起作用,稍后您可以根据需要进行调整!变量不在线程之间共享(JMeter 可能将此称为功能:))。但属性是!因此,将您的变量设置为如下属性:

1)单击您的测试计划并启用“连续运行线程组”->这使线程组按顺序运行,而不是随机运行。(你可以稍后调整它,但现在让它工作..)

2)例如创建一个名为“setup”的线程组;在该线程组中添加一个 BeanShell 采样器,代码如下:

import org.apache.jmeter.util.JMeterUtils;
JMeterUtils.setProperty("theNameOfYourNewProperty", "theValueOfYourPropery");

所以现在属性已经设置好了!如果您要存储为属性的值是一个变量(例如用户定义的变量或 reqex 变量),您可以执行以下操作:

JMeterUtils.setProperty("theNameOfYourNewProperty", vars.get("theNameOfYourVariable"));

3) 添加一个测试组“实际测试”,例如线程数大于 1;添加一个测试,然后在该测试中添加一个 BeanShell 预处理器,代码如下:

import org.apache.jmeter.util.JMeterUtils;
vars.put("theNameOfYourNewProperty", JMeterUtils.getProperty("theNameOfYourNewProperty"));

因此,现在您已经在该线程中创建了一个名为 theNameOfYourNewProperty 的变量,该变量具有您的系统属性 theNameOfYourNewProperty 的值。在您的测试中,您现在可以像这样访问它:

${theNameOfYourNewProperty}

它适用于每个线程,而不仅仅是第一个线程..

于 2012-09-11T08:24:30.723 回答
1

让主题重获新生 :) 在线程之间传输变量的另一种方法是写入/读取文件。在线程之间传递变量

于 2013-10-22T05:44:29.167 回答
1

另一种解决方案是使用简单表服务器来管理数据集。此功能添加了 1.2 JMeter 插件。

“主要思想是在 JMeter 插件中使用一个微型 http 服务器来管理数据集文件,使用简单的命令来获取/添加文件中的数据行”

查看文档:http: //jmeter-plugins.org/wiki/HttpSimpleTableServer/

问候。

于 2015-01-06T15:37:07.493 回答
0

我使用 set 属性函数和 teardown teardowngroup 从 setupthreadgroup 获取值,但 teardown threadgroup 得到 401 错误。

我检查了所有标题,一切看起来都很好。不确定你的拆卸失败。有什么想法请给我建议

于 2021-12-12T18:39:32.870 回答