GLO-4002 - Site du cours 2023

Temps estimé: 30 minutes

Exercices à propos de la couverture

Ces exercices visent à vous montrer comment vérifier la couverture du code d'une application Java.

1. Outils

Il existe un très grand nombre d'outil permettant de vérifier la couverture du code.

Les plus populaires en Java sont:

  • JaCoCo
  • Open Clover
  • Cobertura
  • Serenity
  • JCov

Vous êtes libres d'utiliser celui que vous voulez. Il est même recommendé d'en essayer plusieurs avant de faire un choix.

Pour cet exercice, nous allons utiliser JaCoCo.

2. Préparation

Créez un nouveau projet Java avec Maven.

Ajouter les dépendances suivantes:

pom.xml:
<dependency>
    <groupId>org.junit.jupiter</groupId>
    <artifactId>junit-jupiter-api</artifactId>
    <version>5.7.0</version>
    <scope>test</scope>
</dependency>
<dependency>
    <groupId>org.junit.jupiter</groupId>
    <artifactId>junit-jupiter-engine</artifactId>
    <version>5.7.0</version>
    <scope>test</scope>
</dependency>
<dependency>
    <groupId>org.mockito</groupId>
    <artifactId>mockito-core</artifactId>
    <version>3.5.13</version>
    <scope>test</scope>
</dependency>

et le plugin suivant:

pom.xml:
<plugin>
    <groupId>org.apache.maven.plugins</groupId>
    <artifactId>maven-surefire-plugin</artifactId>
    <version>3.0.0-M5</version>
</plugin>

3. Faire fonctionner JaCoCo

Vous avez une application contenant la classe suivante:

toilet.java:
public class Toilet {

    private int litersOfWater;

    public Toilet(int litersOfWater) {
        this.litersOfWater = litersOfWater;
    }

    public int getLitersOfWater() {
        return litersOfWater;
    }

    public void flush() throws Exception {
        if (litersOfWater <= 0) {
            throw new Exception("IMPOSSIBLE TO FLUSH WITH NO WATER!");
        }

        litersOfWater--;
    }
}

Voici ce que vous devez faire:

  • Tester l'ensemble des comportements de la classe Toilet.
  • Intégrer JaCoCo au projet.
  • Configurer JaCoCo pour qu'il force une couverture de 100% du code et qu'il s'assure que toutes les classes soient testées.

Vous êtes supposés avoir deux tests:

  • Flusher avec assez d'eau.
  • Flusher avec 0 litre d'eau.

Voici la configuration de JaCoCo demandée:

<plugin>
    <groupId>org.jacoco</groupId>
    <artifactId>jacoco-maven-plugin</artifactId>
    <version>0.8.6</version>
    <executions>
        <execution>
            <id>default-prepare-agent</id>
            <goals>
                <goal>prepare-agent</goal>
            </goals>
        </execution>
        <execution>
            <id>jacoco-check</id>
            <goals>
                <goal>check</goal>
            </goals>
            <configuration>
                <rules>
                    <rule>
                        <element>BUNDLE</element>
                        <limits>
                            <limit>
                                <counter>INSTRUCTION</counter>
                                <value>COVEREDRATIO</value>
                                <minimum>1.00</minimum>
                            </limit>
                            <limit>
                                <counter>CLASS</counter>
                                <value>MISSEDCOUNT</value>
                                <maximum>0</maximum>
                            </limit>
                        </limits>
                    </rule>
                </rules>
            </configuration>
        </execution>
    </executions>
</plugin>

Notez que 100% de couverture n'est pas toujours pertinent. Certaines classes, comme les DTO, n'ont pas besoin d'être testées.

4. On se pratique

Ajoutez les comportements suivants au code:

  • Un humain peut flusher une toilette.
  • Seulement un plombier peut ajouter de l'eau.

Assurez-vous de respecter la couverture du code.

5. Conclusion

La couverture du code est un bon moyen de forcer l'écriture de tests.

Certaines compagnies bloquent mêmes leurs pipelines de déploiment si du code a été ajouté sans test.

Il est cependant dangereux de si fier entièrement, car ça ne veut pas dire que les tests écrits sont sans erreurs.

6. Bonus

Pour ceux qui veulent se pratiquer d'avantage, il existe plusieurs exercices sur Internet, dont le suivant: https://github.com/goeckeler/katas/tree/master/katas/Easter%20Egg%20Hunt