得到如下列表后:
[{
"id": "55af0d89ba411ff8b8000680",
},{
"id": "55af0d89ba411ff8b80006bc",
"object": {
"id": "55af0d89ba411ff8b80006bd",
}
}]
在BeanShell PostProcessor我有代码返回一个列表Id如下:
import org.json.simple.JSONObject;
import org.json.simple.JSONArray;
import org.json.simple.parser.JSONParser;
import java.util.*;
String response = prev.getResponseDataAsString();
JSONParser parser = new JSONParser();
JSONArray GroupList = (JSONArray) parser.parse(response);
Iterator i = GroupList.iterator;
JSONArray GroupIds = new JSONArray();
while (i.hasNext())
{
JSONObject objGroup = (JSONObject) i.next();
GroupIds.push(objGroup.get("id"));
}
vars.putObject("GroupIds",GroupIds);
对于下一个测试元素,我创建foreach Loop控制器来循环GroupIds
,但我在日志中看到,它有如下错误:
jmeter.util。调用bsh方法错误:源文件:内联求值:' ' importorg.json.simple.JSONObject;进口org.json.simple.JSONArray;进口Org . . . .类型变量声明:不能访问字段:对象上的迭代器:[{"id":"55 af0d89ba411ff8b8000680","名称":"公司","描述":"公司联系方式";"类型":"集团","created_at":"2015 - 07 - 22 t03:27:05z","updated_at":"2015 - 07 - 23 t02:45:02z","dominant_gender":"未知","average_age":"?"}, {"id":"55 af0d89ba411ff8b80006bc","名称":"订阅","描述":"订阅","类型":"订阅::SubscriptionList","average_age":"?"订阅":{"id":"55 af0d89ba411ff8b80006bd","名称":"订阅1";"form_ids"("5526430 cba411ff8c30001cd"):}})
jmeter.extractor。BeanShellPostProcessor:问题在BeanShell脚本调用bsh方法错误:源文件:内联求值:' ' importorg.json.simple.JSONObject;进口org.json.simple.JSONArray;进口Org . . . .类型变量声明:不能访问字段:对象上的迭代器:[{"id":"55 af0d89ba411ff8b8000680","名称":"公司","描述":"公司联系方式";"类型":"集团","created_at":"2015 - 07 - 22 t03:27:05z","updated_at":"2015 - 07 - 23 t02:45:02z","dominant_gender":"未知","average_age":"?"}, {"id":"55 af0d89ba411ff8b80006bc","名称":"订阅","描述":"订阅","类型":"订阅::SubscriptionList","average_age":"?"订阅":{"id":"55 af0d89ba411ff8b80006bd","名称":"订阅1";"form_ids"("5526430 cba411ff8c30001cd"):}})
有什么问题吗?
你的代码有几个问题:
-
Iterator i = GroupList.iterator;
-需要括号,因为iterator
是方法,而不是字段。 -
GroupIds.push(objGroup.get("id"));
-将push
更改为add
,没有push
方法
完整工作代码:
String response = prev.getResponseDataAsString();
JSONParser parser = new JSONParser();
JSONArray GroupList = (JSONArray) parser.parse(response);
Iterator i = GroupList.iterator();
JSONArray GroupIds = new JSONArray();
while (i.hasNext()) {
JSONObject objGroup = (JSONObject) i.next();
GroupIds.add(objGroup.get("id"));
}
vars.putObject("GroupIds", GroupIds);
顺便说一下,不建议在高负载下使用Beanshell,因为它不是很有效。对于一个线程来说,这是可以的,但是当它涉及到巨大的负载时,它可能会成为性能瓶颈,并可能破坏您的测试。如果是这样的话——考虑改用JSR223 PostProcessor和"groovy"语言。只需要做一点改动:
- 将groovy-all.jar添加到JMeter的/lib文件夹
- 用"groovy"引擎替换JSR223中所有的Beanshell测试元素
请参阅Beanshell vs JSR223 vs Java JMeter脚本:您一直在等待的性能下降!文章提供详细的安装说明、脚本技巧和技巧以及不同脚本引擎的性能基准。
UPDATE -为ForEach Controller生成变量:
import org.json.simple.parser.JSONParser;
import org.json.simple.JSONArray;
import org.json.simple.JSONObject;
String response = prev.getResponseDataAsString();
JSONParser parser = new JSONParser();
JSONArray GroupList = (JSONArray) parser.parse(response);
for (int i = 0; i < GroupList.size(); i++) {
JSONObject objGroup = (JSONObject) GroupList.get(i);
vars.put("Group_" + i, objGroup.get("id"));
}
然后添加一个ForEach Controller,并按如下配置:
- 输入变量前缀
Group
- 起始索引:
-1
- 输出变量名称:
CURRENT_GROUP
- 在数字前添加"_"-勾选
在需要的地方使用${CURRENT_GROUP}