Utilizando JUnit 5 no Android

JUnit é uma das bibliotecas mais populares do mundo Java, sua quarta versão já foi lançada a muito tempo e muita coisa aconteceu para que precisássemos de uma nova versão. Neste post, você irá conhecer algumas das novidades do JUnit 5 (foram muitas) e como podemos utilizá-las no Android.

Por que uma nova versão?

A quarta versão do JUnit foi lançada há mais de 10 anos atrás, e melhorias eram necessárias tanto para acompanhar a evolução da linguagem, como para atender as expectativas sobre testes que aumentam a cada ano. Alguns dos pontos importantes para a decisão de se construir uma nova versão foram:

  • Alto acoplamento entre o internals do JUnit com ferramentas de IDE, dificultando o acolhimento de novidades.
  • Necessidade de modularização.
  • Java 8 e Java 9.
  • Um melhor modelo de extensão que elimine as limitações e complexidades de Rules e Runners.

Houve uma grande movimentação da comunidade e uma arrecadação de fundos para possibilitar o inicio do desenvolvimento da nova versão, inicialmente batizada de JUnit Lambda, posteriormente se tornou JUnit 5.

Modularização

JUnit 5 = JUnit Platform + JUnit Jupiter + JUnit Vintage

Diferente de outras versões, JUnit 5 é composto por diferentes módulos distribuídos em 3 projetos:

  • JUnit Platform: São elementos estruturais para a execução dos testes na JVM. Fornece API para execução dos testes pela linha de comando e também plugins para Gradle e Maven, além de prover Runner baseado no JUnit 4, para que seja possível rodar qualquer TestEngine na plataforma.
  • JUnit Jupiter: É o JUnit 5 de fato, aqui está definido o modelo de programação e de extensão, ou seja, aqui estão todas as anotações, classes e também as novidades do JUnit 5.
  • JUnit Vintage: Fornece uma TestEngine para rodar testes baseados em JUnit 3 e JUnit 4.
Arquitetura do JUnit 5. Imagem retirada da apresentação do Sam Brannen

Algumas novidades

O JUnit 5 possui muitas novidades, uma das mais legais é o suporte ao Java 8, ou seja, agora podemos utilizar lambdas e outros recursos interessantes da linguagem nos testes. Esta lista apresenta algumas dessas novidades:

Display Name

É uma anotação que nos permite colocar um texto mais descritivo para o nosso teste, inclusive até com emojis.

Assertions

Foram adicionados varias asserções nessa quinta versão, segue alguns exemplos:

assertAll

O assertAll nos permite executar um conjunto de asserções, ele passa por todas as asserções independente se houver falha, e também nos retorna um log detalhado de cada asserção que falhou.

assertThrows

Para validar as exceptions como também a mensagem exibida no JUnit 4 utilizavam a Rule ExpectedException, no JUnit 5 temos uma asserção que faz esse trabalho para a gente.

Repeated Tests

Particularmente essa foi uma das novidades que mais gostei. Geralmente na rotina de manutenção de nossa suíte de testes, nos deparamos com os chamados flaky test, são aqueles testes que as vezes rodam com sucesso e outras falham. Para dar manutenção e resolver esses testes é muito trabalhoso, por que você deve rodar o teste muitas vezes para verificar se não está mais intermitente, e rodar manualmente pela IDE é sempre algo trabalhoso.

Com essa nova anotação do JUnit 5, podemos especificar quantas vezes queremos que o nosso teste seja executado.

Disabling Tests

No JUnit 4 tinhamos a anotação @Ignore para que na hora da execução os testes anotados pudessem ser ignorados, agora no JUnit 5 temos a anotação @Disabled que substitui o @Ignore.

OBS: Existem muitas outras novidades importantes do JUnit 5 que não foram citadas nesse post, você pode ver todas as novidades e exemplos na JUnit 5 User Guide.

Kotlin?

Até agora, foram apresentados exemplos com Java, e você pode estar se perguntando se há suporte para Kotlin. E a resposta é sim. Você pode ver exemplos de Kotlin aqui.

E no Android?

O time da JUnit Platform fornece um plugin gradle para a utilização do JUnit 5 na JVM, porém funciona apenas em aplicações “puramente” Java, dessa forma não funciona no contexto de uma aplicação Android. Felizmente, Marcel Schenelle criou um plugin gradle para que seja possível utilizar JUnit 5 em projetos Android.

Para utilizar o plugin do Schenelle, é necessário adicionar o android-junit5 como dependência em nosso arquivo build.gradle no módulo do projeto.

OBS: Podemos verificar a release atual, e também outros detalhes e casos de erros na instalação do plugin no repositório do android-junit5.

O próximo passo é adicionar as configurações e o plugin android-junit5 como dependência no arquivo build.gradle só que agora no módulo do app.

Para utilizarmos o JUnit 5 em nossos testes instrumentados, é necessário adicionar mais uma dependência no build.gradle no módulo do app.

OBS: Para a utilização do JUnit 5 nos testes instrumentados, o minSdkVersion do seu app tem que ser no mínimo a API 26 😢

Conclusão

JUnit 5 sem dúvidas, trouxe novidades importantes e também correções de problemas estruturais que a comunidade já estava esperando algum tempo. Entretanto, a necessidade mínima do app estar na API 26 para a utilização do JUnit 5 nos testes instrumentados, torna inviável a aplicação no Android neste momento.

Para se aprofundar nos conhecimentos sobre JUnit 5, além da User Guide é claro, eu recomendo também as palestras do Sam Brannen e do Marc Philipp.

Obrigado pela leitura!!