JUnit 5 - 为整个测试套件提供setUp和tearDown

时间:2018-05-28 05:33:22

标签: java unit-testing junit junit5 junit5-extension-model

我的要求是为一组测试完成一些初始化,并在所有测试完成后将其清除。这些测试涉及几个测试类,因为它们没有密切关系,但需要一个共同的初始化。

我正在使用@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

1 个答案:

答案 0 :(得分:3)

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

从技术上讲,您的SuiteClass是一个JUnit 4测试类。因此JUnit Jupiter不会为它注册或执行任何扩展。

关于JUnit 5中的 suites ,我们(JUnit团队)计划为不需要JUnit 4 Runner 的套件提供一流的支持(即,@RunWith(JUnitPlatform.class))。有关详细信息,请参阅所有GitHub issues labeled with "suites"。随意观看和/或评论任何这些问题。

在此期间,我相信最接近JUnit Jupiter实现“套件前后”支持的方法是实现一个实现BeforeAllCallbackAfterAllCallback的自定义扩展。该扩展需要通过在 root ExtensionContext Store(作为BeforeAllCallback)中存储标记来跟踪它是否已被调用,以便它只在“套件”之前执行一次。同样,它需要计算它执行的类的数量,并在 root Store中跟踪它。这可以用作StackCountDownLatch。作为AfterAllCallback,扩展将需要递减全局计数器,并且只有在所有测试类完成后才执行

您显然需要确保为属于该套件的每个测试类注册了套件扩展。也许自定义组合注释可以简化你的事情。

现在,诚然,我只是实现了,但我还没有实际编写这样的“套件”扩展。因此,如果您真正实现它,我会有兴趣了解您的体验并可能看到您的代码。 ; - )

干杯,

Sam(JUnit 5的核心提交者)