接口测试平台:场景化执行(旧版已废弃)

川长思鸟来 2023-06-14 11:55 103阅读 0赞

前端很简单,点击“执行”按钮即可,会像后端传入该集合的id
在这里插入图片描述

后端拿到集合id后,会执行以下几步操作:

  1. 拿到所有全局变量
  2. 拿到集合变量(集合变量只会在该集合内生效,不会在其他集合中生效)
  3. 声明测试报告的保存路径
  4. 更新集合的最后执行人与最后执行时间
  5. 调用testng类,进行接口执行,并生成报告

Service

  1. @Override
  2. public ResponseVo collectionExcute(Integer collectionId) {
  3. ResponseVo responseVo = new ResponseVo();
  4. ApiTestConfig.apiList = apiTestCaseMapper.selectCollectionApiList(collectionId);
  5. ApiTestConfig.collectionId = collectionId;
  6. // 全局变量赋值
  7. List<Variable> globalVariableList = apiTestConfigMapper.selectGlobalVariable();
  8. for (Variable variable:globalVariableList){
  9. ApiTestConfig.globalVariableMap.put(variable.getVariableName(),variable.getVariableValue());
  10. }
  11. // 集合变量赋值
  12. List<Variable> collectionVariableList = apiTestCollectionMapper.selectCollectionVariable(collectionId);
  13. for (Variable variable:collectionVariableList){
  14. ApiTestConfig.collectionVariableMap.put(variable.getVariableName(),variable.getVariableValue());
  15. }
  16. // 测试报告保存路径
  17. ApiTestConfig.reportName = String.valueOf(System.currentTimeMillis())+ ".html";
  18. Collection collection = new Collection();
  19. collection.setId(collectionId);
  20. collection.setReportPath("/report/" + ApiTestConfig.reportName);
  21. // 更新最后执行人和最后执行时间
  22. User u = HttpBasicAuthorizeAttribute.getTokenUserInfo().get();
  23. collection.setExcuterCode(u.getCode());
  24. collection.setExcuterName(u.getName());
  25. collection.setExcuteDatetime(new Date());
  26. apiTestCollectionMapper.updateCollection(collection);
  27. // 测试执行
  28. TestNG testNg = new TestNG();
  29. Class[] listenerClass = {ExtentTestNGIReporterListener.class};
  30. testNg.setListenerClasses(Arrays.asList(listenerClass));
  31. testNg.setTestClasses(new Class[]{CollectionExcute.class});
  32. testNg.run();
  33. responseVo.setIsSuccess(Boolean.TRUE);
  34. responseVo.setResult("执行完毕");
  35. return responseVo;
  36. }

有一个DataProvider_ForMysql类,作用是重写了Iterator,将集合内的所有接口以迭代器的形式通过DataProvider传入@Test中

CollectionExcute

  1. public class CollectionExcute {
  2. @DataProvider(name = "testData")
  3. private Iterator<Object[]> getData(){
  4. return new DataProvider_ForMysql(ApiTestConfig.apiList);
  5. }
  6. @Test(dataProvider = "testData")
  7. public void testCase(TestCase testCase){
  8. Integer collectionId = ApiTestConfig.collectionId;
  9. // 返回结果的body
  10. String result = "";
  11. Response response = ApiTestUtils.doRequest(testCase, collectionId);
  12. try {
  13. result = response.body().string();
  14. } catch (IOException e) {
  15. e.printStackTrace();
  16. }
  17. // 保存变量
  18. ApiTestUtils.saveVariable(result, testCase, collectionId);
  19. // 执行校验
  20. ApiTestUtils.verifyResult(result, testCase, collectionId);
  21. }
  22. }

DataProvider_ForMysql

  1. public class DataProvider_ForMysql implements Iterator<Object[]> {
  2. /** 查询结果集 */
  3. List<TestCase> caseList;
  4. /** 总行数 */
  5. private int rowNum=0;
  6. /** 当前行数 */
  7. private int curRowNo=0;
  8. public DataProvider_ForMysql(List<TestCase> cases){
  9. this.caseList = cases;
  10. this.rowNum = caseList.size();
  11. }
  12. @Override
  13. public boolean hasNext() {
  14. if(rowNum==0||curRowNo>=rowNum){
  15. return false;
  16. }else{
  17. return true;
  18. }
  19. }
  20. @Override
  21. public Object[] next() {
  22. TestCase testCase = caseList.get(curRowNo);
  23. Object[] o=new Object[1];
  24. o[0]=testCase;
  25. this.curRowNo++;
  26. return o;
  27. }
  28. }

最后将执行完成后的“集合详情”数据返回给前端,让前端toast提示执行完毕,并更新报告的生成时间,此时点击“测试报告”按钮即可通过最新的url跳转至新的测试报告页面。

在这里插入图片描述

有疑问的小伙伴欢迎在文章下方留言,我会根据问题不断优化文章内容!

发表评论

表情:
评论列表 (有 0 条评论,103人围观)

还没有评论,来说两句吧...

相关阅读