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