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.