Руководство по @RepeatedTest в Junit 5

Руководство по @RepeatedTest в Junit 5

1. обзор

В этой быстрой статье мы рассмотрим аннотацию@RepeatedTest, представленную в JUnit 5. Это дает нам мощный способ написать любой тест, который мы хотим повторить несколько раз.

Если вы хотите узнать больше о JUnit 5, ознакомьтесь с другими нашими статьямиexplaining the basics иguide to JUnit 5.

2. Зависимости и настройка Maven

Первое, что нужно отметить, - для запуска JUnit 5 требуется Java 8. Сказав это, давайте посмотрим на зависимость Maven:


    org.junit.jupiter
    junit-jupiter-engine
    5.1.0
    test

Это основная зависимость JUnit 5, которую мы должны добавить для написания наших тестов. Проверьте последнюю версию артефактаhere.

3. Простой пример@RepeatedTest

Создать повторный тест просто - просто добавьте аннотацию@RepeatedTest поверх метода тестирования:

@RepeatedTest(3)
void repeatedTest(TestInfo testInfo) {
    System.out.println("Executing repeated test");

    assertEquals(2, Math.addExact(1, 1), "1 + 1 should equal 2");
}

Обратите внимание, что вместо стандартной аннотации@Test мы используем@RepeatedTest для нашего модульного теста. The above test will be executed three times, как если бы один и тот же тест был написан трижды.

Отчеты о тестах (файлы отчетов или результаты на вкладке JUnit вашей IDE) будут отображать все выполнения:

repetition 1 of 3(repeatedTest(TestInfo))
repetition 2 of 3(repeatedTest(TestInfo))
repetition 3 of 3(repeatedTest(TestInfo))

4. Поддержка жизненного цикла для@RepeatedTest

Each execution of the @RepeatedTest will behave like a regular @Test с полной поддержкой жизненного цикла теста JUnit. Это означает, что во время каждого выполнения будут вызываться методы@BeforeEach и@AfterEach. Чтобы продемонстрировать это, просто добавьте соответствующие методы в тестовый класс:

@BeforeEach
void beforeEachTest() {
    System.out.println("Before Each Test");
}

@AfterEach
void afterEachTest() {
    System.out.println("After Each Test");
    System.out.println("=====================");
}

Если мы запустим наш предыдущий тест, результаты будут отображены на консоли:

Before Each Test
Executing repeated test
After Each Test
=====================
Before Each Test
Executing repeated test
After Each Test
=====================
Before Each Test
Executing repeated test
After Each Test
=====================

Как видим,@BeforeEach and @AfterEach methods are called around each execution.

5. Настройка имени теста

В первом примере мы наблюдали, что выходные данные отчета о тестировании не содержат никаких идентификаторов. Это можно настроить дополнительно с помощью атрибутаname:

@RepeatedTest(value = 3, name = RepeatedTest.LONG_DISPLAY_NAME)
void repeatedTestWithLongName() {
    System.out.println("Executing repeated test with long name");

    assertEquals(2, Math.addExact(1, 1), "1 + 1 should equal 2");
}

Вывод теперь будет содержать имя метода вместе с индексом повторения:

repeatedTestWithLongName() :: repetition 1 of 3(repeatedTestWithLongName())
repeatedTestWithLongName() :: repetition 2 of 3(repeatedTestWithLongName())
repeatedTestWithLongName() :: repetition 3 of 3(repeatedTestWithLongName())

Другой вариант - использоватьRepeatedTest.SHORT_DISPLAY_NAME, который даст короткое имя теста:

repetition 1 of 3(repeatedTestWithShortName())
repetition 2 of 3(repeatedTestWithShortName())
repetition 3 of 3(repeatedTestWithShortName())

Однако, если нам нужно использовать наше индивидуальное имя, это очень возможно:

@RepeatedTest(value = 3, name = "Custom name {currentRepetition}/{totalRepetitions}")
void repeatedTestWithCustomDisplayName(TestInfo testInfo) {
    assertEquals(2, Math.addExact(1, 1), "1 + 1 should equal 2");
}

{currentRepetition} и{totalRepetitions} являются заполнителями для текущего повторения и общего количества повторений. Эти значения автоматически предоставляются JUnit во время выполнения, и дополнительная настройка не требуется. Результат в значительной степени соответствует ожиданиям:

Custom name 1/3(repeatedTestWithCustomDisplayName())
Custom name 2/3(repeatedTestWithCustomDisplayName())
Custom name 3/3(repeatedTestWithCustomDisplayName())

6. Доступ кRepetitionInfo

Помимо атрибутаname, JUnit также предоставляет доступ к метаданным повторения в нашем тестовом коде. Это достигается добавлением параметраRepetitionInfo в наш тестовый метод:

@RepeatedTest(3)
void repeatedTestWithRepetitionInfo(RepetitionInfo repetitionInfo) {
    System.out.println("Repetition #" + repetitionInfo.getCurrentRepetition());

    assertEquals(3, repetitionInfo.getTotalRepetitions());
}

Вывод будет содержать текущий индекс повторения для каждого выполнения:

Repetition #1
Repetition #2
Repetition #3

RepetitionInfo предоставляетсяRepetitionInfoParameterResolver и доступен только в контексте@RepeatedTest.

7. Заключение

В этом кратком руководстве мы изучили аннотацию@RepeatedTest, предоставляемую JUnit, и изучили различные способы ее настройки.

Не забудьте проверитьfull source code для этой статьи на GitHub.