JUnit的5 - 提供安装和拆卸用于整个测试套件(JUnit 5 - Providing set

2019-10-28 09:09发布

我的要求是有一些初始化的一组测试完成并清除其关闭,一旦所有测试完成。 这些试验在旋转,因为他们的关系并不密切一些测试类,但需要一个共同的初始化。

我使用@SelectClasses形成套件,并试图利用@ExtendWith使用自定义的扩展,它应该处理的前处理和后处理。 这不工作,我不确定如果JUnit中存在一个合适的解决方案。 共享的东西已经尝试的示例代码。

套房:

@SelectClasses({FirstTest.class, SecondTest.class})
@ExtendWith(SuiteExtension.class)
@RunWith(JUnitPlatform.class)
@SuiteDisplayName("test suite")
public class SuiteClass {
}

延期:

public class SuiteExtension implements BeforeAllCallback, AfterAllCallback {

    @Override
    public void afterAll(ExtensionContext context) throws Exception {
        System.out.println("afterAll");
    }

    @Override
    public void beforeAll(ExtensionContext context) throws Exception {
        System.out.println("beforeAll");
    }
}

测试1级:

public class FirstTest {

    @Test
    void test1(){
        System.out.println("test1");
    }
}

测试2级:

public class SecondTest {

    @Test
    void test2(){
        System.out.println("test2");
    }
}

输出:

test1
test2

预期输出:

beforeAll
test1
test2
afterAll

Answer 1:

组合@RunWith (来自JUnit 4中)和@ExtendWith (来自JUnit的木星)不支持:这些是由两个不同的框架的扩展机制。

从技术上讲,你的SuiteClass是一个JUnit 4测试类。 因此JUnit的木星将无法注册或执行任何扩展它。

关于在JUnit的5 间套房 ,我们(JUnit的团队)计划提供了不需要一个JUnit 4 亚军套房一流的支持(即@RunWith(JUnitPlatform.class) 查看所有标有“套房” GitHub的问题的详细信息。 随意观看和/或任何对这些问题发表评论。

在此期间,我认为最接近的一种,能来实现“前后组曲”中的JUnit木星的支持将是实现一个实现了自定义扩展BeforeAllCallbackAfterAllCallback 。 该扩展需要跟踪它是否已经被存储在标志调用ExtensionContext Store (作为BeforeAllCallback ),所以它只有“套件”之前执行一次 。 同样的,那就需要算的是对执行类的数量和跟踪 Store 。 这将作为一个StackCountDownLatch 。 作为AfterAllCallback ,扩展需要递减全局计数器,只有所有的测试类已经完成了执行一次。

你显然需要确保你的套件扩展注册为属于每个套件测试类。 也许一个自定义的组成注释会不会有事情简单化为您服务。

现在,诚然,我刚刚实施 ,在我的头,但还没有实际编码这样的“套房”的延伸。 所以,如果你真的实现它,我会乐意听取你的经验,并可能看到你的代码。 ;-)

干杯,

山姆(核心提交者选择JUnit 5)



文章来源: JUnit 5 - Providing setUp and tearDown for an entire Test Suite