JMeter通过JSONExecutor对返回结果解析后,根据结果再执行循环请求的实现方案
- 在使用JMeter编写压力测试计划时,需求实现根据请求的返回结果(json或xml等结构化半结构化的结果都可以,只要可以通过代码解析即可),进行下一步的循环请求
参照 CSDN-存亡祸福,其要在身 博文【JMeter 实现获取 Response Json 转换为变量后循环查询】
目录
一、测试场景
- 当前案例测试场景:
- 用户登录成功后,通过返回的根节点ID请求一级部门;
- 解析一级部门请求的返回结果中的二级部门ID集合;
- 循环二级部门ID集合,循环请求二级部门的下级;
二、一级部门请求
通过添加一个取样器,将登录成功的根节点ID(从全局变量中获取的)放入请求参数中
设置全局变量和如何使用全局变量可以参照另一个博文【JMeter全局变量在使用时有时会取到null的问题解决】
在此就不展示具体的请求参数了
三、一级部门请求结果解析
- 实现方式就是通过BeanShell取样器(BeanShellSampler),在请求取样器[一级部门请求]下,添加一个BeanShell Sampler,来解析返回结果;
- 重点:要将二级部门ID集合中的每个元素存入变量中,形式为:变量名+索引下标,取的时候按变量名+循环控制变量值即可
- 下面是BeanShell中的java代码,用于解析json结果,其中import net.sf.json. 是解析json需要引入的jar,将第三方的jar直接放到JMeter安装目录\lib\ext\目录下重启JMeter,并在测试计划中将此jar加入classpath中
BeanShell脚本代码如下:
import net.sf.json.JSONObject;
import net.sf.json.JSONArray;
//获取请求返回值。注意此处只能获取到String类型;
String response_data = prev.getResponseDataAsString();
log.info("=================== response_data ===================");
log.info(response_data);
JSONObject data_obj = JSONObject.fromObject(response_data);
if (data_obj != null) {
JSONObject body_obj = data_obj.getJSONObject("body");
int departmentslen = 0;
if (!body_obj.getJSONArray("departments").isEmpty()) {
JSONArray departments = body_obj.getJSONArray("departments");
// https://blog.csdn.net/qq_27009225/article/details/112628385
log.info("——————————————| departments:"+ departments + "|——————————————");
//获取departments数组的长度
departmentslen = departments.size();
for(int i = 0; i < departmentslen; i++) {
String departmentID = departments.getJSONObject(i).getString("departmentID").toString();
log.info("——————————————| departmentID:"+departmentID+" |——————————————");
vars.put("departmentID"+i,departmentID);
}
}
log.info("——————————————| departmentslen:"+departmentslen.toString()+" |——————————————");
vars.put("departmentslen",departmentslen.toString());
}
四、循环二级部门ID集合
4.1 添加逻辑控制器-Loop Controller
循环次数通过
二级部门
I
D
集合元素数量变量名
,本例中是
{二级部门ID集合元素数量变量名},本例中是
二级部门ID集合元素数量变量名,本例中是{departmentslen}
4.2 添加用户定义变量
右键 Add->Config Element->User Defined Variables
4.3 在循环内添加请求sampler
使用嵌套变量:${__V(外层变量${内层变量})}(i=0,departmentID=xxxxxx,组合后${__V(departmentID${i})}=xxxxxx0)
4.4 最后添加循环控制变量自增处理
通过添加BeanShell Sampler,在脚本对变量i实现自增
int a1 = Integer.valueOf(${i});
int i = a1+1;
vars.put("i",i.toString());
log.info("——————————————| i:"+i.toString()+" |——————————————");