Порядок испытаний в Юнит
1. обзор
По умолчаниюJUnit runs tests using a deterministic, but unpredictable order (MethodSorters.DEFAULT).
В большинстве случаев такое поведение совершенно нормально и приемлемо; но бывают случаи, когда нам нужно обеспечить соблюдение определенного порядка.
2. Тестовый заказ в JUnit 5
В JUnit 5we can use @TestMethodOrder to control the execution order of tests.
Мы можем использовать собственныеMethodOrderer, как мы увидим позже, или можем выбрать одного из трех встроенных заказчиков:
-
@Order Аннотация
-
Alphanumeric Заказ
-
Случайный порядок
2.1. Использование аннотации@Order
Мы можем использовать аннотацию@Order, чтобы заставить тесты запускаться в определенном порядке.
В следующем примере методы будут выполняться в следующем порядке -firstTest(), затемsecondTest() и, наконец,thirdTest():
@TestMethodOrder(OrderAnnotation.class)
public class OrderAnnotationUnitTest {
private static StringBuilder output = new StringBuilder("");
@Test
@Order(1)
public void firstTest() {
output.append("a");
}
@Test
@Order(2)
public void secondTest() {
output.append("b");
}
@Test
@Order(3)
public void thirdTest() {
output.append("c");
}
@AfterAll
public static void assertOutput() {
assertEquals(output.toString(), "abc");
}
}
2.2. ИспользованиеAlphanumeric Order
Мы также можем запускать тесты на основе их имен в алфавитно-цифровом порядке:
@TestMethodOrder(Alphanumeric.class)
public class AlphanumericOrderUnitTest {
private static StringBuilder output = new StringBuilder("");
@Test
public void myATest() {
output.append("A");
}
@Test
public void myBTest() {
output.append("B");
}
@Test
public void myaTest() {
output.append("a");
}
@AfterAll
public static void assertOutput() {
assertEquals(output.toString(), "ABa");
}
}
Обратите внимание, что алфавитно-цифровой порядок чувствителен к регистру, поэтому заглавные буквы идут в первую очередь, затем строчные.
Тесты будут выполняться в следующем порядке:myATest(),myBTest() и, наконец,myaTest().
2.3. Использование специального заказа
Наконец,we can use our own custom order by implementing theMethodOrdererinterface.
В нашемCustomOrder мы упорядочим тесты по их именам в алфавитно-цифровом порядке без учета регистра:
public class CustomOrder implements MethodOrderer {
@Override
public void orderMethods(MethodOrdererContext context) {
context.getMethodDescriptors().sort(
(MethodDescriptor m1, MethodDescriptor m2)->
m1.getMethod().getName().compareToIgnoreCase(m2.getMethod().getName()));
}
}
Затем мы будем использоватьCustomOrder, чтобы запустить те же тесты из нашего предыдущего примера в следующем порядке -myATest(),myaTest() и, наконец,myBTest():
@TestMethodOrder(CustomOrder.class)
public class CustomOrderUnitTest {
// ...
@AfterAll
public static void assertOutput() {
assertEquals(output.toString(), "AaB");
}
}
3. Тестовый заказ в Юнит 4
Если вы все еще используете JUnit 4, API для заказа тестов немного отличаются.
Давайте рассмотрим варианты достижения этого и в предыдущих версиях.
3.1. ИспользуяMethodSorters.DEFAULT
Эта стратегия по умолчанию сравнивает методы тестирования, используя их хэш-коды. В случае коллизии хэшей используется лексикографический порядок:
@FixMethodOrder(MethodSorters.DEFAULT)
public class DefaultOrderOfExecutionTest {
private static StringBuilder output = new StringBuilder("");
@Test
public void secondTest() {
output.append("b");
}
@Test
public void thirdTest() {
output.append("c");
}
@Test
public void firstTest() {
output.append("a");
}
@AfterClass
public static void assertOutput() {
assertEquals(output.toString(), "cab");
}
}
Когда мы выполним тесты в классе выше, мы увидим, что все они прошли, включаяassertOutput().
3.2. ИспользуяMethodSorters.JVM
Другая стратегия заказа:MethodSorters.JVM -this strategy utilizes the natural JVM ordering – which can be different for each run:
@FixMethodOrder(MethodSorters.JVM)
public class JVMOrderOfExecutionTest {
// same as above
}
Каждый раз, когда мы выполняем тесты в этом классе, мы получаем другой результат.
3.3. ИспользуяMethodSorters.NAME_ASCENDING
Наконец, эту стратегию можно использовать для запуска теста в их лексикографическом порядке:
@FixMethodOrder(MethodSorters.NAME_ASCENDING)
public class NameAscendingOrderOfExecutionTest {
// same as above
@AfterClass
public static void assertOutput() {
assertEquals(output.toString(), "abc");
}
}
Точно так же, когда мы выполняем тесты в этом классе, мы видим, что все они проходят, включаяassertOutput(), что подтверждает порядок выполнения, который мы установили с помощью аннотации.
4. Заключение
В этом кратком руководстве мы рассмотрели способы установки порядка выполнения, доступного в JUnit.
И, как всегда, примеры, использованные в этой статье, можно найтиover on GitHub.