执行中的JUnit 5测试可以注册其他测试吗?

时间:2019-06-11 09:05:58

标签: junit5 junit5-extension-model

我想编写一个JUnit 5扩展,它可以在执行期间注册其他动态测试。理想情况下,它们将作为正在执行的测试方法或类的子级出现。

我已经查看了提供给扩展回调实例的ExecutionContext,似乎没有任何钩子允许这样做。

正在执行的测试还可以使用其他任何机制来注册其他测试吗?

示例

从评论中可以看出,我对自己所追求的不是100%清楚。

@TestFactory和动态测试与我所追求的相近,但还远远不够。他们看起来像这样:

@TestFactory
Iterator<DynamicTest> dynamicTestsFromIterator() {
    return Arrays.asList(
        dynamicTest("5th dynamic test", () -> assertTrue(isPalindrome("madam"))),
        dynamicTest("6th dynamic test", () -> assertEquals(4, calculator.multiply(2, 2)))
    ).iterator();
}

我希望能够避免样板代码,并具有如下所示的内容:

@Test
public void dynamicTestsFromIterator() {
    registerDynamicTest("5th dynamic test", () -> assertTrue(isPalindrome("madam")));
    registerDynamicTest("6th dynamic test", () -> assertEquals(4, calculator.multiply(2, 2)));
}

通过这种方式,在我想到的应用程序中,我可以轻松地将动态测试重新装配到我现有的测试套件中,而不必进行大量重构来使用@TestFactory。我认为,如果没有额外的样板代码,代码也将更加整洁并且更具可读性。

1 个答案:

答案 0 :(得分:1)

感谢@Sormuras提供该文档的链接,这促使我重新阅读了有关动态测试(https://junit.org/junit5/docs/current/user-guide/#writing-tests-dynamic-test-examples)的部分。答案在那里:

  

从JUnit Jupiter 5.4.2开始,必须始终通过工厂方法创建动态测试。但是,可能会在以后的版本中通过注册功能对其进行补充。

所以我所追求的注册工具尚未在木星中存在。我也许可以出于自己的目的使用@TestFactory作为解决方法。