首页 > 解决方案 > 为什么在 JSR223 PreProcessor 中替换 POST 参数会在后续迭代中将其删除?

问题描述

我正在使用带有以下代码的 JSR223 PreProcessor 更改几个 POST 请求值:

import org.apache.jmeter.config.Argument;  
import org.apache.jmeter.config.Arguments;

def length = 10 // the size of the random string
def pool = ['a'..'z', 'A'..'Z', 0..9, '-'].flatten() // generating pool
Random random = new Random(System.currentTimeMillis())

def randomChars = (0..9).collect { pool[random.nextInt(pool.size())] }
def randomString = randomChars.join()


Arguments arguments = sampler.getArguments();
for (int i=0;i<arguments.getArgumentCount();i++)
{
  Argument argument = arguments.getArgument(i);
  String name = argument.getName();
  String value = argument.getValue();
  if(name =="mainForm:firstName"){
    sampler.getArguments().removeArgument("mainForm:firstName");        
    sampler.addArgument("mainForm:firstName",randomString); 
    log.info("Name is " + randomString);
}


if(name =="mainForm:covers:0:sumInsured"){
      sampler.getArguments().removeArgument("mainForm:covers:0:sumInsured");
    value = value.replace("\$","");
    value = value.replace(",", "");
    def val = Double.parseDouble(value);
    val++;
                sampler.addArgument("mainForm:covers:0:sumInsured","\$"+String.valueOf(val)); 
    }
}

我可以看到第一次迭代的日志输出,但后续的没有任何迹象表明由于某种原因不再找到参数。

我将这个预处理器附加到它正在修改的 HTTP 请求上。

知道为什么它只运行一次吗?

我注意到 Arguments 的源代码中提到了 isRunningVersion() - 这是做什么的?

    public  void addArgument(Argument arg) {
    TestElementProperty newArg = new TestElementProperty(arg.getName(), arg);
    if (isRunningVersion()) {
        this.setTemporary(newArg);
    }
    getArguments().addItem(newArg);
}

标签: groovyjmeterjsr223

解决方案


尝试使用HTTPArgument而不是通用参数,例如:

sampler.addArgument(new HTTPArgument("mainForm:firstName",randomString));

还要检查jmeter.log文件中是否有任何可疑条目,并检查通过View Results Tree侦听器发送的内容。

另请注意,您可以完全不使用脚本来实现您的要求,请查看以下JMeter 函数


推荐阅读