В чем разница между преимуществом @ParametrizedTest JUnit 5 по сравнению с @TestFactory Stream <DynamicTest>? - PullRequest
0 голосов
/ 28 февраля 2019

Во-первых, что они подразумевают под этим в заключении Руководство по динамическим тестам в Junit 5 ?

Параметризованные тесты могут заменить многие примеры в этой статье, Однако динамические тесты отличаются от параметризованных тестов тем, что они поддерживают полный жизненный цикл тестирования, в то время как параметризованные тесты этого не делают.

Я пролистал JUnit 5 - Параметризованные тесты и, по-моему, я понимаю различия на синтаксическом уровне, а также считаю, что получаю следующее:

Более того, динамические тесты обеспечивают большую гибкость в отношении того, как генерируется ввод и как выполняются тесты.

Но тогда кажется, почему кто-то предпочитает параметризованные тесты динамическим тестам?

Ответы [ 2 ]

0 голосов
/ 28 февраля 2019

Большая гибкость означает, что писать сложнее и проще, особенно в большинстве случаев тестовый пример довольно статичен, но не настолько динамичен.

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

Итак, я бы предпочел параметрический тест.Более элегантно, чисто, легко читать и писать.Читаемость теста важнее.

0 голосов
/ 28 февраля 2019

Динамические тесты, я называю их тестлетами, это просто мягкие / групповые утверждения (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 - учтите, что "класс"Шаблоны / Container "намечены для более поздней версии: https://github.com/junit-team/junit5/issues/878

Я написал сообщение в блоге, сравнивая 5 шагов рассеяния 3 утверждений с JUnit Jupiter здесь: https://sormuras.github.io/blog/2018-05-14-junit5-scatter-assertions.html enter image description here

...