Руководство по @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.