Junit5: Separando a execução dos testes

iundarigun
Dev Cave
Published in
2 min readJan 21, 2020

Depois dos posts sobre Rabbit MQ, queria trazer uma publicação mais leve e curta. Neste caso quero apresentar uma forma de separar a execução dos diferentes tipos de testes.

O Junit5 faz mais de 2 anos que foi lançado mas ainda há muita funcionalidade que eu pessoalmente não explorei tanto quanto gostaria. Uma delas é a possibilidade de taggear os testes individualmente ou as classes de teste no geral. Isso faz que seja fácil de separar a execução sem precisar recorrer à expressões regulares ou pacotes diferentes.

Como sempre, pode fazer checkout do código que usarei de exemplo:

>git clone https://github.com/iundarigun/sample-testing

O projeto é uma API Rest de cadastro de colaboradores bem simples, usando Koltin com Spring Boot, Spring Data e banco de dados relacional Postgres. E para testes é usado Junit5 e MockK para testes unitários, e RestAssured, também com Junit5, e banco em memória H2 para testes de integração. Este post não tem foco em falar sobre essas escolhas, mas pretendo entrar em detalhe em outro post.

As vezes, quando criamos nossa base de testes, não todos os testes tem a mesma finalidade. Podemos ter uns testes mais focados em evitar quebrar funcionalidades especificas, outros mais focados em testes ponta a ponta, e até testes que são executados após o delivery para validar a entrega. Pode não ser uma boa ideia rodar sempre todos os testes, pois alguns testes podem ser muito custosos e demorados.

No código do exemplo há dois tipos de testes, testes unitários e testes de integração. Para identifica-los usamos a annotation tag.

Por ora só identificamos os testes. Agora, vamos criar uma execução personalizada para cada tipo de teste. Para isso editamos o build.gradle:

// Code beforetasks.withType<Test> {
useJUnitPlatform()
}

task<Test>("unitTests") {
useJUnitPlatform() {
excludeTags("integration")
includeTags("unit")
}
}

task<Test>("integrationTests") {
useJUnitPlatform() {
includeTags("integration")
excludeTags("unit")
}
}
// Code after

Quando rodar a task test vai rodar todos os testes, pois não fizemos nenhuma configuração especial, porém daria para excluir alguma tag especifica, por exemplo se existir alguns testes específicos para validar o delivery. Criamos a task unitTests que vai rodar os testes com a tag unit, e a task integrationTests que vai rodar os testes com a tag integration.

Se rodamos por separado, podemos ver o resultado:

Era isso que queria compartilhar, uma forma simples de separar os testes só com uma annotation e uma configuração no build.

Referências

--

--

iundarigun
Dev Cave

Java and Kotlin software engineer at Clearpay