2 回答

TA貢獻1946條經驗 獲得超4個贊
動態測試,我將它們稱為 testlets,只是軟/分組斷言(assertAll(...)
)。您將在報告中看到每個生成的動態測試的條目,但它們不是真正的測試。
您復制到問題中的引用(來自 baeldung)是錯誤的。它應該在 JUnit 的用戶指南中閱讀:
動態測試生命周期
@Test
動態測試的執行生命周期與標準案例的執行生命周期完全不同。具體來說,單個動態測試沒有生命周期回調。這意味著@BeforeEach
和@AfterEach
方法及其相應的擴展回調是針對@TestFactory
方法執行的,而不是針對每個動態測試執行的。
有關更多詳細信息,請閱讀:https ://junit.org/junit5/docs/current/user-guide/#writing-tests-dynamic-tests
為什么有人更喜歡參數化測試而不是動態測試?
如果您需要為每個測試(模板調用)提供完整的生命周期支持。
如果你想在注釋中聲明你的參數。
在此處找到有關如何以各種形式向 a 提供參數的更多詳細信息@ParameterizedTest
:https ://junit.org/junit5/docs/current/user-guide/#writing-tests-parameterized-tests - 請注意“類/容器模板”計劃在以后發布:https ://github.com/junit-team/junit5/issues/878
我在這里寫了一篇博客文章,比較了用 JUnit Jupiter 分散 3 個斷言的 5 個步驟:https ://sormuras.github.io/blog/2018-05-14-junit5-scatter-assertions.html

TA貢獻1911條經驗 獲得超7個贊
更大的靈活性在某種程度上意味著編寫起來更加復雜和樣板,尤其是在大多數情況下,測試用例是相當靜態的,但不是那么動態的。
考慮我想測試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))));
}
它已經有許多樣板代碼。所以我嘗試使用 returnStream<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。我環顧DynamicTestAPI 看看是否有什么可以幫助我但找不到任何有用的東西,所以我放棄了.....
所以,我更喜歡參數化測試。更優雅、干凈、易讀易寫。測試用例的可讀性更為重要。
添加回答
舉報