使用 JUnit 5 的 @ParametrizedTest 与 @TestFactory Stream<DynamicTest> 之间的区别是什么?

And*_*ong 5 java junit5 parametrized-testing

首先,它们在 Junit 5 动态测试指南的结论中是什么意思?

参数化测试可以替代本文中的许多示例。但是,动态测试与参数化测试不同,因为它们支持完整的测试生命周期,而参数化测试不支持。

我浏览了JUnit 5 – 参数化测试,相信我理解了语法级别的差异,并且相信我明白了这一点:

此外,动态测试在如何生成输入和如何执行测试方面提供了更大的灵活性。

但是看起来,为什么有人更喜欢参数化测试而不是动态测试?

Sor*_*ras 4

动态测试,我将它们称为 testlet,只是assertAll(...)类固醇的软/分组断言 ( )。您将在报告中看到每个生成的动态测试的条目,但它们不是真正的测试。

您复制到问题中的引用(来自 baeldung)是错误的。它应该如 JUnit 的用户指南中所示:

动态测试生命周期

动态测试的执行生命周期与标准用例有很大不同@Test。具体来说,单个动态测试没有生命周期回调。这意味着方法@BeforeEach及其@AfterEach相应的扩展回调是针对该@TestFactory方法执行的,而不是针对每个动态测试执行的。

有关更多详细信息,请阅读: https: //junit.org/junit5/docs/current/user-guide/#writing-tests-dynamic-tests

为什么有人更喜欢参数化测试而不是动态测试?

  1. 如果您需要每个测试的完整生命周期支持(模板调用)。
  2. 如果你想在注释中声明你的参数。

有关如何以各种形式提供参数的更多详细信息,请参见@ParameterizedTest: https: //junit.org/junit5/docs/current/user-guide/#writing-tests-parameterized-tests - 请注意“class/容器模板”预计稍后发布:https ://github.com/junit-team/junit5/issues/878

我在这里写了一篇博客文章,比较了使用 JUnit Jupiter 分散 3 个断言的 5 个步骤: https: //sormuras.github.io/blog/2018-05-14-junit5-scatter-assertions.html 在此输入图像描述