多接口批量执行
ExcelUtils类新增getApiAndCaseByApiId方法
把2个list对象api、case转成指定格式的二维数组,1个api对应多个case,可以通过apiid来实现多接口批量执行
//返回二维数组<api、case>,根据apiid找到对应的apiinfo和caseinfo
public static Object[][] getApiAndCaseByApiId(String apiId) {
//所有的接口信息保存到apiList中
List<ApiInfo> apiList = getElement(0, 1, ApiInfo.class);
//所有的接口信息保存到caseList中
List<CaseInfo> caseList = getElement(1, 1, CaseInfo.class);
//指定apiid对应的api对象(唯一的)保存到wantApi中
ApiInfo wantApi = null;
//指定apiid对应的所有case对象保存到wantCase中
ArrayList<CaseInfo> wantCase = new ArrayList<CaseInfo>();
for(ApiInfo api : apiList) {
if(apiId.equals(api.getApiId())) {
wantApi = api;
break;
}
}
for (CaseInfo c : caseList) {
if(apiId.equals(c.getApiId())) {
wantCase.add(c);
}
}
Object[][] datas = new Object[wantCase.size()][2];
for(int i=0;i<datas.length;i++) {
datas[i][0] = wantApi;
datas[i][1] = wantCase.get(i);
}
return datas;
}
RegisterCase类修改
public class RegisterCase {
@Test(dataProvider = "datas")
//修改test方法入参,传api和case对象就可以不关注2个对象的具体属性变化
public void test(ApiInfo api,CaseInfo c) {
HttpUtils.call(api.getApiUrl(),api.getApiMethod(),c.getParams());
}
@DataProvider
public Object[][] datas(){
//假设注册接口的在接口信息excel里的ApiId=1
Object[][] datas = ExcelUtils.getApiAndCaseByApiId("1");
return datas;
}
}
新增LoginCase类
//其他写法和RegisterCase类一致,只需要修改ApiId即可。假设登录接口的在接口信息excel里的ApiId=2
Object[][] datas = ExcelUtils.getApiAndCaseByApiId("2");
testng.xml里配置多接口案例执行
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE suite SYSTEM "http://testng.org/testng-1.0.dtd" >
<suite name="接口自动化" parallel="false">
<test name="用户模块">
<classes>
<class name="testcase.RegisterCase"/>
//新增了登录接口,就新增一行class
<class name="testcase.LoginCase"/>
</classes>
</test>
</suite>
通过testng方式运行程序,可查看结果
优化:所有的api和case信息只需要读取一次即可
把getApiAndCaseByApiId方法里的apiList和caseList移出,并且放在ExcelUtils类中做成员变量
public static List<ApiInfo> apiList;
public static List<CaseInfo> caseList;
在任何一个案例类中增加BeforeSuite注解实现执行整个测试套件前读取整个接口和案例信息类
@BeforeSuite
private void init() {
ExcelUtils.apiList = ExcelUtils.getElement(0, 1, ApiInfo.class);
ExcelUtils.caseList = ExcelUtils.getElement(1, 1, CaseInfo.class);
}
注意:caseList和wantCase这2个list命名问题,一开始都定义成caseList导致运行报错
再次通过testng方式运行程序,查看程序运行是否ok