Java - Execução paralela de testes com Spring Boot, Java e Junit 5

Janderson Rafael da Silva
CWI Software
Published in
3 min readJun 18, 2020

Juntamente com a evolução de funcionalidades de um projeto também ocorre um crescimento natural de classes e cenários de testes, tornando o tempo de execução dos testes cada vez maior. Esse tempo de execução além de impactar na produtividade dos desenvolvedores também afeta diretamente o tempo de execução em pipelines de implantação. Diante desse problema, pensei…porque não executá-los em paralelo? Visando essa possibilidade encontrei no Junit 5 um recurso experimental possibilitando de forma simples a implementação dessa abordagem, que irei demonstrar abaixo.

Implementando a execução paralela de testes, utilizando Spring com Junit 5

1- Dependências necessárias para utilizar o Junit 5
Para realizar a implementação é necessário as dependências junit-jupiter-api e junit-jupiter-engine:

No caso de versões recentes do Spring o spring-boot-starter-test já possui as dependências necessárias acima citadas.

2- Adição de arquivo de configuração

Para configurar a execução paralela dos testes é necessário criar um arquivo de configuração na raiz do resources, segue abaixo um exemplo com um arquivo de configuração junit-platform.properties:

Configuração de execução paralela pode ser feita alternativamente inserindo a annotation @ Execution em cima das classes de testes.

3 - Adicionar plugin surefire para execução dos testes com maven
Para finalizar a configuração é necessário o plugin maven-surefire-plugin

Comparando os resultados

Comparando resultados da execução de 10 classes de teste com 5 métodos em cada uma, onde cada método de teste possui um Thread Sleep de 2 segundos. Abaixo demonstro os resultados da execução dos testes de forma sequencial e paralela através do mvn test.
Segue abaixo exemplo de classe e método de teste:

1- Execução dos testes no formato sequencial

Para realizar esse teste basta comentar ou excluir todo conteúdo do arquivo de configuração junit-platform.properties. Realizando uma matemática simples temos que a execução dos testes levará em média 100 segundos (50*2s)

mvn test, saída:

2- Execução dos testes da forma paralela com 10 threads

Nesta demonstração o tempo total de testes foi de pouco mais de 12 segundos, de forma matemática podemos considera ((50*2s)/10 threads) .

mvn test, saída:

Conclusão

Nesse exemplo simples podemos notar uma melhora considerável onde o tempo de execução dos testes é diminuído cada vez mais dependendo do número de threads configuradas para paralelizar.

Finalizando, então quer dizer que se você chegar no seu projeto e configurar esse paralelismo de 10 threads eles ficaram 10x mais rápido? NÃO necessariamente, pois, devemos considerar que esse cenário foi criado contendo informações que beneficiam seus resultados, num cenário real onde possuímos uma variação de testes de integração e testes unitários podemos não obter esse nível de ganhos, é sempre necessário avaliar o cenário ao qual se encontra para verificar a sua efetividade.

Referências

--

--