我有一个带有2个线程组的JMeter测试 - 第一个是单个线程(创建一些库存),第二个有多个线程(购买所有库存)。我使用BeanShell Assertions和XPath Extractors来解析返回的值(即XML)并存储变量(例如要购买的项目的ID)。
但是,在第一个线程组中创建的值,无论是提取到标准${jmeter}
类型变量,还是${__BeanShell(vars.get("jmeter"))}
类型变量,都不能在第二个线程组中使用。无论如何在第一个线程组中创建一个变量并使其对第二个线程组可见?
答案 0 :(得分:68)
我无法使用变量(因为它们是各个线程的本地)。但是,我能用属性来解决这个问题!
同样,我的第一个ThreadGroup完成了所有的设置,我需要来自该工作的一些信息可用于第二个ThreadGroup中的每个线程。我在第一个ThreadGroup中有一个BeanShell Assertion,其中包含以下内容:
${__setProperty(storeid, ${storeid})};
使用XPath Extractor提取$ {storeid}。 BeanShell Assertion执行其他操作,例如检查从前一次调用返回的storeid等等。
无论如何,在第二个ThreadGroup中,我可以使用Samplers中“storeid”属性的值,具有以下内容:
${__property(storeid)}
像魅力一样!
答案 1 :(得分:13)
根据JMeter文件:
16.12在线程和线程组之间共享变量
变量是线程的本地变量,无法读入一个线程中的变量集 另一个。这是设计的。对于可以确定的变量 在测试开始之前,请参阅参数化测试(上文)。如果值 在测试开始之前不知道,有各种选择:
- 将变量存储为属性 - 属性是全局的 JMeter实例
- 将变量写入文件并重新读取。
- 使用bsh.shared命名空间 - 请参阅16.8.2 Sharing Variables
- 编写自己的Java类
醇>
在线程之间传递变量的另一种方法是使用jmeter-plugins作为mentioned by Andrey Botalov below。
但是我发现第一次使用它有点令人困惑,但它在从线程到线程的过程中完全控制变量。 按照我使用BeanShell用法的例子,你会发现它是多么容易:
接下来参考下图中的部分:
(1.1)这里我在User Defined Variables中创建了自定义变量(或者你可以用BSF Proccessor - 在这个例子中禁用它)(1.2))
(2.1)(2.4)我在第一个线程中成功使用了变量 - 没什么特别的:)
(2.2)添加了BeanShell PostProcessor并自定义了我的变量
(2.3)将其添加到队列
(3.1)在第二个线程中 - 变量从队列中获取 - 具有您想要的任何名称。但是要小心,明智地使用Timeout,因为这个线程将等到前一个完成所以它可以得到修改变量(试验一些长响应)
(3.2)(3.3)(3,4)重复使用和修改变量
的步骤(3.5)变量在新队列中再次发送 - 因此为其提供新名称
(4.1)(4.2)(4.3)从新队列中抓取修改后的变量就像魅力
一样警告
如果添加更多线程,则将一些计数器添加到带有变量的线程组,并将此变量名称添加到队列名称 - 在您尝试捕获队列的线程组中执行相同操作,以便队列将具有每个线程的唯一名称(如果你需要更明确的表述,请写评论)
如果你在一个线程组中有多个http请求,那么添加线程通信预处理器作为最后一个孩子(或者如果你想实现一些自定义的东西,则为其他)http请求
播放,修改,自定义以获得最佳效果:)添加更多线程可能会导致不必要的行为,因此您需要注意。
答案 2 :(得分:9)
我发现我认为这是完成这项工作的最简单方法。
使用
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)}
答案 3 :(得分:8)
为此,JMeter插件有Inter-Thread Communication。
有两种使用方法:
__fifoPut
和__fifoPop
在我看来,PostProcessor / PreProcessor更易于使用。
答案 4 :(得分:4)
这在JMeter中是不可能的,因为它不是正常的客户端行为(在线程之间共享参数)。而不是使用一个带控制器的线程组:
Thread Group
+ Create inventory
+ + XPath
+ Loop
+ + Purchase inventory
答案 5 :(得分:4)
这是一种方法;按照这些步骤,它将工作,以后您可以根据您的需要进行调整!线程之间不共享变量(JMeter可能称之为功能:))。但属性是!因此,将您的变量设置为如此属性:
1)单击您的测试计划并启用“连续运行线程组” - >这使得线程组运行有序而不是随机。 (你可以稍后调整它,但现在让它工作..)
2)例如创建一个名为'setup'的线程组;在该线程组中,使用以下代码添加BeanShell Sampler:
import org.apache.jmeter.util.JMeterUtils;
JMeterUtils.setProperty("theNameOfYourNewProperty", "theValueOfYourPropery");
所以现在该物业已被设定!如果要存储为有效值的值是变量allready(例如用户定义变量或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}
它将适用于每个线程,而不仅仅是第一个线程..
答案 6 :(得分:1)
让'给主题第二次生命:)在线程之间传递变量的另一种方法是写/读到文件。 Passing variables between threads
答案 7 :(得分:1)
另一种解决方案是使用Simple Table Server来管理数据集。 此功能添加了1.2 JMeter插件。
"主要思想是在JMeter插件中使用微小的http服务器来管理数据集文件,只需使用简单的命令获取 / 添加数据行文件"
查看文档: http://jmeter-plugins.org/wiki/HttpSimpleTableServer/
问候。
答案 8 :(得分:0)
只需添加一个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