接口自动化测试平台系列:场景化执行

  • 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跳转至新的测试报告页面。

Exit mobile version