Большая гибкость означает, что писать сложнее и проще, особенно в большинстве случаев тестовый пример довольно статичен, но не настолько динамичен.
Предположим, я хочу проверить 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, чтобы увидеть, может ли что-нибудь помочь мне, но не могу найти ничего полезного, поэтому я сдаюсь .....
Итак, я бы предпочел параметрический тест.Более элегантно, чисто, легко читать и писать.Читаемость теста важнее.