在逻辑控制器中使用属性作为输入变量前缀(即foreach)

时间:2015-02-23 10:10:15

标签: jmeter

在JMeter中,我将一个属性列表从一个线程组导出到另一个线程组。 他们看起来像:

prop_1="value1"
prop_2="value2"
prop_3="value3"
prop_4="value4"
prop_#="4"

现在在第二个线程组中我想循环它们 - 我试图用foreach控制器做到这一点。 但是,foreach控制器需要变量前缀而不是属性前缀。 有什么方法可以解决这个问题吗? 一种方法可能是将所有属性复制到预处理器中的变量中,但这听起来非常笨拙。

背景: 我的第一个线程组触发了几个较长持续时间的作业执行。 第二个线程组将轮询数据库,直到完成每个作业。为此,它需要知道初始线程组创建的作业名称(在上面的例子中为“value1..4”)。 是否有更好的方法将作业名称从一个线程组转移到另一个线程组而不是使用属性?

1 个答案:

答案 0 :(得分:3)

事实上,在调查ForEach Controller source时,ForEach Controller似乎只关注JMeter变量。

final JMeterVariables variables = context.getVariables();
final Object currentVariable = variables.getObject(inputVariable);
if (currentVariable != null) {
    variables.putObject(getReturnVal(), currentVariable);
    if (log.isDebugEnabled()) {
        log.debug("ForEach resultstring isDone=" + variables.get(getReturnVal()));
    }
    return false;
}

但是,可以使用Beanshell脚本将JMeter属性转换为JMeter变量。

例如,如果您需要将所有以prop_开头的JMeter属性转换为具有相同名称的JMeter变量,请在ForEach控制器之前添加Beanshell Sampler并将以下代码放入其中。 s"脚本"面积:

Enumeration e = props.propertyNames();
while (e.hasMoreElements()) {
  String propertyName = e.nextElement().toString();
  if (propertyName.startsWith("prop_")) {
      vars.put(propertyName, props.getProperty(propertyName));
  }
}

上面的代码将迭代所有JMeter属性,查找以prop_开头的那些并将它们转换为可以在ForEach控制器中使用的JMeter变量。

有关Apache JMeter中Beanshell脚本的更多信息,请参阅How to use BeanShell: JMeter's favorite built-in component指南。