beanshell数组批量数组数据传入数组类型参数接口场景——BeanShell完美解决
1.概述
做自动化接口测试会遇到许多的测试场景,有些复杂的场景需要脚本语言的参与才能帮助我们胜任自动化测试,下面就来介绍一个复杂场景解决思路。
1.1.场景描述
- A接口返回值中有一个参数是数组类型且该数组中有多个值。
- B接口参数入参也是一个数组类型且它的参数必须是A接口动态返回的数组类型中全部的数据。
1.2.场景接口数据展示
A接口返回数据类型结构
从接口返回数据中遍历data数组,提取出所有的id值,然后保存到新的数组变量。
{
"code": 0,
"data": [
{
"id": 1,
"menuId": null,
"operateName": "购物车",
"selected": false
},
{
"id": 2,
"menuId": null,
"operateName": "订单",
"selected": false
},
{
"id": 4,
"menuId": null,
"operateName": "拼单",
"selected": false
},
{
"id": 5,
"menuId": null,
"operateName": "上架新品",
"selected": false
},
{
"id": 6,
"menuId": null,
"operateName": "商品详情",
"selected": false
},
{
"id": 7,
"menuId": null,
"operateName": "好友圈",
"selected": false
},
{
"id": 8,
"menuId": null,
"operateName": "销售额",
"selected": false
},
{
"id": 9,
"menuId": null,
"operateName": "用户详情",
"selected": false
},
{
"id": 10,
"menuId": null,
"operateName": "短信",
"selected": false
},
{
"id": 11,
"menuId": null,
"operateName": "售后",
"selected": false
}
],
"message": "成功"
}
B接口入参结构
B接口shopId参数是一个数组类型,它的值既不是固定的且不是一个值,而是A接口返回的所有值。每次自动化测试的时候都需要将A接口返回数组的值全部传入B接口中。
{
"data": {
"shopId": [
1,
2,
3,
4,
5,
6,
7,
8,
9,
10
]
}
}
1.3.测试思路分析
- 我们要做的事情从A接口拿到数组并传给B接口。
- 难点分析如何将A接口返回的数组数据保存到变量中,然后如何将数组所有的数据赋值给B接口的参数。
2.开发脚本实现传入批量数据场景
2.1.导入jar包
在脚本开发中需要引入两个jar包,他们帮助我们实现核心功能。
-
jar包上传入口
-
上传jar包
上传jar包路径,在我们本地安装的java \jre\lib\rt.jar
2.2.封装A接口数据脚本
脚本开发思路在脚本注释中非常完善,这里就不再描述。
//注意必须导入这两个包,否则脚本运行会保存找不到这两个包提供的方法
import org.json.*;
import java.util.Collections;
public static void getValue(){
// 接收接口返回的数据
String response_data = prev.getResponseDataAsString();
// 转换成JSONObject 对象类型,这样java才能操作对象里面数据
JSONObject data_obj= new JSONObject(response_data);
//判断当前响应数据是否为空,如果为空直接返回null,不再走后面的for流程。
if (data_obj.get("data").equals(null)){
log.info("接口返回数据列表为空");
} else{
// 获取JSONObject里面数组类型数据 data是个数组类型,将数组赋值给JSONArray
JSONArray data_array = data_obj.getJSONArray("data");
int len = data_array.length();
// 创建List集合封装数组数据
ArrayList ids = new ArrayList();
// 遍历数组数据,将数据封装到集合中
for(int i=0;i<len;i++){
JSONObject jsonTemp = (JSONObject)data_array.getJSONObject(i);
ids.add(jsonTemp.get("id"));
}
/*
这里非常关键,这里**也是一个坑**。
jmeter设置变量有两个方法,它们的使用场景区别非常大,用错了就无法取到值。
vars.put("key","value"): 该方法的value值只能是字符串类型,传入其他的类型就会报错。
vars.putObject("key",list、Object):该方法的value值类型可以接收Object类型、List、数组类型。
*/
vars.putObject("menuId",ids);
log.info("测试========" + ids);
}
}
getValue();
2.3.接收数组参数脚本
B接口调用A接口变量时会有一个坑,引用变量时千万不能加上双引号否则会强转,导致接口返回失败。