接口测试平台:支持混合Case的执行(Http\Dubbo\Sql)(旧版已废弃)

爱被打了一巴掌 2023-06-26 15:26 18阅读 0赞

首先还是看前端~
Case的管理页面,由原本的Http变成支持Http、Dubbo以及Sql。
在这里插入图片描述
集合详情页,Case所展示的内容也做了适当调整,只会展示Case名称和Case类型。
在这里插入图片描述
这张表用于保存集合内的case顺序。
在这里插入图片描述
然后新建了一个CommonCase,caseInfo字段用于保存case的完整信息。

  1. public class CommonCase {
  2. /** * 前端传入的id * 不入库,在函数里转换为caseId */
  3. private Integer id;
  4. /** 集合id */
  5. private Integer collectionId;
  6. /** caseId */
  7. private Integer caseId;
  8. /** Case名称 */
  9. private String caseName;
  10. /** * 集合类型 * 1:http 2:dubbo 3:mysql */
  11. private Integer caseType;
  12. private Object caseInfo;
  13. }

Service层
之前传入testng的是一个httpCase,现在改成了一个commonCase

  1. @Override
  2. public ResponseVo collectionExcute(Integer collectionId) {
  3. ResponseVo responseVo = new ResponseVo();
  4. // 获取完整的case列表
  5. ApiTestConfig.caseList = collectionCaseManageMapper.selectCommonCase(collectionId);
  6. // 遍历caseList,给caseInfo进行赋值,获取完整的case信息
  7. for (CommonCase commonCase:ApiTestConfig.caseList){
  8. Integer caseType = commonCase.getCaseType();
  9. switch (caseType){
  10. case ApiTestConfig.HTTP_CASE_TYPE:
  11. commonCase.setCaseInfo(httpCaseMapper.selectHttpCase(commonCase.getCaseId()));
  12. break;
  13. case ApiTestConfig.DUBBO_CASE_TYPE:
  14. commonCase.setCaseInfo(dubboCaseMapper.selectDubboCase(commonCase.getCaseId()));
  15. break;
  16. case ApiTestConfig.SQL_CASE_TYPE:
  17. SqlCase sqlCase = sqlCaseMapper.selectSqlCase(commonCase.getCaseId());
  18. DataBase dataBase = apiTestConfigMapper.selectDataBaseById(sqlCase.getDatabaseId());
  19. dataBase.setSqlCase(sqlCase);
  20. commonCase.setCaseInfo(dataBase);
  21. break;
  22. default:
  23. break;
  24. }
  25. }
  26. ApiTestConfig.collectionId = collectionId;
  27. // 全局变量赋值
  28. List<Variable> globalVariableList = apiTestConfigMapper.selectGlobalVariable();
  29. for (Variable variable:globalVariableList){
  30. ApiTestConfig.globalVariableMap.put(variable.getVariableName(),variable.getVariableValue());
  31. }
  32. // 集合变量赋值
  33. List<Variable> collectionVariableList = apiTestCollectionMapper.selectCollectionVariable(collectionId);
  34. for (Variable variable:collectionVariableList){
  35. ApiTestConfig.collectionVariableMap.put(variable.getVariableName(),variable.getVariableValue());
  36. }
  37. // 测试报告保存路径
  38. ApiTestConfig.reportName = String.valueOf(System.currentTimeMillis())+ ".html";
  39. CollectionDetail collectionDetail = apiTestCollectionMapper.selectCollectionDetail(collectionId);
  40. collectionDetail.setId(collectionId);
  41. collectionDetail.setReportPath("/report/" + ApiTestConfig.reportName);
  42. // 更新最后执行人和最后执行时间
  43. User u = HttpBasicAuthorizeAttribute.getTokenUserInfo().get();
  44. collectionDetail.setExcuterCode(u.getCode());
  45. collectionDetail.setExcuterName(u.getName());
  46. collectionDetail.setExcuteDatetime(new Date());
  47. apiTestCollectionMapper.updateCollection(collectionDetail);
  48. // 新增执行记录
  49. apiTestCollectionMapper.insertExcuteRecords(collectionDetail);
  50. // 测试报告推送至企业微信
  51. if (collectionDetail.getWxPush()){
  52. String content = "接口测试平台报告 \n";
  53. SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
  54. content += "【测试时间】" + sdf.format(new Date()) + "\n";
  55. content += "【测试报告】http://yourIp:port/report/" + ApiTestConfig.reportName;
  56. WxMsgPush.wxMsgPush(u.getCode(), content);
  57. }
  58. // 测试执行
  59. TestNG testNg = new TestNG();
  60. Class[] listenerClass = { ExtentTestNGIReporterListener.class};
  61. testNg.setListenerClasses(Arrays.asList(listenerClass));
  62. testNg.setTestClasses(new Class[]{ CollectionDetailExcute.class});
  63. testNg.run();
  64. responseVo.setIsSuccess(Boolean.TRUE);
  65. responseVo.setResult("执行完毕");
  66. return responseVo;
  67. }

