如何返回一个jsonarray在BeanShell PostProcessor下一个测试用例在jmeter



得到如下列表后:

[{
    "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"):}})

有什么问题吗?

你的代码有几个问题:

  1. Iterator i = GroupList.iterator; -需要括号,因为iterator是方法,而不是字段。
  2. 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}

相关内容

最新更新