在JMeter java api中如何在PreProcessor采样器中设置POST Form值?

时间:2016-03-04 10:11:41

标签: java jmeter http-post

在我写的PreProcessor中,我可以通过sampler成功更新GET查询字符串。

但是如果我在POST中使用相同的方法,而我可以通过getArguments()列出FORM字段,则不会设置该值。

  Arguments arguments = sampler.getArguments();
  for (int i=0; i<arguments.getArgumentCount(); i++) {
      Argument argument = arguments.getArgument(i);
      if (argument.getName().equals("page_submission_id")) {
          String newVal = "8743718386872";                         
          argument.setValue(newVal);
          System.out.println("Setting arg["+argument.getName()+"] to["+newVal+"]");
      }
  }
  sampler.setArguments(arguments);  
  printArgs(arguments);  

此输出显示参数值未更改。

Setting arg[page_submission_id] to[8743718386872]
Arguments After
   ...
   Found arg[page_submission_id] is[XXXXXXXXXXXXX]
   ...

进一步挖掘jmeter代码后,属性对象的“runningVersion”属性(通过isRunningVersion())设置为true。

我尝试了几种方法来解决这个问题:

  • 强制runningVersion为false - 然后设置值但发送GET消息
  • 创建一个新的Arguments对象并使用值向其添加新的Argument条目 - 这不会更改值

有人能指出在发送之前设置POST FORM字段值的官方方式吗?

谢谢

2 个答案:

答案 0 :(得分:0)

好吧,你为一个参数分配一个新值,但是我没有看到你在哪里更新了具有新值的参数的sampler&#s参数。

我非常相信KISS原则,所以我建议您按照以下步骤简化脚本,而不是添加更多行:

import org.apache.jmeter.config.Argument;

sampler.getArguments().removeArgument("page_submission_id");
sampler.addArgument("page_submission_id","8743718386872"); 

此外,我希望您使用JSR223 PreProcessor and Groovy language

答案 1 :(得分:0)

我设法解决了这个问题:

  1. (最初)通过清理线程池,作为我的初始 尝试包括了许多诸如“正则表达”之类的东西 提取器“和”用户定义的变量“。一旦删除 我使用的方法成功地改变了参数值,
  2. (当我的设置更深入时,问题又回来了)通过添加新Argments对象的创建并插入(按相同顺序)新的Argument对象,其值设置为我需要的值。然后设置采样器以使用新的Arguments对象。

    Arguments newArgs = new Arguments();
    Arguments arguments = sampler.getArguments();
    
    for (int i=0; i<arguments.getArgumentCount(); i++) {            
        Argument argument = arguments.getArgument(i);
        HTTPArgument newArg = new HTTPArgument();
    
        newArg.setName(arguments.getName());                            
        if (arguments.getName().equals("field_to_replace")) {
            newArg.setValue("new value");
        }
        else {
            newArg.setValue(arguments.getValue());
        }
        newArgs.addArgument(newArg);
    }
    sampler.setArguments(newArgs);
    
  3. 我认为这是由“Argument.setValue()”使用的setProperty()中的“if(isRunningVersion())”测试,我正在绊倒。

    虽然这似乎有效(对于我到目前为止的测试用例),但我很欣赏这可能不是正确的正式方法。