当外部测试用例因 JUnit 5 失败时,不要启动嵌套测试用例



我有以下测试类:

import org.junit.jupiter.api.Nested;
import org.junit.jupiter.api.Test;
import org.junit.jupiter.api.TestInstance;
import static org.junit.jupiter.api.Assertions.assertTrue;
public class HierarchicalTest {
@Test
void checkOuter() {
assertTrue(false);
}
@Nested
@TestInstance(TestInstance.Lifecycle.PER_CLASS)
class PrepBTest {
@Test
void checkInnerA() {}
@Test
void checkInnerB() {}
}
}

我希望checkOuter()失败时checkInnerA()checkInnerB()不会被执行。

另一方面,当checkInnerA()失败时应执行checkInnerB(),因为它处于同一级别。

有没有一个简单的解决方案(例如使用JUnit 5扩展)来实现这种行为?在我看来,这往往是人们所希望的行为。

更新

从JUnit Jupiter 5.4开始,您可以开发一个实现TestWatcherExecutionConditionAPI的扩展来实现这种行为。

TestWatcherAPI的testFailed()方法中,您需要跟踪发生故障的测试类,并且需要将此信息存储在ExtensionContext.Store中。

ExecutionConditionAPI的evaluateExecutionCondition()方法中,您需要确定当前类是否为@Nested测试类(即内部类),并检查封闭测试类是否失败。如果成立,则需要禁用当前@Nested测试类,否则启用

这些是一般准则。关于一个工作示例,请参阅我刚刚发布到GitHub上junit5-demo存储库的SkipOnFailuresInClosingClassExtension。该示例更进一步,只跳过@Nested测试类(如果它们也用@SkipOnFailuresInEnclosingClass进行了注释)。OuterTests类显示了操作中的注释和扩展。


不,从JUnit Jupiter 5.3开始,目前还没有现成的解决方案来实现这一点。

您可能会编写一个自定义扩展,跟踪封闭测试类中测试的成功——例如,通过实现TestExecutionExceptionHandler。这将需要存储在CCD_ 19中。然后,扩展需要实现ExecutionCondition,以编程方式禁用嵌套的测试类。

遗憾的是,目前追踪先前执行的测试的"成功"并不十分简单,但随着新的TestWatcher扩展API的引入,这种情况应该会有所改善,该扩展目前计划包含在即将发布的JUnit Jupiter 5.4:https://github.com/junit-team/junit5/issues/542

最新更新