Gerar relatórios sobre a qualidade de um projeto

Dezembro 2016

Em programação, criar um aplicativo que funcione não é o suficiente. Melhorar a qualidade do código também é muito importante para facilitar o desenvolvimento das correções e evoluções.


Sites dos projetos Maven

Entre as características do Maven, encontramos a possibilidade de gerar um site descritivo dos projetos. Isto pode ser feito através do comando
mvn site
(se precisar, consulte o artigo Maven para iniciantes. Podemos exibir o site gerado abrindo o arquivo
target/site/index.html
:


Por padrão, o site contém, principalmente, informações técnicas sobre a arquitetura Maven do projeto (dependências, plugins, etc). Vamos enriquecê-lo com relatórios de análise do código gerados pelos plugins Maven.

Relatórios de análises

Abaixo, você encontrará um trecho do pom.xml a integrar no seu relatório. Como cada plugin é independente, você poderá excluir aqueles cujos relatórios não te interessam (ou adicionar outros).

<build>
  <plugins>
    <plugin>
      <!-- The Failsafe Plugin is designed to run integration tests while the 
      Surefire Plugin is designed to run unit tests. -->
      <groupId>org.apache.maven.plugins</groupId>
      <artifactId>maven-failsafe-plugin</artifactId>
      <version>2.19.1</version>
      <executions>
        <execution>
          <goals>
            <goal>integration-test</goal>
            <goal>verify</goal>
          </goals>
        </execution>
      </executions>
    </plugin>
  </plugins>
</build>
  <reporting>
    <plugins>
      <plugin>
        <!-- The JXR Plugin generates a cross-reference of the project's sources. -->
      <groupId>org.apache.maven.plugins</groupId>
      <artifactId>maven-jxr-plugin</artifactId>
      <version>2.5</version>
    </plugin>
    <plugin>
      <!-- The Javadoc Plugin generates javadocs using the Javadoc tool. -->
      <groupId>org.apache.maven.plugins</groupId>
      <artifactId>maven-javadoc-plugin</artifactId>
      <version>2.10.3</version>
      <configuration>
        <additionalparam>-Xdoclint:none</additionalparam>
      </configuration>
    </plugin>
    <plugin>
      <!-- The Surefire Report Plugin generates reports for unit and integration 
        tests. -->
      <groupId>org.apache.maven.plugins</groupId>
      <artifactId>maven-surefire-report-plugin</artifactId>
      <version>2.19.1</version>
    </plugin>
    <plugin>
      <!-- The Checkstyle Plugin generates a report regarding the code style 
        used by the developers. -->
      <groupId>org.apache.maven.plugins</groupId>
      <artifactId>maven-checkstyle-plugin</artifactId>
      <version>2.17</version>
    </plugin>
    <plugin>
      <!-- The PMD plugin generates PMD and CPD reports using the PMD code 
        analysis tool. -->
      <groupId>org.apache.maven.plugins</groupId>
      <artifactId>maven-pmd-plugin</artifactId>
      <version>3.6</version>
      <configuration>
        <skipEmptyReport>false</skipEmptyReport>
        <linkXref>true</linkXref>
        <minimumTokens>50</minimumTokens>
        <rulesets>
          <ruleset>rulesets/java/android.xml</ruleset>
          <ruleset>rulesets/java/basic.xml</ruleset>
          <ruleset>rulesets/java/braces.xml</ruleset>
          <ruleset>rulesets/java/clone.xml</ruleset>
          <ruleset>rulesets/java/codesize.xml</ruleset>
          <ruleset>rulesets/java/comments.xml</ruleset>
          <!-- <ruleset>rulesets/java/controversial.xml</ruleset> -->
          <ruleset>rulesets/java/coupling.xml</ruleset>
          <ruleset>rulesets/java/design.xml</ruleset>
          <ruleset>rulesets/java/empty.xml</ruleset>
          <ruleset>rulesets/java/finalizers.xml</ruleset>
          <ruleset>rulesets/java/imports.xml</ruleset>
          <ruleset>rulesets/java/j2ee.xml</ruleset>
          <ruleset>rulesets/java/javabeans.xml</ruleset>
          <ruleset>rulesets/java/junit.xml</ruleset>
          <ruleset>rulesets/java/logging-jakarta-commons.xml</ruleset>
          <ruleset>rulesets/java/logging-java.xml</ruleset>
          <ruleset>rulesets/java/migrating.xml</ruleset>
          <ruleset>rulesets/java/migrating_to_13.xml</ruleset>
          <ruleset>rulesets/java/migrating_to_14.xml</ruleset>
          <ruleset>rulesets/java/migrating_to_15.xml</ruleset>
          <ruleset>rulesets/java/migrating_to_junit4.xml</ruleset>
          <ruleset>rulesets/java/naming.xml</ruleset>
          <ruleset>rulesets/java/optimizations.xml</ruleset>
          <ruleset>rulesets/java/strictexception.xml</ruleset>
          <ruleset>rulesets/java/strings.xml</ruleset>
          <ruleset>rulesets/java/sunsecure.xml</ruleset>
          <ruleset>rulesets/java/typeresolution.xml</ruleset>
          <ruleset>rulesets/java/unnecessary.xml</ruleset>
          <ruleset>rulesets/java/unusedcode.xml</ruleset>
        </rulesets>
      </configuration>
    </plugin>
    <plugin>
      <!-- FindBugs Plugin looks for bugs in Java programs. It is based on 
        the concept of bug patterns. -->
      <groupId>org.codehaus.mojo</groupId>
      <artifactId>findbugs-maven-plugin</artifactId>
      <version>3.0.0</version>
    </plugin>
  </plugins>
</reporting>


Observação: os plugins usados são exemplos, mas existem muitos outros, além de você poder criar seus próprios relatórios.

Para gerar todos os relatórios configurados desta maneira, você deve executar os testes unitários e os testes de integração antes de gerar o site, com o código
mvn verify site
por exemplo.

Observação: alguns relatórios podem não aparecer no site em função do seu projeto. Por exemplo, os resultados dos testes unitários não são gerados se você não tiver nenhum…

Leitura dos relatórios


Fonte XRef

Este relatório permite visualizar o código-fonte do projeto no site. Esta funcionalidade será particularmente útil nos relatórios seguinte, onde a detecção de anomalia de uma linha de código poderá ser visualizada em seu contexto:



Teste Fonte XRef

Este relatório é idêntico ao precedente, mas para as classes de testes. Lembre-se que, por padrão, em um projeto Maven, as classes aplicativas estão no
"src/main/java
e as classes de testes no
src/test/java
.

JavaDocs

Este relatório mostra o site de documentação da mesma forma que a ferramenta Javadoc padrão do Java:



Teste JavaDocs

Este relatório é o mesmo que o precedente, mas para as classes de testes.

Surefire Report

Esse relatório mostra o resultado dos testes unitários: sucesso ou fracasso com seu tempo de execução:



Failsafe Report

Este relatório é idêntico ao precedente, mas para testes de integração. Lembre-se que, por padrão, os nomes das classes de testes unitários em um projeto Maven terminam por "Test" e os dos testes de integração por "IT" (Teste de Integração).

Checkstyle

Este relatório mostra as violações das regras de sintaxe padrão no Java:



Observação: as regras usadas para detectar esses erros podem ser personalizadas: Using a Custom Checkstyle Checker Configuration

CPD

Este relatório mostra os pedaços de códigos duplicados no projeto:



Observação: no “pom.xml” fornecido acima, é o parâmetro
<minimumTokens>50</minimumTokens>
que permite determinar a partir de que tamanho de código idêntico é preciso alertar, neste relatório.

PMD

Este relatório exibe alertas sobre uma construção mal feita do código que pode, potencialmente, levar a erros:



Observação: no “pom.xml” fornecido acima é o parâmetro
<rulesets>
que determina que regras usar.

O funcionamento detalhado destas regras pode ser encontrado no site do PMD:
PMD RuleSets Index: Current Rulesets

FindBugs

Este relatório mostra possíveis erros. Esta é uma das análises mais avançadas, uma vez que ele substitui o código em seu contexto para detectar bugs:


fancy

Observação: este tipo de relatório pode ser grande demais para os projetos mais importantes.

Saiba mais

Algumas ferramentas mais avançadas podem implementar esses relatórios, mostrá-lo mais sinteticamente, comparar projetos uns com os outros e acompanhar a história desses erros.

Exemplo: nemo.sonarqube.org

Veja também :
Este documento, intitulado « Gerar relatórios sobre a qualidade de um projeto »a partir de CCM (br.ccm.net) está disponibilizado sob a licença Creative Commons. Você pode copiar, modificar cópias desta página, nas condições estipuladas pela licença, como esta nota aparece claramente.