Редът на тестовете в JUnit

1. Общ преглед

По подразбиране JUnit изпълнява тестове, използвайки детерминиран, но непредсказуем ред ( MethodSorters.DEFAULT ).

В повечето случаи това поведение е напълно фино и приемливо; но има случаи, когато трябва да наложим конкретна заповед.

2. Тестова поръчка в JUnit 5

В JUnit 5 можем да използваме @TestMethodOrder, за да контролираме реда за изпълнение на тестовете .

Можем да използваме собствения си MethodOrderer , както ще видим по-късно, или да изберем един от трите вградени поръчки:

  1. @Onder Annotation
  2. Буквено-цифров ред
  3. Случайна поръчка

2.1. Използване на @Order Annotation

Можем да използваме анотацията @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. Използване на буквено-цифров ред

Също така можем да провеждаме тестове въз основа на имената им в буквено-цифров ред:

@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. Използване на поръчка по поръчка

И накрая, можем да използваме нашата собствена поръчка чрез прилагане на интерфейса MethodOrderer .

В нашия 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. Тестова поръчка в JUnit 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 - тази стратегия използва естествената JVM поръчка - която може да бъде различна за всяко изпълнение:

@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.

Както винаги, примерите, използвани в тази статия, могат да бъдат намерени в GitHub.