Перейти к основному содержимому

Руководство по @RepeatedTest в июне 5

· 4 мин. чтения

1. Обзор

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

Если вы хотите узнать больше о JUnit 5, ознакомьтесь с другими нашими статьями , объясняющими основы и руководство по JUnit 5 .

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

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

<dependency>
<groupId>org.junit.jupiter</groupId>
<artifactId>junit-jupiter-engine</artifactId>
<version>5.8.1</version>
<scope>test</scope>
</dependency>

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

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

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

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

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

Каждое выполнение @RepeatedTest будет вести себя как обычный @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 и @AfterEach вызываются при каждом выполнении .

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

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

@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

Помимо атрибута имени , 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, и узнали о различных способах ее настройки.

Не забудьте ознакомиться с полным исходным кодом этой статьи на GitHub.