当前位置:  开发笔记 > 编程语言 > 正文

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

如何解决《如何在JMeter中将变量从一个线程组传递到另一个线程组》经验,为你挑选了4个好方法。

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

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



1> Todd R..:

我无法使用变量执行此操作(因为这些是各个线程的本地).但是,我能够用属性来解决这个问题!

同样,我的第一个ThreadGroup完成了所有的设置,我需要来自该工作的一些信息可用于第二个ThreadGroup中的每个线程.我在第一个ThreadGroup中有一个BeanShell Assertion,其中包含以下内容:

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

$ {storeid}是使用XPath Extractor提取的.BeanShell Assertion执行其他操作,例如检查从前一次调用返回的storeid等.

无论如何,在第二个ThreadGroup中,我可以使用Samplers中"storeid"属性的值,具有以下内容:

${__property(storeid)}

奇迹般有效!


太糟糕的属性无法存储对象...实际上似乎`get()`和`put()`方法仍可从HashTable获得.如果我滥用jmeter属性来存储对象值会不会很糟糕?我的问题是我希望所有线程共享同一个对象,以避免在我运行大量线程时创建多个对象.

2> pbaranski..:

根据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请求

播放,修改,自定义以获得最佳结果:)添加更多线程可能会导致不必要的行为,因此您需要注意.

有关项目结构的信息



3> Joviano Dias..:

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

使用

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)}



4> Andrei Botal..:

JMeter插件具有用于此目的的线程间通信.

有两种方法可以使用它:

PostProcessor中/预处理器

功能__fifoPut__fifoPop

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

推荐阅读
谢谢巷议
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有