Порядок выполнения 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)