Générer des rapports sur la qualité d'un projet

Décembre 2016


En programmation, faire une application qui fonctionne n'est pas suffisant.
Améliorer la qualité du code est très important pour faciliter le développement des corrections et évolutions.


Sites des projets Maven

Parmi les fonctionnalités de Maven, il est possible de générer un site descriptif des projets.
Cela se fait grâce à la commande
mvn site
(si besoin, voir l'article Débuter avec Maven).

On peut afficher le site généré en ouvrant le fichier
target/site/index.html



Par défaut le site contient principalement des informations techniques sur l'architecture Maven du projet (dépendances, plugins, etc.) nous allons l'enrichir avec des rapports d'analyse du code générés par des plugins Maven.

Rapports d'analyses

Ci-dessous un extrait de pom.xml à intégrer au votre. Chaque plugin étant indépendant vous pouvez supprimer ceux dont les rapports ne vous intéressent pas (ou en ajouter d'autres).

<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>

Remarque : Les plugins utilisés ici sont donnés à titre d'exemples, il en existe de nombreux autres et il est également possible de créer ses propres rapports.

Pour générer la totalité des rapports ainsi configurés vous devez exécuter les tests unitaires et tests d'intégrations avant de générer le site. Par exemple avec
mvn verify site


Remarque : certains rapports peuvent ne pas apparaître sur le site en fonction de votre projet. Par exemple les résultats des tests unitaires ne sont pas générés si vous n'en avez pas...

Lecture des rapports


Source XRef

Ce rapport permet de visualiser dans le site le code source du projet.
Cette fonctionnalité sera particulièrement intéressante dans les rapports suivants où la détection d'anomalie pour une ligne de code pourra être visualisée dans son contexte.


Test Source Xref

Ce rapport est identique au précédent mais pour les classes de tests.


Rappel : dans un projet Maven par défaut les classes applicatives sont dans "src/main/java" et les classes de tests dans "src/test/java".

JavaDocs

Ce rapport affiche le site de documentation de la même manière que l'outil JavaDoc standard de Java.

Test JavaDocs

Ce rapport est identique au précédent mais pour les classes de tests.

Surefire Report

Ce rapport affiche le résultat des tests unitaires : succès ou échec avec leur temps d'exécution.

Failsafe Report

Ce rapport est identique au précédent mais pour les tests d'intégration.


Rappel : dans un projet Maven par défaut les noms des classes de tests unitaires terminent par "Test" et ceux des tests d'intégrations par "IT" (pour "Integration Test").

Checkstyle

Ce rapport affiche les violations aux règles de syntaxe standards en Java.

Remarque : les règles utilisées pour remonter ces erreurs peuvent être customisées :
Using a Custom Checkstyle Checker Configuration

CPD

Ce rapport affiche les morceaux de codes dupliqués dans le projet.

Remarque : dans le pom.xml fourni plus haut c'est le paramètre
<minimumTokens>50</minimumTokens>
qui permet de déterminer à partir de quelle taille de code identique il faut remonter une alerte dans ce rapport.

PMD

Ce rapport affiche des alertes sur une mauvaise construction du code qui peut potentiellement entraîner des erreurs.

Remarque : dans le pom.xml fourni plus haut c'est le paramètre
<rulesets>
qui permet de déterminer quelles règles utiliser.

Le fonctionnement détaillé de ces règles peut se trouver sur le site de PMD :
PMD Rulesets index: Current Rulesets

FindBugs

Ce rapport affiche des erreurs possibles. C'est l'une des analyses les plus poussées puisqu'elle replace le code dans son contexte pour détecter les bugs.
fancy

Remarque : ce type de rapport peut être assez long à générer pour des projets importants.

Pour aller plus loin

Des outils plus avancés permettent d'agréger ces rapports, les afficher de manière plus synthétique, comparer des projets entre eux et suivre l'historique de ces erreurs.


Exemple : http://nemo.sonarqube.org/


 


 

A voir également :

Ce document intitulé «  Générer des rapports sur la qualité d'un projet  » issu de CommentCaMarche (www.commentcamarche.net) est mis à disposition sous les termes de la licence Creative Commons. Vous pouvez copier, modifier des copies de cette page, dans les conditions fixées par la licence, tant que cette note apparaît clairement.