Listagem 5. Registrando as invocações dos métodos do ciclo de vida Junit 5 (LifeCycledemotest.java)


package com.javaworld.geekcap.lifecycle;

import org.junit.jupiter.api.*;

public class LifecycleDemoTest {

    @BeforeAll
    static void beforeAll() {
        System.out.println("Connect to the database");
    }

    @BeforeEach
    void beforeEach() {
        System.out.println("Load the schema");
    }

    @AfterEach
    void afterEach() {
        System.out.println("Drop the schema");
    }

    @AfterAll
    static void afterAll() {
        System.out.println("Disconnect from the database");
    }

    @Test
    void testOne() {
        System.out.println("Test One");
    }

    @Test
    void testTwo() {
        System.out.println("Test Two");
    }
}

A saída da execução deste teste imprime o seguinte:


Connect to the database
Load the schema
Test One
Drop the schema
Load the schema
Test Two
Drop the schema
Disconnect from the database

Como você pode ver nesta saída, o beforeAll O método é chamado primeiro e pode fazer algo como conectar -se a um banco de dados ou criar uma grande estrutura de dados na memória. Em seguida, o beforeEach O método prepara os dados para cada teste; Por exemplo, preenchendo um banco de dados de teste com um conjunto esperado de dados. O primeiro teste depois é executado, seguido pelo afterEach método. Este processo (beforeEach-> teste—>afterEach) continua até que todos os testes tenham concluído. Finalmente, o afterAll O método limpa o ambiente de teste, possivelmente desconectando de um banco de dados.

Antes de encerrar essa introdução inicial aos testes com o JUNIT 5, mostrarei como usar tags para executar seletivamente diferentes tipos de casos de teste. As tags são usadas para identificar e filtrar testes específicos que você deseja executar em vários cenários. Por exemplo, você pode marcar uma classe ou método de teste como um teste de integração e outro como código de desenvolvimento. Os nomes e usos das tags dependem de você.

Vamos criar três novas classes de teste e marcar duas delas como desenvolvimento e uma como integração, presumivelmente para diferenciar entre os testes que você deseja executar ao criar para diferentes ambientes. As listagens 6, 7 e 8 mostram esses três testes simples.

Listagem 6. Junit 5 Tags, Teste 1 (Testone.java)


package com.javaworld.geekcap.tags;

import org.junit.jupiter.api.Tag;
import org.junit.jupiter.api.Test;

@Tag("Development")
class TestOne {
    @Test
    void testOne() {
        System.out.println("Test 1");
    }
}

Listagem 7. Junit 5 Tags, Teste 2 (Testtwo.java)


package com.javaworld.geekcap.tags;

import org.junit.jupiter.api.Tag;
import org.junit.jupiter.api.Test;

@Tag("Development")
class TestTwo {
    @Test
    void testTwo() {
        System.out.println("Test 2");
    }
}

Listagem 8. Junit 5 Tags, Teste 3 (TestThree.java)


package com.javaworld.geekcap.tags;

import org.junit.jupiter.api.Tag;
import org.junit.jupiter.api.Test;

@Tag("Integration")
class TestThree {
    @Test
    void testThree() {
        System.out.println("Test 3");
    }
}

As tags são implementadas por meio de anotações e você pode anotar uma classe de teste inteira ou métodos individuais em uma classe de teste; Além disso, uma classe ou um método pode ter várias tags. Neste exemplo, Testone e Testtwo são anotados com o “Development” tag e testhree são anotados com o “Integration” marcação. Podemos filtrar as execuções de teste de maneiras diferentes com base em tags. O mais simples deles é especificar um teste na sua linha de comando Maven; por exemplo, o seguinte executa apenas testes marcados como “Development”:


mvn clean test -Dgroups="Development"

O groups A propriedade permite especificar uma lista separada por vírgula de nomes de tags para os testes que você deseja executar o Junit 5. A execução disso produz a seguinte saída:


(INFO) -------------------------------------------------------
(INFO)  T E S T S
(INFO) -------------------------------------------------------
(INFO) Running com.javaworld.geekcap.tags.TestOne
Test 1
(INFO) Tests run: 1, Failures: 0, Errors: 0, Skipped: 0, Time elapsed: 0.029 s - in com.javaworld.geekcap.tags.TestOne
(INFO) Running com.javaworld.geekcap.tags.TestTwo
Test 2
(INFO) Tests run: 1, Failures: 0, Errors: 0, Skipped: 0, Time elapsed: 0.001 s - in com.javaworld.geekcap.tags.TestTwo

Da mesma forma, poderíamos executar apenas os testes de integração da seguinte forma:


mvn clean test -Dgroups="Integration"

Ou poderíamos executar testes de desenvolvimento e integração:


mvn clean test -Dgroups="Development, Integration"

Além do groups Propriedade, Junit 5 permite que você use um excludedGroups Propriedade para executar todos os testes que não possuem a tag especificada. Por exemplo, em um ambiente de desenvolvimento, não queremos executar os testes de integração, para que possamos executar o seguinte:


mvn clean test -DexcludedGroups="Integration"

Isso é útil porque uma grande aplicação pode ter literalmente milhares de testes. Se você quisesse criar essa diferenciação ambiental e adicionar novos testes de produção, você não gostaria de voltar e adicionar um “Development” Tag para os outros 10.000 testes.

Finalmente, você pode adicionar esses mesmos groups e excludedGroups campos para o surefire Plugue no seu arquivo maven pom. Você também pode controlar esses campos usando perfis Maven. Encorajo você a revisar o Guia do Usuário do Junit 5 para saber mais sobre tags.

Conclusão

Este artigo introduziu alguns dos destaques do trabalho com o Junit 5. Mostrei como configurar um projeto MAVEN para usar o Junit 5 e como escrever testes usando o @Test e @ParameterizedTest anotações. Em seguida, introduzi as anotações do ciclo de vida do JUNIT 5, seguidas de uma olhada no uso e benefícios das tags de filtro.