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

在JMeter中为同一请求的每次出现更新参数值,jmeter,blazemeter,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}"; Str

我正在准备作为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());
}
试试看{
int[]po={20,30,40,50,75};
int rNum=getRandom(0,4);
String name=“${name}”;
字符串_class=“${u class}”;
StringBuilder msgBody=新的StringBuilder();
msgBody.append(“{\”名称\“:\”)
.append(名称)
.append(“\”,“class\:\”)
.append(_类)
.附加(“\”,“\”标记“:[”);

对于(int i=0;i在scrips中使用
props
代替函数,使用
vars
代替变量

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

为什么您希望它会更改?JMeter属性对于整个JVM是全局的,并且在所有线程之间共享。因此
${uu p(marks${line\u offset}}}
将始终具有相同的值,除非您在其他地方设置它。根据:

属性与变量不同。变量是线程的局部变量;属性是所有线程的公共属性

还有几件事需要检查/修复:

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

    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.
    
    下次遇到问题时,请提供准确的代码

  • 用于脚本编写,主要是因为。特别是在您的情况下,使用和/或

  • 根据文档-可能是问题的主要原因:

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

    props.get(“START.HMS”);

    props.put(“PROP1”、“1234”);