Это продолжение туториала по JUnit 5. Введение опубликовано здесь.
Аннотация @RepeatedTest
используется для написания повторяющихся тестовых шаблонов, которые могут выполняться несколько раз в JUnit. Частоту повторения можно настроить как параметр аннотации @RepeatedTest
.
Оглавление
-
Аннотация @RepeatedTest
Синтаксис
Методы жизненного цикла
Пользовательские отображаемые имена
Интерфейс RepetitionInfo
1. Аннотация @RepeatedTest
Аннотация @RepeatedTest используется для обозначения метода тестирования, который должен повторяться указанное количество раз с настраиваемым отображаемым именем.
Чтобы повторить тест с различными аргументами, рассмотрите возможность использования аннотации @ParameterizedTest.
1.1. Синтаксис
Чтобы создать повторяемый тест, аннотируйте метод теста с помощью @RepeatedTest.
В данном примере тестовый метод использует аннотацию @RepeatedTest (5). Это означает, что тест будет выполнен пять раз.
@DisplayName("Add operation test")
@RepeatedTest(5)
void addNumber(TestInfo testInfo) {
Calculator calculator = new Calculator();
Assertions.assertEquals(2, calculator.add(1, 1), "1 + 1 should equal 2");
}
1.2. Методы жизненного цикла
Обратите внимание, что каждый вызов повторного теста ведет себя как выполнение обычного теста с полной поддержкой тех же обратных вызовов и расширений жизненного цикла.
Это означает, что аннотированные методы жизненного цикла @BeforeEach и @AfterEach будут вызываться при каждом вызове теста.
package com.howtodoinjava.junit5.examples;
import org.junit.jupiter.api.AfterAll;
import org.junit.jupiter.api.AfterEach;
import org.junit.jupiter.api.Assertions;
import org.junit.jupiter.api.BeforeAll;
import org.junit.jupiter.api.BeforeEach;
import org.junit.jupiter.api.DisplayName;
import org.junit.jupiter.api.RepeatedTest;
import org.junit.jupiter.api.RepetitionInfo;
import org.junit.jupiter.api.Test;
import org.junit.jupiter.api.TestInfo;
import org.junit.platform.runner.JUnitPlatform;
import org.junit.runner.RunWith;
@RunWith(JUnitPlatform.class)
public class RepeatedTestExample {
@BeforeAll
public static void init(){
System.out.println("Before All init() method called");
}
@BeforeEach
public void initEach(){
System.out.println("Before Each initEach() method called");
}
@DisplayName("Add operation test")
@RepeatedTest(5)
void addNumber(TestInfo testInfo, RepetitionInfo repetitionInfo)
{
System.out.println("Running addNumber test -> " + repetitionInfo.getCurrentRepetition());
Assertions.assertEquals(2, Calculator.add(1, 1), "1 + 1 should equal 2");
}
@AfterEach
public void cleanUpEach(){
System.out.println("After Each cleanUpEach() method called");
}
@AfterAll
public static void cleanUp(){
System.out.println("After All cleanUp() method called");
}
}
Результат вышеуказанного теста:
Before All init() method called
Before Each initEach() method called
After Each cleanUpEach() method called
Before Each initEach() method called
Running addNumber test -> 1
After Each cleanUpEach() method called
Before Each initEach() method called
Running addNumber test -> 2
After Each cleanUpEach() method called
Before Each initEach() method called
Running addNumber test -> 3
After Each cleanUpEach() method called
Before Each initEach() method called
Running addNumber test -> 4
After Each cleanUpEach() method called
Before Each initEach() method called
Running addNumber test -> 5
After Each cleanUpEach() method called
After All cleanUp() method called
2. Пользовательские отображаемые имена
Помимо указания количества повторений, мы можем дать каждому повторению собственное отображаемое имя. Это настраиваемое отображаемое имя может быть комбинацией {статический текст + динамические заполнители}.
В настоящее время поддерживаются три заполнителя (placeholder):
{displayName}
: отображаемое имя метода@RepeatedTest
.{currentRepetition}
: текущее количество повторений.{totalRepetitions}
: общее количество повторов.
public class JUnit5AnnotationsExample
{
@DisplayName("Add operation test")
@RepeatedTest(value = 5, name = "{displayName} - repetition {currentRepetition} of {totalRepetitions}")
void addNumber(TestInfo testInfo) {
Assertions.assertEquals(2, Calculator.add(1, 1), "1 + 1 should equal 2");
}
}
Выполнение вышеуказанного теста дает вывод ниже:
Мы можем использовать один из двух предопределенных форматов, то есть LONG_DISPLAY_NAME
и SHORT_DISPLAY_NAME
. Последний формат используется по умолчанию, если он не указан.
RepeatedTest.LONG_DISPLAY_NAME
– {displayName} :: повторение {currentRepetition} из {totalRepetitions}RepeatedTest.SHORT_DISPLAY_NAME
– повторение {currentRepetition} из {totalRepetitions}
@DisplayName("Add operation test")
@RepeatedTest(value = 5, name = RepeatedTest.LONG_DISPLAY_NAME)
void addNumber(TestInfo testInfo) {
Assertions.assertEquals(2, Calculator .add(1, 1), "1 + 1 should equal 2");
}
3. Интерфейс RepetitionInfo
Интерфейс RepetitionInfo используется для получения информации о текущем повторении повторяющегося теста внутри @RepeatedTest
методов, или методов жизненного цикла, таких как @BeforeEach
, и @AfterEach
.
public class JUnit5AnnotationsExample {
@BeforeEach
public void initEach(RepetitionInfo info){
int currentRepetition = info.getCurrentRepetition();
int totalRepetitions = info.getTotalRepetitions();
//Use information as needed
}
@DisplayName("Add operation test")
@RepeatedTest(value = 5, name="{displayName} :: repetition {currentRepetition} of {totalRepetitions}")
void addNumber(TestInfo testInfo) {
Calculator calculator = new Calculator();
Assertions.assertEquals(2, calculator.add(1, 1), "1 + 1 should equal 2");
}
@AfterEach
public void cleanUpEach(RepetitionInfo info){
int currentRepetition = info.getCurrentRepetition();
int totalRepetitions = info.getTotalRepetitions();
//Use information as needed
}
}
Хорошего изучения!!!