我有一个带有2个线程组的JMeter测试 - 第一个是单个线程(创建一些库存),第二个有多个线程(购买所有库存).我使用BeanShell Assertions和XPath Extractors来解析返回的值(即XML)并存储变量(例如要购买的项目的ID).
但是,在第一个线程组中创建的值,无论是提取到标准${jmeter}
类型变量还是${__BeanShell(vars.get("jmeter"))}
类型变量,都不能在第二个线程组中使用.无论如何在第一个Thread Group中创建一个变量并使其对第二个可见?
我无法使用变量执行此操作(因为这些是各个线程的本地).但是,我能够用属性来解决这个问题!
同样,我的第一个ThreadGroup完成了所有的设置,我需要来自该工作的一些信息可用于第二个ThreadGroup中的每个线程.我在第一个ThreadGroup中有一个BeanShell Assertion,其中包含以下内容:
${__setProperty(storeid, ${storeid})};
$ {storeid}是使用XPath Extractor提取的.BeanShell Assertion执行其他操作,例如检查从前一次调用返回的storeid等.
无论如何,在第二个ThreadGroup中,我可以使用Samplers中"storeid"属性的值,具有以下内容:
${__property(storeid)}
奇迹般有效!
根据JMeter文档:
16.12在线程和线程组之间共享变量
变量是线程的本地变量,一个线程中的变量集不能在另一个线程中读取.这是设计的.对于可在测试开始前确定的变量,请参阅参数化测试(上文).如果在测试开始之前不知道该值,则有多种选择:
将变量存储为属性 - 属性对JMeter实例是全局的
将变量写入文件并重新读取.
使用bsh.shared命名空间 - 请参见 16.8.2共享变量
编写自己的Java类
在线程之间传递变量的另一种方法是使用下面的Andrey Botalov提到的 jmeter-plugins .
但我发现第一次使用它有点令人困惑,但它在从线程到线程的过程中完全控制变量.按照我使用BeanShell用法的例子,你会发现它是多么容易:
接下来参考下图中的部分:
(1.1)这里我在用户定义的变量中创建了自定义变量(或者你可以用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)新队列中的抓取修改变量就像魅力一样
警告
如果添加更多线程,则将一些Counter添加到带有变量的Thread Group,并将此变量名称添加到队列名称 - 在Thread Group中尝试捕获队列时执行相同的操作,以便队列为每个线程创建唯一的名称(如果您在需要一些更明确的表达方式)
如果你在一个线程组中有多个http请求,那么添加线程通信预处理器作为最后一个子节点(或者如果你想实现一些自定义的东西,则添加其他的)http请求
播放,修改,自定义以获得最佳结果:)添加更多线程可能会导致不必要的行为,因此您需要注意.
我发现我认为这是完成这项工作的最简单方法.
使用
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)}
JMeter插件具有用于此目的的线程间通信.
有两种方法可以使用它:
PostProcessor中/预处理器
功能__fifoPut
和__fifoPop
在我看来,PostProcessor/PreProcessor更容易使用.