Cobertura de testes com Jacoco em projetos Java

Nesse artigo vamos ensinar como verificar a cobertura de testes em aplicações java utilizando o Jacoco.

Motivação

Sem dúvida atualmente falar do desenvolvimento de uma solução sem testes beira o absurdo, todo bom projeto tem a preocupação de testar as funcionalidades de varias formas, usando testes unitários, de integração entre outros.

Em projetos Java é uma unanimidade usar JUnit, e com conceitos modernos como Clean Arch ou Arquitetura Hexagonal, é bem mais fácil simples fazer testes de unidade.

Mas como fazer para saber se os testes unitários escritos estão de fato fazendo a cobertura adequada do código?

O propósito desse artigo é te ensinar a configurar uma ferramenta que vai ajudar a verificar a cobertura, com porcentagem, gráfico e mostrando linha a linha a cobertura dos testes em seu projeto.

O que é o Jacoco – Java code coverage

O Jacoco ou Java Code Coverage, é uma ferramenta para verificar a cobertura de código em projetos Java, possui uma alta integração com o ciclo de aplicações que usam o Maven com gerenciador de pacotes, e é capaz de te entregar de uma forma amigável relatórios da cobertura.

Instalando o Jacoco

A instalação é bem simples vamos precisar apenas alterar o nosso arquivo pom.xml, adicionando uma dependência e configurar o plugin de build.

Segue as sessões que precisaremos adicionar no nosso pom.xml:

<properties>
    <!-- ...others properties -->
    <java.version>11</java.version>
    <jacoco.version>0.8.6</jacoco.version>
</properties>

<dependencies>
    <!-- ...others dependencies -->
    <dependency>
        <groupId>org.jacoco</groupId> 
        <artifactId>jacoco-maven-plugin</artifactId>
        <version>${jacoco.version}</version>
    </dependency>
</dependencies>

<build>
    <plugins>
        <!-- ...others plugins -->
        <plugin>
            <groupId>org.jacoco</groupId>
            <artifactId>jacoco-maven-plugin</artifactId>
            <version>${jacoco.version}</version>
            <executions>
                <execution>
                    <id>jacoco-initialize</id>
                    <goals>
                        <goal>prepare-agent</goal>
                    </goals>
                </execution>
                <execution>
                    <id>jacoco-site</id>
                    <phase>package</phase>
                    <goals>
                        <goal>report</goal>
                    </goals>
                </execution>
                <execution>
                    <id>report</id>
                    <phase>prepare-package</phase>
                    <goals>
                        <goal>report</goal>
                    </goals>
                </execution>
            </executions>
        </plugin>
    </plugins>
</build>
pom.xml

Apos as alterações no arquivo pom.xml, podemos executar o comando mvn install para instalar todas as novas dependências e após o comando mvn package.

Se o seu projeto já tem testes desenvolvidos, apos o comando package será criado o relatório exibindo a cobertura de testes do projeto, para acessar esse relatório basta abrir o arquivo localizado em <diretório-do-projeto>/target/site/jacoco/index.html.

Exemplo de relatório de cobertura

Configurando exclusões de pacotes na cobertura

Em um projeto Java utilizamos diversos recursos para nos auxiliar a criar as funcionalidades adequadas, um exemplo deles são os DTO (classes de passagem de informação), entidades de mapeamento de base de dados entrou outros, que não deveriam contar na cobertura do nosso código já que essas classes geralmente não possuem lógica são mais armazenamento de dados.

No exemplo acima veja que a nossa classe de serviço está com a cobertura em 100% mas o projeto no todo com apenas 3%, isso acontece por causa dessas classes que mencionamos, podemos excluir elas da contagem de cobertura.

Para excluir alguns pacotes da cobertura teremos que definir dentro da chave configuração as exclusões de pacotes.

<build>
    <plugins>
        <!-- ...others plugins -->
        <plugin>
            <groupId>org.jacoco</groupId>
            <artifactId>jacoco-maven-plugin</artifactId>
            <version>${jacoco.version}</version>
            <configuration>
                <excludes>
                    <exclude>**/dto/*</exclude>
                    <exclude>**/parse/*</exclude>
                    <exclude>**/entity/*</exclude>
                </excludes>
            </configuration>
            <executions>
                <execution>
                    <id>jacoco-initialize</id>
                    <goals>
                        <goal>prepare-agent</goal>
                    </goals>
                </execution>
                <execution>
                    <id>jacoco-site</id>
                    <phase>package</phase>
                    <goals>
                        <goal>report</goal>
                    </goals>
                </execution>
                <execution>
                    <id>report</id>
                    <phase>prepare-package</phase>
                    <goals>
                        <goal>report</goal>
                    </goals>
                </execution>
            </executions>
        </plugin>
    </plugins>
</build>
pom.xml

Após a configuração note que as classes dentro dos pacotes de exclusão são ignoradas, aumentando a cobertura total do nosso projeto, e assim considerando de fato as classes que precisam mesmo ter a cobertura de testes.

Exemplo de relatório de cobertura

O Arquivo index.html te permite navegar pelos pacotes analisados verificando as classes e até as linhas que estão cobertas no código.

Considerações

Para se ter um controle melhor de qualidade de código e cobertura de testes no seu projeto é interessante aplicar a infra estrutura um processo de Quality Gate, usando um software de verificação de qualidade como o SonarQube por exemplo, além de verificar a cobertura, também te mostrará relatórios de code smells e duplicação de códigos.

O SonarQube se integra facilmente com o plugin instalado, podendo utilizar as métricas exportadas pelo plugin.

Links uteis

Mauricio Lima
Mauricio Lima

Bacharel em Ciência da Computação, profissional dedicado ao desenvolvimento de software e entusiasta da tecnologia.

Artigos: 65