L'ordine dei test in JUnit

1. Panoramica

Per impostazione predefinita, JUnit esegue i test utilizzando un ordine deterministico ma imprevedibile ( MethodSorters.DEFAULT ).

Nella maggior parte dei casi, quel comportamento è perfettamente corretto e accettabile; ma ci sono casi in cui dobbiamo applicare un ordine specifico.

2. Ordine di prova in JUnit 5

In JUnit 5, possiamo usare @TestMethodOrder per controllare l'ordine di esecuzione dei test .

Possiamo usare il nostro MethodOrderer , come vedremo più avanti, oppure possiamo selezionare uno dei tre ordinatori incorporati:

  1. @ Annotazione dell'ordine
  2. Ordine alfanumerico
  3. Ordine casuale

2.1. Utilizzando l' annotazione @Order

Possiamo usare l' annotazione @Order per imporre l'esecuzione dei test in un ordine specifico.

Nell'esempio seguente, i metodi verranno eseguiti in questo ordine: firstTest () , quindi secondTest () e infine 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. Utilizzo dell'ordine alfanumerico

Possiamo anche eseguire test basati sui loro nomi in ordine alfanumerico:

@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"); } }

Nota che l'ordine alfanumerico fa distinzione tra maiuscole e minuscole, quindi i caratteri maiuscoli vengono prima di quelli minuscoli.

I test verranno eseguiti in questo ordine: myATest () , myBTest () e infine myaTest () .

2.3. Utilizzo di un ordine personalizzato

Infine, possiamo utilizzare il nostro ordine personalizzato implementando l' interfaccia MethodOrderer .

Nel nostro CustomOrder , ordineremo i test in base ai loro nomi in un ordine alfanumerico senza distinzione tra maiuscole e minuscole:

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())); } }

Quindi, utilizzeremo CustomOrder per eseguire gli stessi test del nostro esempio precedente in questo ordine: myATest () , myaTest () e, infine, myBTest () :

@TestMethodOrder(CustomOrder.class) public class CustomOrderUnitTest { // ... @AfterAll public static void assertOutput() { assertEquals(output.toString(), "AaB"); } }

3. Ordine di prova in JUnit 4

Se stai ancora utilizzando JUnit 4, le API per l'ordinazione dei test sono leggermente diverse.

Esaminiamo le opzioni per ottenere questo risultato anche nelle versioni precedenti.

3.1. Utilizzo di MethodSorters.DEFAULT

Questa strategia predefinita confronta i metodi di test utilizzando i loro codici hash. In caso di collisione hash, viene utilizzato l'ordine lessicografico:

@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"); } }

Quando eseguiamo i test nella classe sopra, vedremo che passano tutti, incluso assertOutput () .

3.2. Utilizzando MethodSorters.JVM

Un'altra strategia di ordinazione è MethodSorters.JVM : questa strategia utilizza l'ordine naturale JVM, che può essere diverso per ogni esecuzione:

@FixMethodOrder(MethodSorters.JVM) public class JVMOrderOfExecutionTest { // same as above }

Ogni volta che eseguiamo i test in questa classe, otteniamo un risultato diverso.

3.3. Utilizzo di MethodSorters.NAME_ASCENDING

Infine, questa strategia può essere utilizzata per eseguire i test nel loro ordine lessicografico:

@FixMethodOrder(MethodSorters.NAME_ASCENDING) public class NameAscendingOrderOfExecutionTest { // same as above @AfterClass public static void assertOutput() { assertEquals(output.toString(), "abc"); } }

Allo stesso modo, quando eseguiamo i test in questa classe, vediamo che passano tutti, incluso assertOutput () , che conferma l'ordine di esecuzione che abbiamo impostato con l'annotazione.

4. Conclusione

In questo breve tutorial, abbiamo esaminato i modi per impostare l'ordine di esecuzione disponibile in JUnit.

E, come sempre, gli esempi utilizzati in questo articolo possono essere trovati su GitHub.