Pav*_*mar 1 java junit unit-testing junit5 junit5-extension-model
我的要求是对一组测试进行一些初始化,并在所有测试完成后将其清除。这些测试围绕几个测试类进行,因为它们不是密切相关的,但需要一个共同的初始化。
我正在使用@SelectClasses
来形成套件并尝试使用@ExtendWith
应该处理预处理和后处理的自定义扩展。这不起作用,我不确定 JUnit 中是否存在合适的解决方案。共享已经尝试过的示例代码。
套房:
@SelectClasses({FirstTest.class, SecondTest.class})
@ExtendWith(SuiteExtension.class)
@RunWith(JUnitPlatform.class)
@SuiteDisplayName("test suite")
public class SuiteClass {
}
Run Code Online (Sandbox Code Playgroud)
延期:
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");
}
}
Run Code Online (Sandbox Code Playgroud)
测试类 1:
public class FirstTest {
@Test
void test1(){
System.out.println("test1");
}
}
Run Code Online (Sandbox Code Playgroud)
测试类 2:
public class SecondTest {
@Test
void test2(){
System.out.println("test2");
}
}
Run Code Online (Sandbox Code Playgroud)
输出:
test1
test2
Run Code Online (Sandbox Code Playgroud)
预期输出:
beforeAll
test1
test2
afterAll
Run Code Online (Sandbox Code Playgroud)
不支持组合@RunWith
(来自 JUnit 4)和@ExtendWith
(来自 JUnit Jupiter):它们是来自两个不同框架的扩展机制。
从技术上讲,您SuiteClass
是一个 JUnit 4 测试类。因此,JUnit Jupiter 不会为其注册或执行任何扩展。
关于JUnit 5 中的套件,我们(JUnit 团队)计划为不需要 JUnit 4 Runner(即@RunWith(JUnitPlatform.class)
)的套件提供一流的支持。有关详细信息,请参阅所有标有“套件”的 GitHub 问题。随意观看和/或评论任何这些问题。
在此期间,我相信在 JUnit Jupiter 中实现“套件前后”支持的最接近的方法是实现一个自定义扩展,该扩展实现BeforeAllCallback
和AfterAllCallback
. 该扩展需要通过在根中 存储一个标志ExtensionContext
Store
(作为 a BeforeAllCallback
)来跟踪它是否已经被调用,以便它只在“套件”之前执行一次。类似地,它需要计算它执行的类的数量并在root 中 跟踪它Store
。这将用作Stack
或CountDownLatch
。作为AfterAllCallback
,扩展需要递减全局计数器,并且仅在所有测试类完成后才执行。
您显然需要确保为属于该套件的每个测试类注册了您的套件扩展。也许自定义组合注释会为您简化那里的事情。
现在,无可否认,我只是在我的脑海中实现了它,但还没有真正编码这样一个“套件”扩展。因此,如果您真的实施它,我很想听听您的经验并可能看到您的代码。;-)
干杯,
Sam(JUnit 5 的核心提交者)
归档时间: |
|
查看次数: |
5149 次 |
最近记录: |