Управление порядком выполнения JUnit тестов. Аннотация @FixMethodOrder

Java

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

Для обеспечения контроля за порядком выполнения тестов в JUnit предоставлена аннотация для тестового класса – @FixMethodOrder. В зависимости от параметра этой аннотации можно получить три различных варианта поведения:

  • Детерминированный, основанный на hashcode. Это порядок по умолчанию.
  • В порядке возрастания имени метода
  • Порядок обеспечиваемый JVM. Порядок запуска может меняться от запуска к запуску.

В качестве параметра в аннотации @FixMethodOrder используется Enum MethodSorters, который содержит в себе 3 константы:

  • DEFAULT
  • JVM
  • NAME_ASCENDING

Пример применения:

import org.junit.FixMethodOrder;
import org.junit.Rule;
import org.junit.Test;
import org.junit.rules.TestName;
import org.junit.runners.MethodSorters;

//@FixMethodOrder
//@FixMethodOrder(MethodSorters.DEFAULT)
//@FixMethodOrder(MethodSorters.NAME_ASCENDING)
//@FixMethodOrder(MethodSorters.JVM)
public class TestOrderExample {
    @Rule
    public TestName testName = new TestName();
 
    @Test
    public void simpleTest() {
        printDetails();
    }    
     
    @Test
    public void test() {
        printDetails();
    }
     
    @Test
    public void anotherTest() {
        printDetails();
    }
     
    private void printDetails() {
        System.out.println(testName.getMethodName() + ", hash(" + testName.getMethodName().hashCode() + ")");
    }
}

В случае запуска без аннотации или с аннотацией из 7 или 8 строки получается вариант по умолчанию с сортировкой по хэш-коду имени метода. Результат выполнения будет следующий:

simpleTest, hash(-1431584412)
anotherTest, hash(-298154443)
test, hash(3556498)

При запуске с аннотацией @FixMethodOrder(MethodSorters.NAME_ASCENDING) тесты запускаются согласно лексикографическому порядку сортировки их имени. Результат выполнения будет следующий:

anotherTest, hash(-298154443)
simpleTest, hash(-1431584412)
test, hash(3556498)

При запуске с аннотацией @FixMethodOrder(MethodSorters.JVM) тесты запускаются случайным образом. Результат выполнения может быть, к примеру, таким:

test, hash(3556498)
anotherTest, hash(-298154443)
simpleTest, hash(-1431584412)

Михаил Миронов

Живу в Нижнем Новгороде, работаю программистом с 2017 года, основная специализация Java, но также хорошо знаю PHP, Python, XML, HTML/CSS.

Добавить комментарий