▼
关注测试君 | 会上瘾
前端很简单,点击“执行”按钮即可,会像后端传入该集合的id
后端拿到集合id后,会执行以下几步操作:
拿到所有全局变量
拿到集合变量(集合变量只会在该集合内生效,不会在其他集合中生效)
声明测试报告的保存路径
更新集合的最后执行人与最后执行时间
调用testng类,进行接口执行,并生成报告
Service
@Overridepublic ResponseVo collectionExcute(Integer collectionId) {
ResponseVo responseVo = new ResponseVo();
ApiTestConfig.apiList = apiTestCaseMapper.selectCollectionApiList(collectionId);
ApiTestConfig.collectionId = collectionId;// 全局变量赋值
List globalVariableList = apiTestConfigMapper.selectGlobalVariable();for (Variable variable:globalVariableList){
ApiTestConfig.globalVariableMap.put(variable.getVariableName(),variable.getVariableValue());
}// 集合变量赋值
List collectionVariableList = apiTestCollectionMapper.selectCollectionVariable(collectionId);for (Variable variable:collectionVariableList){
ApiTestConfig.collectionVariableMap.put(variable.getVariableName(),variable.getVariableValue());
}// 测试报告保存路径
ApiTestConfig.reportName = String.valueOf(System.currentTimeMillis())+ ".html";
Collection collection = new Collection();
collection.setId(collectionId);
collection.setReportPath("/report/" + ApiTestConfig.reportName);// 更新最后执行人和最后执行时间
User u = HttpBasicAuthorizeAttribute.getTokenUserInfo().get();
collection.setExcuterCode(u.getCode());
collection.setExcuterName(u.getName());
collection.setExcuteDatetime(new Date());
apiTestCollectionMapper.updateCollection(collection);// 测试执行
TestNG testNg = new TestNG();
Class[] listenerClass = {ExtentTestNGIReporterListener.class};
testNg.setListenerClasses(Arrays.asList(listenerClass));
testNg.setTestClasses(new Class[]{CollectionExcute.class});
testNg.run();
responseVo.setIsSuccess(Boolean.TRUE);
responseVo.setResult("执行完毕");return responseVo;
}
有一个DataProvider_ForMysql类,作用是重写了Iterator,将集合内的所有接口以迭代器的形式通过DataProvider传入@Test中
CollectionExcute
public class CollectionExcute {@DataProvider(name = "testData")private Iterator getData(){return new DataProvider_ForMysql(ApiTestConfig.apiList);
}@Test(dataProvider = "testData")public void testCase(TestCase testCase){
Integer collectionId = ApiTestConfig.collectionId;// 返回结果的body
String result = "";
Response response = ApiTestUtils.doRequest(testCase, collectionId);try {
result = response.body().string();
} catch (IOException e) {
e.printStackTrace();
}// 保存变量
ApiTestUtils.saveVariable(result, testCase, collectionId);// 执行校验
ApiTestUtils.verifyResult(result, testCase, collectionId);
}
}
DataProvider_ForMysql
public class DataProvider_ForMysql implements Iterator<Object[]> {/** 查询结果集 */
List caseList;/** 总行数 */private int rowNum=0;/** 当前行数 */private int curRowNo=0;public DataProvider_ForMysql(List cases){this.caseList = cases;this.rowNum = caseList.size();
}@Overridepublic boolean hasNext() {if(rowNum==0||curRowNo>=rowNum){return false;
}else{return true;
}
}@Overridepublic Object[] next() {
TestCase testCase = caseList.get(curRowNo);
Object[] o=new Object[1];
o[0]=testCase;this.curRowNo++;return o;
}
}
最后将执行完成后的“集合详情”数据返回给前端,让前端toast提示执行完毕,并更新报告的生成时间,此时点击“测试报告”按钮即可通过最新的url跳转至新的测试报告页面。
有疑问的小伙伴欢迎在文章下方留言,我会根据问题不断优化文章内容!
接口自动化测试平台简介
接口自动化测试平台中接口内容的设计
接口自动化测试平台:接口内容的简单执行
接口自动化测试平台系列:接口执行顺序与依赖
![a24e579904f6028bf6fa782b771bd1fa.gif](https://i-blog.csdnimg.cn/blog_migrate/50f100fa8981cf0fcf8758886e3fc488.gif)