首先,它们在Guide to Dynamic Tests in Junit 5的结论中是什么意思?
参数化测试可以替代本文中的许多示例。 但是,动态测试与参数化测试不同,因为它们支持完整的测试生命周期,而参数化测试则不支持。
我略过了JUnit 5 – Parameterized Tests,并相信自己在语法层面上了解了差异,并且相信我明白了这一点:
此外,动态测试为输入的生成方式和测试执行方式提供了更大的灵活性。
但是然后看起来,为什么有人会比动态测试更喜欢参数化测试?
答案 0 :(得分:3)
动态测试,我称它们为testlet,只是对类固醇的软/分组断言(assertAll(...)
)。您会在报告中看到每个生成的动态测试的条目,但它们不是真实测试。
您复制到问题中的报价(来自baeldung)是错误。它的内容应与《 JUnit用户指南》中的一样:
动态测试生命周期
动态测试的执行生命周期与标准
@Test
用例的生命周期完全不同。具体来说,没有针对单个动态测试的生命周期回调。这意味着@BeforeEach
和@AfterEach
方法及其相应的扩展回调是针对@TestFactory
方法执行的,而不是针对每个动态测试执行的。
有关更多详细信息,请阅读:https://junit.org/junit5/docs/current/user-guide/#writing-tests-dynamic-tests
为什么有人会比动态测试更喜欢参数化测试?
在此处找到有关如何为@ParameterizedTest
提供各种形式的参数的更多详细信息:https://junit.org/junit5/docs/current/user-guide/#writing-tests-parameterized-tests-请注意,“类/容器模板”将在以后的版本中发布:{{3 }}
我写了一篇博客文章,比较了使用JUnit Jupiter分散3个断言的5个步骤:https://github.com/junit-team/junit5/issues/878 https://sormuras.github.io/blog/2018-05-14-junit5-scatter-assertions.html
答案 1 :(得分:0)
某种程度上的灵活性意味着在大多数情况下,测试用例是静态的而不是动态的,尤其是编写起来更加复杂和容易。
考虑我要测试Math.add()
:
参数化的测试版本如下:
@ParameterizedTest
@CsvSource({ "1,1,2",
"2,2,4",
"3,3,6",
"4,4,8",
"5,5,10",
"6,6,12",
"7,7,14",
"10,90,100" })
public void parameterizedTest(int left, int right, int expected) {
assertEquals(expected, Math.addExact(left, right));
}
动态测试版本如下:
@TestFactory
Collection<DynamicTest> dynamicTest() {
return Arrays.asList(
DynamicTest.dynamicTest("Test1", () -> assertEquals(2, Math.addExact(1, 1))),
DynamicTest.dynamicTest("Test2", () -> assertEquals(4, Math.addExact(2, 2))),
DynamicTest.dynamicTest("Test3", () -> assertEquals(6, Math.addExact(3, 3))),
DynamicTest.dynamicTest("Test4", () -> assertEquals(8, Math.addExact(4, 4))),
DynamicTest.dynamicTest("Test5", () -> assertEquals(10, Math.addExact(5, 5))),
DynamicTest.dynamicTest("Test6", () -> assertEquals(12, Math.addExact(6, 6))),
DynamicTest.dynamicTest("Test7", () -> assertEquals(14, Math.addExact(7, 7))),
DynamicTest.dynamicTest("Test8", () -> assertEquals(100, Math.addExact(10, 90))));
}
它已经有很多样板代码。因此,我尝试使用return Stream<DynamicTest>
删除这些样板代码:
@TestFactory
Stream<DynamicTest> dynamicTest2() {
return Stream.of(
"1,1,2",
"2,2,4",
"3,3,6",
"4,4,8" ,
"5,5,10" ,
"6,6,12" ,
"7,7,14",
"10,90,100")
//How to do????????
.map(data-> DynamicTest.dynamicTest(data, () -> assertEquals(xxx, Math.addExact(yy,zz))));
}
但是如何将字符串格式的测试数据转换为参数并调用SUT。我环顾DynamicTest
API,看看是否有什么可以帮助我但找不到任何帮助的东西,所以我放弃了.....
所以,我更喜欢参数化测试。更优雅,干净,易于阅读和书写。测试用例的可读性更为重要。