Это продолжение туториала по JUnit 5. Введение опубликовано здесь.
В JUnit 5 жизненный цикл теста управляется четырьмя основными аннотациями, то есть @BeforeAll, @BeforeEach, @AfterEach и @AfterAll. Вместе с тем, каждый тестовый метод должен быть помечен аннотацией @Test
из пакета org.junit.jupiter.api.
Оглавление
Фазы жизненного цикла теста
Аннотации Before и After
Отключение тестов
Assertions
Assumptions
1. Фазы жизненного цикла теста
Обычно тестовый класс содержит несколько тестовых методов. JUnit управляет выполнением каждого метода тестирования в форме жизненного цикла.
Полный жизненный цикл тестового сценария можно разделить на три фазы с помощью аннотаций.
Setup (настройка): на этом этапе создается тестовая инфраструктура. JUnit обеспечивает настройку уровня класса (@BeforeAll) и настройку уровня метода (@BeforeEach). Как правило, тяжелые объекты, такие как подключения к базам данных, создаются при настройке уровня класса, в то время как легкие объекты, такие как тестовые объекты, перезапускаются при настройке уровня метода.
Test Execution (выполнение теста): на этом этапе происходит выполнение теста и assertion. Результат выполнения будет означать успех или неудачу теста.
Cleanup (очистка): этот этап используется для очистки настройки тестовой инфраструктуры, настроенной на первом этапе. Как на этане настройки, очистка также выполняется на уровне класса (@AfterAll) и уровне метода (@AfterEach).
2. Аннотации Before и After
Как показано выше, в жизненном цикле теста нам в первую очередь потребуются аннотированные методы для настройки и очистки тестовой среды или тестовых данных, на которых выполняются тесты.
В JUnit по умолчанию для каждого метода тестирования создается новый экземпляр теста.
Аннотации @BeforeAll и @AfterAll - понятные по названию - должны вызываться только один раз за весь цикл выполнения тестов. Поэтому они должны быть объявлены
static
.@BeforeEach
и@AfterEach
вызываются для каждого экземпляра теста, поэтому они не должны бытьstatic
.Если есть несколько методов, помеченных одной и той же аннотацией (например, два метода с
@BeforeAll
), то порядок их выполнения не определен.
public class AppTest {
@BeforeAll
static void setup(){
System.out.println("@BeforeAll executed");
}
@BeforeEach
void setupThis(){
System.out.println("@BeforeEach executed");
}
@Test
void testCalcOne()
{
System.out.println("======TEST ONE EXECUTED=======");
Assertions.assertEquals( 4 , Calculator.add(2, 2));
}
@Test
void testCalcTwo()
{
System.out.println("======TEST TWO EXECUTED=======");
Assertions.assertEquals( 6 , Calculator.add(2, 4));
}
@AfterEach
void tearThis(){
System.out.println("@AfterEach executed");
}
@AfterAll
static void tear(){
System.out.println("@AfterAll executed");
}
}
Тестовый вывод:
@BeforeAll executed
@BeforeEach executed
======TEST ONE EXECUTED=======
@AfterEach executed
@BeforeEach executed
======TEST TWO EXECUTED=======
@AfterEach executed
@AfterAll executed
3. Отключение тестов
Чтобы отключить тест в JUnit 5, вам нужно будет использовать аннотацию @Disabled. Это эквивалентно аннотации @Ignored
JUnit 4.
Аннотация @Disabled
может быть применена к классу тестирования (отключает все методы тестирования в этом классе) или к отдельным методам тестирования.
@Disabled
@Test
void testCalcTwo()
{
System.out.println("======TEST TWO EXECUTED=======");
Assertions.assertEquals( 6 , Calculator.add(2, 4));
}
4. Assertions
В любом методе тестирования нам нужно будет определить, прошел он или нет. Мы можем сделать это с помощью Assertions (утверждений).
Утверждения помогают сравнить ожидаемый результат с фактическим результатом теста. Для простоты все утверждения JUnit Jupiter являются статическими методами в классе org.junit.jupiter.Assertions.
@Test
public void test()
{
//Test will pass
Assertions.assertEquals(4, Calculator.add(2, 2));
//Test will fail
Assertions.assertEquals(3, Calculator.add(2, 2), "Calculator.add(2, 2) test failed");
//Test will fail
Supplier<String> messageSupplier = ()-> "Calculator.add(2, 2) test failed";
Assertions.assertEquals(3, Calculator.add(2, 2), messageSupplier);
}
Чтобы тест не прошел, просто используйте метод Assertions.fail()
.
@Test
void testCase() {
Assertions.fail("not found good reason to pass");
}
5. Assumptions
Assumptions (предположения) предоставляют static
методы для поддержки выполнения условного теста на основе предположений. Неуспешное предположение приводит к прерыванию теста.
Предположения обычно используются всякий раз, когда нет смысла продолжать выполнение данного метода тестирования. В отчете о тестировании эти тесты будут отмечены как пройденные.
Класс предположений имеет три метода со многими перегруженными формами:
assumeFalse():
проверяет, что данное предположение false.assumeTrue()
: подтверждает данное предположение, чтобы быть true.assumingThat()
: выполняет предоставленный методExecutable
, но только если предоставленное предположение верно.
@Test
void testOnDev()
{
System.setProperty("ENV", "DEV");
Assumptions.assumeTrue("DEV".equals(System.getProperty("ENV")));
//remainder of test will proceed
}
@Test
void testOnProd()
{
System.setProperty("ENV", "PROD");
Assumptions.assumeTrue("DEV".equals(System.getProperty("ENV")));
//remainder of test will be aborted
}
Выше перечислены аннотации и классы для жизненного цикла JUnit теста.
Хорошего изучения!!!