接口自动化测试平台系列:场景化执行
- 2019 年 11 月 22 日
- 筆記
前端很简单,点击“执行”按钮即可,会像后端传入该集合的id
后端拿到集合id后,会执行以下几步操作:
- 拿到所有全局变量
- 拿到集合变量(集合变量只会在该集合内生效,不会在其他集合中生效)
- 声明测试报告的保存路径
- 更新集合的最后执行人与最后执行时间
- 调用testng类,进行接口执行,并生成报告
Service
@Override public ResponseVo collectionExcute(Integer collectionId) { ResponseVo responseVo = new ResponseVo(); ApiTestConfig.apiList = apiTestCaseMapper.selectCollectionApiList(collectionId); ApiTestConfig.collectionId = collectionId; // 全局变量赋值 List<Variable> globalVariableList = apiTestConfigMapper.selectGlobalVariable(); for (Variable variable:globalVariableList){ ApiTestConfig.globalVariableMap.put(variable.getVariableName(),variable.getVariableValue()); } // 集合变量赋值 List<Variable> 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<Object[]>,将集合内的所有接口以迭代器的形式通过DataProvider传入@Test中
CollectionExcute
public class CollectionExcute { @DataProvider(name = "testData") private Iterator<Object[]> 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<TestCase> caseList; /** 总行数 */ private int rowNum=0; /** 当前行数 */ private int curRowNo=0; public DataProvider_ForMysql(List<TestCase> cases){ this.caseList = cases; this.rowNum = caseList.size(); } @Override public boolean hasNext() { if(rowNum==0||curRowNo>=rowNum){ return false; }else{ return true; } } @Override public Object[] next() { TestCase testCase = caseList.get(curRowNo); Object[] o=new Object[1]; o[0]=testCase; this.curRowNo++; return o; } }
最后将执行完成后的“集合详情”数据返回给前端,让前端toast提示执行完毕,并更新报告的生成时间,此时点击“测试报告”按钮即可通过最新的url跳转至新的测试报告页面。