接口测试 JUnit5 动态测试解决的一个问题

Ouroboros · 2021年04月02日 · 393 次阅读

背景

最近在进行接口自动化测试的改造。需求是基于现有测试框架基础上,整合 mock、报告,实现所有用例本地独立运行。
由于项目是对外提供的接口服务,用例是超复杂的 XML 及 json,日常手工测试也是维护 XML 和 json 为主,为了让手工测试产生的数据自动成为自动化测试用例,
只需要维护好用例的 xml 即可,录制回放逻辑由 yml 控制,不需要写一行代码。

具体各类协议第三方服务的 mock、根据代码自动用例关联等不在这里赘述,主要分享一下我在整合 Allure2 报告遇到的一个小问题的解决。

问题

由于整个项目由一个方法作为驱动,而 Allure 统计用例是按测试方法级来统计的。我对 allure2 也不怎么熟,无论怎么加 feature、story、suite、step,
发现都存在用例与报告无法对应上的情况,如图:
,图中每个用例执行时间都是所有用例执行时间之和,而且的步骤 excute 和用例也对应不上,一一对应的,对应成了 2*2。
在不大动现有代码的基础上,发现 JUnit5 支持的 TestFactory,用一个测试方法,创建多个测试方法,解决了这个问题。

JUnit5 介绍

JUnit5
TestFactory 字面意思就是用例工厂。这个方法不能被 private 和 static 修饰,并且它 ** 必须有返回值 **。
详细介绍可以看知乎这篇文章:JUnit 5 动态测试

实现

就几行代码

@TestFactory
@Epic("接口自动化测试")
List<DynamicTest> createServiceTests() {
        List<DynamicTest> dynamicTests = new ArrayList<>(256);
        serviceMockResources.forEach(serviceMockResource -> dynamicTests.addAll(serviceMockResource.generateDynamicTest()));
        return dynamicTests;
    }

public List<DynamicTest> generateDynamicTest() {
needRunUsecases.forEach(usecase -> dynamicTests.add(DynamicTest.dynamicTest(usecase,
                () -> executeUsecase(usecase, mockProcess))));
        return dynamicTests;

}

问题解决。

最后

这种方法有个瑕疵是总览分页多了一个驱动方法的 testsuit,其下有所有的测试信息,属于冗余数据,不知道要怎么去除,不过 behaviors 分页是精准的。

供参考

Allure2 源码
官方文档
环境

  • JDK1.8
  • Windows7
  • JUnit5
暂无回复。
需要 登录 后方可回复, 如果你还没有账号请点击这里 注册