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