专栏首页测试人生接口自动化测试平台系列:场景化执行

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

前端很简单,点击“执行”按钮即可,会像后端传入该集合的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跳转至新的测试报告页面。

本文分享自微信公众号 - 软件测试君(backlight2018),作者:简单随风

原文出处及转载信息见文内详细说明,如有侵权,请联系 yunjia_community@tencent.com 删除。

原始发表时间:2019-11-21

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • Dubbo接口泛化调用

    软件测试君
  • TestNg中的断言你真的了解吗

    在执行自动化测试脚本的时候,我们需要自动判断测试脚本执行完成后的实际结果是否与预期结果一致,这个时候就需要在程序运行之前写入断言,判断当前程序执行后是否正常。

    软件测试君
  • 自动化测试报告必会神器Allure使用

    之前用过testNG自带的测试报告、优化过reportNG的测试报告、extentreport、ZReport(大飞总原创),这些是我之前都用过的,也是在去年雯...

    软件测试君
  • mybatis 使用tips - 使用多个参数

    执行如下命令: mvn -Dmybatis.generator.overwrite=true mybatis-generator:generate 可以使用my...

    千往
  • HBase篇--HBase操作Api和Java操作Hbase相关Api

    Hbase shell启动命令窗口,然后再Hbase shell中对应的api命令如下。

    LhWorld哥陪你聊算法
  • RSA公钥加密私钥解密实例

    版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/huyuyang6688/article/...

    DannyHoo
  • 《快公司》十大AI创新公司出炉,上榜的除了Google百度还有谁?

    李林 编译整理自《快公司》 量子位·QbitAI 出品 《快公司》这家杂志,每年都会评出一份“创新公司”榜单,今年是整整第10年。这份榜单包括全球50家创新公司...

    量子位
  • 21个极大提高开发效率的VS Code快捷键

    做为前端开发者来说,大都数都用过 VSCode,并且也有很多是经常用的。但 VSCode 的一些快捷键可能我们不知道,也比较少用,毕竟这很好,因此本文就列出一些...

    Fundebug
  • Android高德之旅(12)厉害了POI

    前后两千万,拍照更清晰。大家好,这里是OPPO R11独家冠名赞助播出的大型情感类电视连续剧《Android高德之旅》,我是主持人大公爵。这期节目,我们来讲一下...

    大公爵
  • PCL中分割方法的介绍(3)

    上两篇介绍了关于欧几里德分割,条件分割,最小分割法等等还有之前就有用RANSAC法的分割方法,这一篇是关于区域生成的分割法,

    点云PCL博主

扫码关注云+社区

领取腾讯云代金券

玩转腾讯云 有奖征文活动