Статьи

Порядок выполнения теста в JUnit 5

Общая практика гласит, что автоматизированные тесты должны быть в состоянии запускаться независимо и без определенного порядка, а также результат теста не должен зависеть от результатов предыдущих тестов. Но существуют ситуации, когда определенный порядок выполнения теста может быть оправдан, особенно при интеграции или сквозных тестах.

По умолчанию в JUnit 5 выполнение тестовых методов повторяется между сборками, следовательно, детерминировано, но алгоритм намеренно неочевиден (как авторы состояния библиотеки). К счастью, порядок выполнения может быть скорректирован в соответствии с нашими потребностями с помощью встроенных методов-заказчиков или путем создания пользовательских.

org.junit.jupiter.api.TestMethodOrder

Чтобы изменить порядок выполнения теста, нам нужно аннотировать тестовый класс с помощью org.junit.jupiter.api.TestMethodOrder и передать тип метода orderer в качестве аргумента. Начиная с JUnit 5.4 есть три встроенных метода заказа: OrderAnnotation , Alphanumeric и Random . Мы также можем легко создать наш собственный метод org.junit.jupiter.api.MethodOrderer реализовав интерфейс org.junit.jupiter.api.MethodOrderer .

Заказ с аннотацией @Order

01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
18
19
20
21
22
23
package pl.codeleak.samples.junit5.basics;
 
import org.junit.jupiter.api.MethodOrderer;
import org.junit.jupiter.api.Order;
import org.junit.jupiter.api.Test;
import org.junit.jupiter.api.TestMethodOrder;
 
@TestMethodOrder(MethodOrderer.OrderAnnotation.class)
class TestExecutionOrderWithOrderAnnotation {
 
    @Order(1)
    @Test
    void aTest() {}
 
    @Order(2)
    @Test
    void bTest() {}
 
    @Order(3)
    @Test
    void cTest() {}
 
}

Буквенно-цифровой порядок

01
02
03
04
05
06
07
08
09
10
11
12
13
@TestMethodOrder(MethodOrderer.Alphanumeric.class)
class AlphanumericTestExecutionOrder {
 
    @Test
    void aTest() {}
 
    @Test
    void bTest() {}
 
    @Test
    void cTest() {}
 
}

Случайный порядок

Случайный порядок может быть полезен, если вы хотите убедиться, что порядок выполнения метода не является детерминированным между сборками.

01
02
03
04
05
06
07
08
09
10
11
12
13
@TestMethodOrder(MethodOrderer.Random.class)
class AlphanumericTestExecutionOrder {
 
    @Test
    void aTest() {}
 
    @Test
    void bTest() {}
 
    @Test
    void cTest() {}
 
}

Случайный метод orderer использует System.nanoTime() в качестве начального числа, но его можно изменить с помощью junit.jupiter.execution.order.random.seed конфигурации junit.jupiter.execution.order.random.seed . Значение этого свойства должно возвращать любую String которую можно преобразовать с помощью Long.valueOf(String) .

Один из способов настройки начального числа — предоставить свойство конфигурации в junit-platform.properties конфигурации junit-platform.properties :

1
junit.jupiter.execution.order.random.seed=42

Индивидуальный заказ

Создание пользовательского метода orderer может быть выполнено путем реализации интерфейса org.junit.jupiter.api.MethodOrderer и предоставления его в качестве аргумента @TestMethodOrder .

Приведенный ниже пример представляет собой метод заказа, который сортирует методы по длине их имен:

01
02
03
04
05
06
07
08
09
10
class MethodLengthOrderer implements MethodOrderer {
 
    private Comparator<MethodDescriptor> comparator =
            Comparator.comparingInt(methodDescriptor -> methodDescriptor.getMethod().getName().length());
 
    @Override
    public void orderMethods(MethodOrdererContext context) {
        context.getMethodDescriptors().sort(comparator);
    }
}

И использование:

01
02
03
04
05
06
07
08
09
10
11
12
13
@TestMethodOrder(MethodLengthOrderer.class)
class CustomTestExecutionOrder {
 
    @Test
    void aTest() {}
 
    @Test
    void abTest() {}
 
    @Test
    void abcTest() {}
 
}

Резюме

Возможность настройки порядка выполнения тестов в JUnit 5 может быть полезна в определенных ситуациях, и я рад видеть эту функцию. Полагаю, в большинстве случаев встроенных методов заказчиков будет более чем достаточно. Если нет, то существует простой способ реализации пользовательского.

Найдите примеры из используемых в этой статье (наряду со многими другими) на GitHub: https://github.com/kolorobot/junit5-samples/tree/master/junit5-basics

Смотреть оригинальную статью здесь: Порядок выполнения теста в JUnit 5

Мнения, высказанные участниками Java Code Geeks, являются их собственными.