7.1 Annotazione @Suite

E alcune annotazioni usate più di frequente. Anche se non li usi, vedrai sicuramente i test con loro. Pertanto, è necessario comprendere almeno in termini generali ciò che è scritto lì.

I test possono essere combinati in gruppi. C'è un'annotazione speciale per questo @Suite. Esempio:

@Suite
@SuiteDisplayName("JUnit Platform Suite Demo")
@SelectPackages("com.codegym.test")
@IncludeClassNamePatterns(".*Tests")
class SuiteDemo {
}

In questo caso, l'annotazione @Suite è abbinata ad altre annotazioni.

  • SuiteDisplayName– imposta il nome del gruppo di test nel log;
  • SelectPackages- imposta la lista dei pacchetti dove cercare le classi di test;
  • IncludeClassNamePatterns– imposta lo schema dei nomi delle classi di test.

Perché tali difficoltà? Bene, immagina che tutti i test del progetto vengano eseguiti, diciamo, 50 ore. E eseguirli dopo ogni commit è molto costoso. In tal caso, è utile creare alcuni script di test separati e impostare i test in modo molto più flessibile.

7.2 Annotazione @Order

Un'altra annotazione comune è @TestMethodOrder. Consente di specificare l'ordine in cui i metodi di test vengono chiamati nella classe di test. Può essere molto utile quando sai che le chiamate di metodo si influenzano a vicenda, ma in un certo ordine, tutto dovrebbe funzionare come dovrebbe. Usato abbastanza spesso.

Innanzitutto, puoi impostare i metodi da chiamare in ordine alfabetico :

@TestMethodOrder(MethodOrderer.MethodName.class)
public class AlphanumericOrderUnitTest {

}

In secondo luogo, ogni metodo può avere un'annotazione speciale con il suo numero ordinale.

@TestMethodOrder(OrderAnnotation.class)
public class OrderAnnotationUnitTest {

    @Test
    @Order(1)
    public void firstTest() {
    }

    @Test
    @Order(2)
    public void secondTest() {
    }
}

O anche creare una classe separata che specificherà l'ordine in cui vengono chiamati i test:

@TestMethodOrder(CustomOrder.class)
public class CustomOrderUnitTest {

}

//sort method names alphabetically, but ignoring case
public class CustomOrder implements MethodOrderer {
    public void orderMethods(MethodOrdererContext context) {
        context.getMethodDescriptors().sort(
        (MethodDescriptor m1, MethodDescriptor m2)->
           m1.getMethod().getName().compareToIgnoreCase(m2.getMethod().getName()));
    }
}

7.3 Annotazione @DisplayName

Infine, a ciascun test può essere assegnato un nome. Può essere conveniente se ci sono molti test e crei scenari speciali (sottoinsiemi) di test. C'è un'annotazione speciale per questo @DisplayName.

Esempio:

@DisplayName("Friendly name for the test")
public class DisplayNameCustomTest {

    @Test
    @DisplayName("Input Validation")
    void inputData() {
    }

    @DisplayName("Checking critical situations")
    @Test
    void criticalCases() {
    }
}

Come nel caso dell'impostazione dell'ordine dei test, qui è possibile creare un metodo speciale che genererà i nomi dei test e dei metodi di test. Esempio:

@DisplayNameGeneration(DisplayNameGeneratorUnitTest.ReplaceCamelCase.class)
class DisplayNameGeneratorUnitTest {

    @Test
    void camelCaseName() {
    }

    static class ReplaceCamelCase extends DisplayNameGenerator.Standard {
        @Override
        public String generateDisplayNameForClass(Class testClass) {
            return super.generateDisplayNameForClass(testClass).toUpperCase();
        }
 }
}

Guarda com'è facile :)