Jmeter通过Beanshell处理复杂业务逻辑
通过Jmeter进行接口测试的过程中,需要根据返回的数据状态进行操作。但是接口返回的数据、状态是动态的。这时候我们就需要用到beanshell元件,通过编写JAVA脚本来处理复杂逻辑,beanshell脚本语言完全符合java 语法,并且又拥有自己的一些语法和方法。如下为查询到的数据,当数据的“codeStatus”字段为5时可以进行启用操作;当数据的“codeStatus”字段为4时可以进行删除操作。我们要根据不同状态对应的“id”进行对应的操作,即取出状态为4的数据id和状态为5的数据id。
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
{ "msg": null, "code": "500200", "data": { "msg": null, "code": null, "data": [ { "idCreateUser": null, "setAddLimit": true, "pv": 0, "remark": null, "skipVerify": true, "createUserName": "凤", "type": 3, "gmtCreate": "2021-07-22 17:21:48", "setRoundLimit": null, "codeStatus": 5, "errorMsg": null, "expiryDate": "2021-10-20 23:59:59", "qrCode": null, "configId": null, "id": 1040, "channelId": 135, "setDailyLimit": true, "useNameList": [] }, { "idCreateUser": null, "setAddLimit": true, "pv": 0, "remark": null, "skipVerify": true, "createUserName": "凤", "type": 4, "gmtCreate": "2021-07-22 17:21:47", "setRoundLimit": null, "codeStatus": 4, "errorMsg": null, "expiryDate": "2021-10-20 23:59:59", "qrCode": null, "configId": null, "id": 1039, "channelId": 135, "setDailyLimit": true, "useNameList": [] } ] }, "success": true }
1、首先在查询数据接口的下面添加后置处理Bean Shell Postprocessor,因为返回的数据是JSON格式,需要用到json.jar包对JSON数据进行处理。下载jar包并放在jmeter安装目录下的lib目录,链接:https://pan.baidu.com/s/1EOpl5aPJ4xUqwUxbrlS7Yg 提取码:1234
2、编写BeanShell脚本,将取到的数据id分别赋值给自定义变量normal_id和invalid_id,默认值分别为“-1”和“-2”。
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
1 import org.json.*; // 导入json包 2 3 String response_data = prev.getResponseDataAsString(); //自定义一个变量response_data,来获取个人活码列表接口的返回值 4 JSONObject response = new JSONObject(response_data); 5 JSONArray list = response.getJSONObject("data").getJSONArray("data"); //自定义一个列表list,来获取响应中data对象下的data数组 6 JSONObject list_data = null; 7 String normal_id = "-1"; //自定义变量,将最终取到的正常状态的数据id赋值给该变量 8 String invalid_id = "-2"; //自定义变量,将最终取到的作废状态的数据id赋值给该变量 9 10 for (int i = 0; i<list.length(); i++ ){ 11 list_data = (JSONObject)list.getJSONObject(i); 12 int status=list_data.getInt("codeStatus"); //把对象中codeStatus的值转换成整型 13 14 if(status==5){ // 如果第i条的数据等于5,获取该条数据的id给normal_id 15 normal_id = list_data.getString("id").toString(); 16 } 17 else if(status==4){ // 如果第i条的数据等于4,获取该条数据的id给invalid_id 18 invalid_id = list_data.getString("id").toString(); 19 } 20 else{ 21 continue; 22 } 23 } 24 25 log.info("正常状态的数据id:"+normal_id); 26 log.info("作废状态的数据id:"+invalid_id); 27 vars.put("normal_id",normal_id); //把状态等于5(正常)的数据id值赋予给参数normal_id 28 vars.put("invali_id",invalid_id); //把状态等于4(正常)的数据id值赋予给参数invalid_id
3、根据步骤2数据的返回结果,对数据进行操作。添加逻辑控制器 if contrllor,如果normal_id不等于“-1”,说明返回有正常状态的数据,就执行if控制器下面的接口。可以使用${__jexl3(${normal_id}!="-1",)}进行判断,具体操作如下:
3.1 添加if控制器
3.2 使用函数助手对话框中的jexl3函数,对数据进行判断
将判断表达式填写在Expression输入框里
3.3 同理,通过if控制器来判断是否执行对数据的删除操作,即invalid_id!=“-2”;
4、最后,可以通过控制台查看变量的输出结果