Порядок испытаний в Юнит

Порядок испытаний в Юнит

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, как мы увидим позже, или можем выбрать одного из трех встроенных заказчиков:

  1. @Order Аннотация

  2. Alphanumeric Заказ

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

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.