7.1 Anotação @Suite

E algumas anotações usadas com mais frequência. Mesmo que você não os use, com certeza verá testes com eles. Portanto, é necessário entender pelo menos em termos gerais o que está escrito lá.

Os testes podem ser combinados em grupos. Há uma anotação especial para isso @Suite. Exemplo:

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

Nesse caso, a anotação @Suite é emparelhada com outras anotações.

  • SuiteDisplayName– define o nome do grupo de teste no log;
  • SelectPackages- define a lista de pacotes onde procurar por classes de teste;
  • IncludeClassNamePatterns– define o padrão de nomes de classe de teste.

Por que tais dificuldades? Bem, imagine que todos os testes do projeto sejam executados, digamos, 50 horas. E executá-los após cada commit é muito caro. Nesse caso, é útil criar alguns scripts de teste separados e configurar o teste de maneira muito mais flexível.

7.2 Anotação @Order

Outra anotação comum é @TestMethodOrder. Ele permite que você especifique a ordem na qual os métodos de teste são chamados na classe de teste. Pode ser muito útil quando você sabe que as chamadas de método afetam umas às outras, mas em uma determinada ordem, tudo deve funcionar como deveria. Usado com bastante frequência.

Primeiro, você pode definir os métodos a serem chamados em ordem alfabética :

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

}

Em segundo lugar, cada método pode ter uma anotação especial com seu número ordinal.

@TestMethodOrder(OrderAnnotation.class)
public class OrderAnnotationUnitTest {

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

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

Ou ainda crie uma classe separada que irá especificar a ordem em que os testes são chamados:

@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 Anotação @DisplayName

Finalmente, cada teste pode receber um nome. Pode ser conveniente se houver muitos testes e você criar cenários especiais (subconjuntos) de testes. Há uma anotação especial para isso @DisplayName.

Exemplo:

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

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

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

Como no caso de definir a ordem dos testes, aqui você pode criar um método especial que irá gerar os nomes dos testes e métodos de teste. Exemplo:

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

Veja como é fácil :)