在JMeter中针对同一请求的每次出现更新参数值

时间:2018-07-05 00:57:20

标签: jmeter blazemeter

我正在准备将数据作为HTTP请求的一部分发送, 因此数据准备部分是在BeanShell预处理器中完成的。

随着请求大小的变化,我需要传递可变长度的JSON。 我在for循环中创建JSON正文,但参数没有更改,例如:

try{
    int[] po = {20, 30, 40, 50, 75};
    int rNum = getRandom(0,4);

    String name="${name}";
    String _class="${_class}";
    StringBuilder msgBody = new StringBuilder();
    msgBody.append("{\"name\":\"")
    .append(name)
    .append("\", \"class\":\"")
    .append(_class)
    .append("\", \"marks\":[");
    for (int i=0;i<po\"[rNum];i++)
    {   
        msgBody.append("{ \"subject\":\"${__P(marks${line_offset})}\"," },");
     }
     int length=msgBody.length()-1;
     log.info(String.valueOf(length));
    msgBody.setLength(length);
    msgBody.append("] }");
    vars.put("json",msgBody.toString());
}

${__P(marks${line_offset})}在循环内保持不变。

如何启用循环内更改?

2 个答案:

答案 0 :(得分:1)

在脚本中,使用props代替函数,使用vars代替变量

  props.get("marks" + vars.get("line_offset"));

答案 1 :(得分:0)

您为什么期望它会改变? JMeter属性对于整个JVM是全局,并且在所有线程之间共享。因此,${__P(marks${line_offset})}将始终具有相同的值,除非您将其设置为其他位置。根据{{​​3}}:

  

属性与变量不同。变量是线程本地的;属性是所有线程共有的

需要检查/修复的其他几件事:

  1. 通常,您的脚本无法在当前状态下工作,因为它充满了错误,例如:

    int[] po\" = {20, 30, 40, 50, 75}; // won't compile due to \"
    String class="${class}"; // won't compile as "class" is a reserved keyword
    etc.
    

    下次您将遇到问题时,请提供确切的代码

  2. documentation用于编写脚本,主要是因为Since JMeter 3.1 it is recommended to use JSR223 Test Elements and Groovy language。特别是在您的情况下,您可以使用Groovy performance is much better comparing to Beanshell和/或JsonBuilder

  3. 根据JsonOutput文档-大概是造成问题的主要原因:

      

    JMeter在将脚本字段传递给解释器之前先处理函数和变量引用,因此引用将仅被解析一次。脚本文件中的变量和函数引用将逐字传递给解释器,这可能会导致语法错误。为了使用运行时变量,请使用适当的props方法,例如

         

    props.get("START.HMS");

         

    props.put("PROP1","1234");