Cobertura de Testes de aplicações Java no Jenkins
Essa imagem te chamou atenção? O que guarda-chuvas tem a ver com a cobertura de Testes? Pois bem, falaremos um pouco mais sobre isso durante nosso conteúdo.
Cobertura de Testes
Em virtude de mantermos a qualidade das aplicações e a integridades das mesmas, fiz um estudo relacionado a formas de extrairmos os dados relacionados aos testes unitários de projetos Java e suas respectivas coberturas dentro do código do sistema, integrando esses testes com a execução dos builds na ferramenta de integração contínua Jenkins.
Jenkins, o que é?
Em uma visão geral, o Jenkins é uma ferramenta de integração contínua que surgiu à partir do Hudson da Sun (Oracle), onde trabalha com o objetivo de facilitar o trabalho de Build das aplicações, executando testes e gerando artefatos de um projeto de software. Como o objetivo não é explicitamente demonstrar como o Jenkins funciona, disponibilizarei links de acesso no fim deste artigo, caso queira conhecer um pouco mais sobre o assunto.
Testes Unitários
Em um projeto de desenvolvimento de software, o teste unitário é uma fase onde partes individuais do sistema são testadas de forma isolada, pensando em um fluxo do requisito em si e o que é esperado dele. A responsabilidade de sua criação é do desenvolvedor, que cria os testes unitários pensando sempre nas menores unidades, sempre que uma nova função/classe é desenvolvido (na prática pode não ser bem assim kkkk).
Cobertura de Testes
Ao criarmos e executarmos testes unitários a ideia de seu criador é sempre tentar abranger tudo aquilo que foi desenvolvido, abrangendo desde classes e métodos a funções, laços e condições, passando pelo máximo de linhas de código possível. Por isso, os testes unitários devem ser bem planejados e executados para que possa dar suporte àquilo que foi desenvolvido e evitando ao máximo os bugs.
Mas, ao criarmos os testes unitários como sabemos se ele está cobrindo tudo? Nesse ponto, utilizaremos a cobertura de testes dos quais são geradas através de um plugin, auxiliando na análise de onde aplicar mais testes e verificando pontos que possam ter passado despercebidos.
Agora, voltemos a imagem inicial da leitura. Qual a relação do guarda-chuvas com a cobertura de testes? Então, cobertura de testes é mais ou menos como a imagem, temos vários guarda-chuvas cobrindo o espaço mas logicamente não conseguiremos cobrir todo o espaço com os mesmos. A ideia é sempre tentar desenvolver e melhorar os testes unitários para que essa cobertura aumente e os testes possam cobrir mais código ao longo dos ciclos de desenvolvimento, garantindo uma maior qualidade ao projeto.
Analisando as possibilidades de plugins existentes para verificarmos a cobertura de testes para as aplicações desenvolvidas na linguagem Java, foram encontradas e mais indicadas duas opções:
1- JaCoCo Maven Plugin
- https://mvnrepository.com/artifact/org.jacoco/jacoco-maven-plugin
- https://www.jacoco.org/jacoco/trunk/doc/
2- Code Coverage API
Para a avaliação das duas possibilidades, foi realizada a instalação e configuração de ambas no Jenkins e configurados os builds em um projeto que já possuía o JaCoCo integrado ao mesmo.
Análise das Ferramentas
1- JaCoCo Maven Plugin
O JaCoCo apresenta as informações de cobertura de testes baseadas em uma visão geral, por pacotes e número total de linhas, mas apresenta um design meio ultrapassado.
A partir de um build de uma Branch, os dados de cobertura de testes são armazenados e informados em um gráfico histórico por build, conforme imagem abaixo.
2- Code Coverage API
O Code Coverage é mais bonito e mais estruturado que o JaCoCo, mas apresentou alguns problemas de configuração no projeto Java.
Ele foi adicionado ao projeto e configurado conforme o esperado. Quando realizamos o Build da aplicação, grande parte dos testes unitários tiveram erros e o Build não foi finalizado com sucesso.
Pesquisando um pouco mais sobre os erros encontrados, foi verificado que o Code Coverage não era compatível com algumas versões do Java e consequentemente, não rodou em nosso projeto.
Configurações
1- JaCoCo Maven Plugin
Para a instalação do Jacoco Maven Plugin no Jenkins, basta acessar o gerenciador de plugins do mesmo e pesquisar por Jacoco Plugin.
Já nas configurações do projeto cujo há a utilização do Maven, o mesmo deverá ser importado no pom.xml do projeto.
Ao realizar o build do projeto, serão gerados os dados de cobertura de testes relacionados aos testes unitários do projeto. Esses arquivos estão disponíveis no diretório do projeto (“projeto/target/site/jacoco”).
Para realizar a configuração de cobertura no projeto, basta alterar as configurações pós-build do projeto.
No Pipeline do projeto, basta adicionar as configurações do JaCoCo:
- jacoco execPattern: “**/target/jacoco.exec”
Ao finalizar o Build, serão disponibilizadas as informações de cobertura de testes no menu lateral esquerdo, na página principal do projeto e nos detalhes do build realizado.
Resultados
Os resultados são gerados após a execução do build, demonstrando os resultados de acordo em cima dos testes unitários realizados no projeto. Dentre eles, temos:
1- JaCoCo Coverage Trend
Nesse gráfico, são demonstradas as linhas cobertas e as linhas não cobertas pelos testes unitários em relação ao Build, armazenando o histórico dos resultados por cada Build efetuado e demonstrando no gráfico a cobertura de cada execução.
2- Overall Coverage Sumary
Nesse gráfico, são demonstrados os valores relacionados a cobertura das classes em diferentes categorias:
- Instruções;
- Branch;
- Complexidade;
- Linhas;
- Métodos;
- Classes;
Na legenda, o “C” significa “Coverage” e o “M” significa “Missed”. Assim, conseguimos observar o quão coberto o código está através dos testes unitários realizados na aplicação em relação a categorias e não apenas linhas.
Assim, é possível focar esforços de desenvolvimento dos testes unitários a trechos de códigos com baixa cobertura, tendo explícito quais classes e métodos possuem uma menor cobertura.
3- Coverage Breakdown By Package
Nesse gráfico, são demonstradas as informações no mesmo formato que o relatório anterior, mas agora serão descritas por pacotes.
Ao clicar em um pacote, haverá um detalhamento histórico dos builds desse pacote, assim como na visão do relatório “Coverage Trend”. Nessa visão, conseguimos verificar o histórico da cobertura dos testes de um pacote pelo número de linhas do mesmo ao longo dos builds do projeto.
Há também a possibilidade de detalhar um pouco mais essa cobertura, acessando o pacote e demonstrando os o relatório por arquivos, detalhando cada arquivo em específico.
É possível também visualizar os trechos de código cujo os testes unitários cobriram e quais não tiveram cobertura, entrando cada vez mais nos detalhes da cobertura.
Visão Geral dos Projetos
Na visão geral dos projetos no Jenkins, há a possibilidade de adicionar uma coluna informativa relacionada a cobertura dos testes a nível de número de linhas, informando o resultado do último Build (em percentual de cobertura). Isso demonstra uma visão mais macro da cobertura total dos testes a nível de projetos, podendo avaliar os dados e focar esforços nos projetos que possuem uma menor cobertura.
Conclusão
O JaCoCo Plugin apresentou ser a melhor opção por sua facilidade em configurações e simplicidade na demonstração dos dados. A forma como são demonstrados os dados é de fácil interpretação e um histórico é gravado ao longo do tempo.
Enfim, o objetivo proposto com essa integração é melhorarmos a cada dia a cobertura dos testes unitários e consequentemente diminuirmos o número de bugs no sistema, aumentando cada vez mais a visibilidade dos testes ao longo dos Builds executados dos projetos.
Links e Referências
https://medium.com/@allyxcristiano/jenkins-from-zero-to-deploy-e54a627f055a
https://medium.com/assertqualityassurance/teste-unit%C3%A1rio-e-qualidade-de-software-acce7b9c537
https://www.jenkins.io/blog/2018/08/17/code-coverage-api-plugin-1/