周末学习了一下beanshell脚本的使用,下面用一个例子演示下
首先一个请求A的响应内容如下
{ "status": "ok", "msg": "ok", "data": { "records": [{ "id": 223, "contractClassify": null, "contractClassifyId": 874, "contractTypeId": 2, "formId": "135", }, { "id": 229, "contractClassify": null, "contractClassifyId": 874, "contractTypeId": 1, "formId": "137", ], "total": 13, "size": 10, "current": 1, }, }
在进行处理前,先把一个jar包放进jmeter安装目录下的lib目录下 json-20180130.jar
在请求A下新增一个BeanShell后置处理器,然后可以在里边编写脚本来处理数据
1、首先先把返回内容转为一个json对象
- 使用 prev.getResponseDataAsString()获取上个请求的返回数据(字符串格式);
- 利用 JSONObject 将返回数据构造成一个 JSONObject对象,并将其赋给 responseData;
- 使用log.info()打印一下结果,注意在使用log.info()时需要使用toString()将json对象转为字符串才能正常打印
import org.json.*; String responseData = prev.getResponseDataAsString(); //获取请求的返回结果 JSONObject response = new JSONObject(responseData); //把返回值构造为json对象 log.info("response="+response.toString()); // 打印一下结果
2、获取返回数据中的 "data"
- 使用 xx.get(key) 获取某个字段的内容
data = response.get("data"); //获取返回数据中的data log.info("data="+data.toString());
3、获取 "data"下的"total"
- 如果json对象下嵌套了json对象,可以继续使用 .get(key) 来获取嵌套字段的内容
total = response.get("data").get("total"); //获取返回数据中data下的total log.info("total="+total.toString());
4、获取 "data"下"records"的内容
- 由于records的内容是个数组,所以要使用 getJSONArray() 来获取它的数据
records = response.get("data").getJSONArray("records"); //使用getJSONArray提取records数组 log.info("records="+records);
5、获取record数组的长度
int len = records.length(); // 获取数组的长度 String strlen = Integer.toString(len); //转为字符串 log.info("len="+strlen); // 打印结果,其实直接打印len也行
6、设置一个新变量,给后面请求使用
vars.put("temp", String.valueOf(total)); // 创建一个变量temp,并把total的值转成字符串赋给它(必须转成字符串再赋给temp,不然会报错,也可以使用total.toString()转换)
再新建一个请求B,然后在请求B下添加一个BeanShell后置处理器,如下
这个BeanShell脚本如下
String temp1 = vars.get("temp"); log.info("temp1="+temp1)
执行结果如下
可以看到变量temp在下一个请求中引用成功,并且在后续的beanshell脚本中也能通过 vars.get(String key)获取(注意变量名加引号)