Usando o JUnit 5 com Gradle

Usando o JUnit 5 com Gradle

1. Visão geral

Neste tutorial, vamos executar testes na nova plataforma JUnit 5 com a ferramenta de compilação Gradle.

Vamos configurar um projeto compatível com a versão antiga e a nova.

Sinta-se à vontade para lerA Guide to JUnit 5 para obter mais informações sobre a nova versão. Ou oIntroduction to Gradle para informações detalhadas sobre a ferramenta de compilação.

2. Configuração Gradle

Primeiro, verificamos se a versão 4.6 ou superior da ferramenta de compilação está instalada, pois é a versão mais antiga que funciona com JUnit 5.

A maneira mais simples é apenas executar o comandogradle -v:

$> gradle -v
------------------------------------------------------------
Gradle 4.10.2
------------------------------------------------------------

E, se necessário, podemos seguir os passos deinstallation para obter a versão correta.

Depois de instalar tudo, precisamos configurar o Gradle usando o arquivobuild.gradle.

Podemos começar fornecendo a plataforma de teste de unidade para a ferramenta de construção:

test {
    useJUnitPlatform()
}

Agora que especificamos a plataforma, precisamos fornecer as dependências JUnit. É aqui que observamos uma diferença notável entre o JUnit 5 e as versões anteriores.

Veja, nas versões anteriores, precisávamos apenas de uma dependência. In JUnit 5, though, the API is separated from the runtime, meaning two dependencies.

A API é manifestada comjunit-jupiter-api. O tempo de execução éjunit-jupiter-engine para JUnit 5 ejunit-vintage-engine para JUnit 3 ou 4.

Forneceremos esses dois emtestImplementation areiatimeRuntimeOnly, respectivamente:

dependencies {
    testImplementation 'org.junit.jupiter:junit-jupiter-api:5.3.1'
    testRuntimeOnly 'org.junit.jupiter:junit-jupiter-engine:5.3.1'
}

3. Criando testes

Vamos escrever nosso primeiro teste. Parece com versões anteriores:

@Test
public void testAdd() {
    assertEquals(42, Integer.sum(19, 23));
}

Agora,we can run the test by executing the gradle clean test command.

Para verificar se estamos usando o JUnit 5, podemos olhar as importações. The imports for @Test and assertEquals should have a package starting with org.junit.jupiter.api:

import org.junit.jupiter.api.Test;
import static org.junit.jupiter.api.Assertions.assertEquals;

Portanto, no último exemplo, criamos um teste com a funcionalidade 'antiga' que funciona há anos. Agora, criaremos outro exemplo que usa algumas das novas funcionalidades do JUnit 5:

@Test
public void testDivide() {
    assertThrows(ArithmeticException.class, () -> {
        Integer.divideUnsigned(42, 0);
    });
}

assertThrows é uma nova afirmação em JUnit5 que substitui o estilo antigo de@Test(expected=ArithmeticException.class).

4. Configurando testes JUnit 5 com Gradle

A seguir, exploraremos uma integração mais profunda entre Gradle e JUnit5.

Digamos que temos dois tipos de testes em nosso pacote: longa e curta. Poderíamos usar a anotação JUnit 5@Tag :

public class CalculatorJUnit5Test {
    @Tag("slow")
    @Test
    public void testAddMaxInteger() {
        assertEquals(2147483646, Integer.sum(2147183646, 300000));
    }

    @Tag("fast")
    @Test
    public void testDivide() {
        assertThrows(ArithmeticException.class, () -> {
            Integer.divideUnsigned(42, 0);
        });
    }
}

Then, we tell the build tool which ones to execute. Em nosso caso, vamos apenas executar os testes de curta duração (rápidos):

test {
    useJUnitPlatform {
        includeTags 'fast'
        excludeTags 'slow'
    }
}

5. Ativando Suporte para Versões Antigas

Now, it’s still possible to create JUnit 3 and 4 tests with the new Jupiter engine. Ainda mais, podemos misturá-los com a nova versão no mesmo projeto, digamos, em um cenário de migração.

Para começar, adicionamos algumas dependências à configuração de compilação existente:

testCompileOnly 'junit:junit:4.12'
testRuntimeOnly 'org.junit.vintage:junit-vintage-engine:5.3.1'

Observe como nosso projeto agora temjunit-jupiter-engine  ejunit-vintage-engine.

Agora criamos uma nova classe e copiamos e colamos o métodotestDivide que criamos anteriormente. Em seguida, adicionamos as importações para@TesteassertEquals. No entanto, desta vez, certifique-se de usar os pacotes da versão 4 antiga, começando comorg.junit:

import static org.junit.Assert.assertEquals;
import org.junit.Test;
public class CalculatorJUnit4Test {
    @Test
    public void testAdd() {
        assertEquals(42, Integer.sum(19, 23));
    }
}

6. Conclusão

Neste tutorial, integramos o Gradle ao JUnit 5. Ainda mais, também adicionamos suporte para as versões 3 e 4.

Vimos que a ferramenta de construção oferece excelente suporte para as versões antigas e novas. Portanto, podemos usar os novos recursos em um projeto existente sem a necessidade de alterar todos os nossos testes existentes.

O exemplo de código completo está disponível emGitHub project. Sinta-se livre para usá-lo como ponto de partida para seu próprio projeto.