Tod*_*d R 51 java testing jmeter beanshell
我有一个带有2个线程组的JMeter测试 - 第一个是单个线程(创建一些库存),第二个有多个线程(购买所有库存).我使用BeanShell Assertions和XPath Extractors来解析返回的值(即XML)并存储变量(例如要购买的项目的ID).
但是,在第一个线程组中创建的值,无论是提取到标准${jmeter}类型变量还是${__BeanShell(vars.get("jmeter"))}类型变量,都不能在第二个线程组中使用.无论如何在第一个Thread Group中创建一个变量并使其对第二个可见?
Tod*_*d R 68
我无法使用变量执行此操作(因为这些是各个线程的本地).但是,我能够用属性来解决这个问题!
同样,我的第一个ThreadGroup完成了所有的设置,我需要来自该工作的一些信息可用于第二个ThreadGroup中的每个线程.我在第一个ThreadGroup中有一个BeanShell Assertion,其中包含以下内容:
${__setProperty(storeid, ${storeid})};
Run Code Online (Sandbox Code Playgroud)
$ {storeid}是使用XPath Extractor提取的.BeanShell Assertion执行其他操作,例如检查从前一次调用返回的storeid等.
无论如何,在第二个ThreadGroup中,我可以使用Samplers中"storeid"属性的值,具有以下内容:
${__property(storeid)}
Run Code Online (Sandbox Code Playgroud)
奇迹般有效!
pba*_*ski 14
根据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请求
播放,修改,自定义以获得最佳结果:)添加更多线程可能会导致不必要的行为,因此您需要注意.

Jov*_*ias 10
我发现我认为这是完成这项工作的最简单方法.
使用
Bean Shell PostProcessor
Run Code Online (Sandbox Code Playgroud)
设置变量(http://jmeter.apache.org/usermanual/best-practices.html#bsh_variables)
import org.apache.jmeter.util.JMeterUtils;
JMeterUtils.setProperty("PC_CREATED_PROMO_CODE", "value");
Run Code Online (Sandbox Code Playgroud)
或者,如果您正在读取变量
import org.apache.jmeter.util.JMeterUtils;
JMeterUtils.setProperty("PC_CREATED_PROMO_CODE", vars.get("Extracted_PC_CREATED_PROMO_CODE"));
Run Code Online (Sandbox Code Playgroud)
然后从另一个线程组中读取它(http://jmeter.apache.org/usermanual/functions.html#__property)
${__property(PC_CREATED_PROMO_CODE)}
Run Code Online (Sandbox Code Playgroud)
小智 5

只需添加一个 bean shell 断言,使用属性函数将值分配给变量(如全局变量),即使该值转到其他线程,该变量也将保留该值。
线程组 >> 添加 >> 断言 >> Bean Shell 断言
${__setProperty(Global_variable_Name,${Variable_name_whose_Value_to_be_Passed})}
Run Code Online (Sandbox Code Playgroud)
然后在另一个线程中您可以调用这个全局变量并可以使用它
以下是调用存储值所需的函数:
${__property(global_variable_name)}
Run Code Online (Sandbox Code Playgroud)
https://medium.com/@priyank.it/jmeter-passing-variables- Between-threads-a4dc09903b59