CollectionDetailExcute
原本的http请求拓展为三种Case类型。
具体的执行代码可以参考之前的文章《接口测试平台:Http请求的简单执行》、《接口测试平台:Dubbo接口支持》、《接口测试平台:支持SQL语句执行(Mysql、Oracle)》。

  1. public class CollectionDetailExcute {
  2. private static Integer collectionId = 0;
  3. @org.testng.annotations.DataProvider(name = "testData")
  4. private Iterator<Object[]> getData(){
  5. return new DataProvider(ApiTestConfig.caseList);
  6. }
  7. @Test(dataProvider = "testData")
  8. public void testCase(CommonCase commonCase){
  9. collectionId = ApiTestConfig.collectionId;
  10. Integer caseType = commonCase.getCaseType();
  11. Object caseInfo = commonCase.getCaseInfo();
  12. // caseType: 1:Http 2:Dubbo 3:Sql
  13. switch (caseType){
  14. case ApiTestConfig.HTTP_CASE_TYPE:
  15. httpExcute((HttpCase)caseInfo);
  16. break;
  17. case ApiTestConfig.DUBBO_CASE_TYPE:
  18. dubboExcute((DubboCase)caseInfo);
  19. break;
  20. case ApiTestConfig.SQL_CASE_TYPE:
  21. sqlExcute((DataBase)caseInfo);
  22. break;
  23. default:
  24. break;
  25. }
  26. }
  27. private void httpExcute(HttpCase httpCase){
  28. // 返回结果的body
  29. String result = "";
  30. Response response = ApiTestUtils.doHttpRequest(httpCase, collectionId);
  31. try {
  32. result = response.body().string();
  33. } catch (IOException e) {
  34. e.printStackTrace();
  35. }
  36. JSONObject resultObj = JSONObject.parseObject(result);
  37. String pretty = JSON.toJSONString(resultObj, SerializerFeature.PrettyFormat, SerializerFeature.WriteMapNullValue);
  38. Reporter.log("接口返回结果为:\n" + pretty);
  39. // 保存变量
  40. ApiTestUtils.saveVariable(result, httpCase.getVariableListValue(), collectionId);
  41. // 执行校验
  42. ApiTestUtils.verifyResult(result, httpCase.getExpectedListValue(), collectionId);
  43. }
  44. private void dubboExcute(DubboCase dubboCase){
  45. String result = ApiTestUtils.doDubboRequest(dubboCase, collectionId);
  46. Reporter.log("接口返回结果为:\n" + result);
  47. // 保存变量
  48. ApiTestUtils.saveVariable(result, dubboCase.getVariableListValue(), collectionId);
  49. // 执行校验
  50. ApiTestUtils.verifyResult(result, dubboCase.getExpectedListValue(), collectionId);
  51. }
  52. private void sqlExcute(DataBase dataBase){
  53. String result = ApiTestUtils.doSqlRequest(dataBase);
  54. Reporter.log("接口返回结果为:\n" + result);
  55. // 保存变量
  56. ApiTestUtils.saveVariable(result, dataBase.getSqlCase().getVariableListValue(), collectionId);
  57. // sql执行默认全部执行完成
  58. Assert.assertTrue(Boolean.TRUE);
  59. }
  60. }

DataProvider

  1. public class DataProvider implements Iterator<Object[]> {
  2. /** 查询结果集 */
  3. List<CommonCase> caseList;
  4. /** 总行数 */
  5. private int rowNum=0;
  6. /** 当前行数 */
  7. private int curRowNo=0;
  8. public DataProvider(List<CommonCase> 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. CommonCase commonCase = caseList.get(curRowNo);
  23. Object[] o=new Object[1];
  24. o[0]= commonCase;
  25. this.curRowNo++;
  26. return o;
  27. }
  28. }

extentreport的配置文件部分做了点修改,修改case的name。
在这里插入图片描述
到此混合Case的执行就完成啦,有疑问的小伙伴欢迎在文章下方留言,我会根据问题不断优化文章内容!

发表评论

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

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

相关阅读