我正在准备将数据作为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})}
在循环内保持不变。
如何启用循环内更改?
答案 0 :(得分:1)
在脚本中,使用props
代替函数,使用vars
代替变量
props.get("marks" + vars.get("line_offset"));
答案 1 :(得分:0)
您为什么期望它会改变? JMeter属性对于整个JVM是全局,并且在所有线程之间共享。因此,${__P(marks${line_offset})}
将始终具有相同的值,除非您将其设置为其他位置。根据{{3}}:
属性与变量不同。变量是线程本地的;属性是所有线程共有的
需要检查/修复的其他几件事:
通常,您的脚本无法在当前状态下工作,因为它充满了错误,例如:
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.
下次您将遇到问题时,请提供确切的代码
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
根据JsonOutput文档-大概是造成问题的主要原因:
JMeter在将脚本字段传递给解释器之前先处理函数和变量引用,因此引用将仅被解析一次。脚本文件中的变量和函数引用将逐字传递给解释器,这可能会导致语法错误。为了使用运行时变量,请使用适当的props方法,例如
props.get("START.HMS");
props.put("PROP1","1234");