Общая практика гласит, что автоматизированные тесты должны быть в состоянии запускаться независимо и без определенного порядка, а также результат теста не должен зависеть от результатов предыдущих тестов. Но существуют ситуации, когда определенный порядок выполнения теста может быть оправдан, особенно при интеграции или сквозных тестах.
По умолчанию в 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, являются их собственными. |