Jmeter性能测试JSONObject not found in namespace

背景:性能测试时,我们需要对上个请求返回的json数据提取里的一个子json做加工处理。子json可能是一个简单的json,也可能是一个json对象数组。根据不同的业务请求json数据。用jmeter自带的正则提取不是很好动态处理。

1、在http请求加BeanShell后置处理程序,输入以下代码。报如下错。

Jmeter性能测试JSONObject not found in namespace
2019-11-28 09:55:00,678 ERROR o.a.j.u.BeanShellInterpreter: Error invoking bsh method: eval    Sourced file: inline evaluation of: ``import org.apachejmeter.assertions; import org.apachejmeter.samples.SampleResult . . . '' : Typed variable declaration : Class: JSONObject not found in namespace

解决办法:通过maven去下载jar包,放到D:\tools\apache-jmeter-5.1.1\lib\ext 目录下,重启Jmeter即可解决。

<!-- https://mvnrepository.com/artifact/org.json/json -->
<dependency>
    <groupId>org.json</groupId>
    <artifactId>json</artifactId>
    <version>20190722</version>
</dependency>
 

2、在jmeter BeanShell上代码不是很好封装,最后选择在IEDA上使用fastjson做json处理。写好代码生成jar包,放到D:\tools\apache-jmeter-5.1.1\lib\ext里。通过参数去调jar里的类和方法。为了方便,类里的方法使用静态 公共的方法。

public static String para(String response_data){
    JSONObject  response_data_obj = JSONObject.parseObject(response_data);
    Object data=response_data_obj.get("data");//.get("attack_data").get("animal_list").toString();
    //Object data=response_data_obj.get("data").get("attack_data").get("animal_list").toString(); jmeter Beahshell里可以直接这样调,但是java IEDA工具里只能一层一层去获取json的key值。
    //System.out.println(response_data);
    //System.out.println(data.toString());

    JSONObject  attack_data_obj = JSONObject.parseObject(data.toString());
    Object attack_data=attack_data_obj.get("attack_data");

   // System.out.println("attack_data:"+attack_data.toString());

    JSONObject  animal_list_obj = JSONObject.parseObject(attack_data.toString());
    Object animal_List_obj=animal_list_obj.get("animal_list");

    //获取animal_list数组对象
    JSONArray res = animal_list_obj.getJSONArray("animal_list");

    List<Animal_list> rules = new ArrayList<Animal_list>();
    for (int i = 0; i < res.size(); i++) {
        JSONObject Animal_listi = (JSONObject) res.get(i);
        Animal_list Animal_list1;
        Animal_list1 = JSONObject.toJavaObject(Animal_listi,Animal_list.class);//把json转为java对象
     
        rules.add(Animal_list1);
     }

    String s = rules.toString();
    System.out.println(s);
    return s;

Animal_list.class 基类,在这里自动给他多增加了一个属性。

package cn.oscar.game;
public class Animal_list {

    private int id;
    private int num;
    private int type;

    public Animal_list(int id, int num) {
        this.id = id;
        this.num = num;
        this.type = 10;
    }

    public void setId(int id) {
        this.id = id;
    }

    public int getId() {
        return id;
    }

    public void setNum(int num) {
        this.num = num;
    }

    public int getNum() {
        return num;
    }

    public void setType(int type) {
        this.type = 10;
    }

    public int getType() {
        return type;
    }

    @Override
    public String toString() {
        return "{\"id\":" + id + ",\"num\":" + num + ",\"type\":" + type + "}";

    }
}

3、Jmeter Bean shell最终代码如下

import org.apachejmeter.assertions;
import org.apachejmeter.samples.SampleResult;
import org.apachejmeter.assertions.AssertionResult;
import cn.oscar.game.Test;

String response_data =prev.getResponseDataAsString();
//JSONObject  data_obj = new JSONObject(response_data);
log.info("res:"+response_data);

data=Test.para(response_data); //这里data没有做对象申明,如果做了会导致第一次运行正常,循环第二次会报错。

vars.put("data_test",data.toString());