Maven - Exemple de couverture de code JaCoCo

image

Dans cet article, nous allons vous montrer comment utiliser un plug-in JaCoCo pour générer un rapport de couverture de code pour un projet Java.

Testé avec

  1. Maven 3.5.3

  2. JUnit 5.3.1

  3. jacoco-maven-plugin 0.8.2

1. JaCoCo Maven Plugin

1.1 Déclarez le plugin JaCoCo suivant dans le fichier pom.xml .

pom.xml

    <plugin>
        <groupId>org.jacoco</groupId>
        <artifactId>jacoco-maven-plugin</artifactId>
        <version>0.8.2</version>
        <executions>
            <execution>
                <goals>
                    <goal>prepare-agent</goal>
                </goals>
            </execution>
            <!-- attached to Maven test phase -->
            <execution>
                <id>report</id>
                <phase>test</phase>
                <goals>
                    <goal>report</goal>
                </goals>
            </execution>
        </executions>
    </plugin>

L’objectif «rapport» de JaCoCo sera défini lors de la phase de test Maven.

2. Test unitaire

2.1 Un code Java simple pour renvoyer un message et une vérification de chaîne vide.

MessageBuilder.java

package com.mkyong.examples;

public class MessageBuilder {

    public String getMessage(String name) {

        StringBuilder result = new StringBuilder();

        if (name == null || name.trim().length() == 0) {

            result.append("Please provide a name!");

        } else {

            result.append("Hello " + name);

        }
        return result.toString();
    }

}

2.2 Test unitaire supérieur à la classe.

TestMessageBuilder.java

package com.mkyong.examples;

import org.junit.jupiter.api.Test;

import static org.junit.jupiter.api.Assertions.assertEquals;

public class TestMessageBuilder {

    @Test
    public void testNameMkyong() {

        MessageBuilder obj = new MessageBuilder();
        assertEquals("Hello mkyong", obj.getMessage("mkyong"));

    }

}

2.3 Exécutez mvn test , le rapport de couverture de code JaCoCo sera généré dans` target/site/jacoco/** `

Terminal

$ mvn clean test
[INFO]-------------------------------------------------------[INFO] T E S T S[INFO]-------------------------------------------------------[INFO]Running com.mkyong.examples.TestMessageBuilder[INFO]Tests run: 1, Failures: 0, Errors: 0, Skipped: 0, Time elapsed: 0.012 s - in com.mkyong.examples.TestMessageBuilder[INFO][INFO]Results:[INFO][INFO]Tests run: 1, Failures: 0, Errors: 0, Skipped: 0[INFO][INFO][INFO]--- jacoco-maven-plugin:0.8.2:report (report) @ maven-code-coverage ---[INFO]Loading execution data file D:\maven-examples\maven-code-coverage\target\jacoco.exec[INFO]Analyzed bundle 'maven-code-coverage' with 1 classes[INFO]------------------------------------------------------------------------[INFO]BUILD SUCCESS[INFO]------------------------------------------------------------------------[INFO]Total time: 4.164 s[INFO]Finished at: 2018-11-14T16:48:39+08:00[INFO]------------------------------------------------------------------------

2.4 Ouvrez le fichier target/site/jacoco/index.html , consultez le rapport de couverture de code:

image

image

  1. Green - Code est testé ou couvert.

  2. Red - Code n’est pas testé ou couvert.

  3. Jaune - Le code est partiellement testé ou couvert.

3. Amélioration du test unitaire

3.1 Ajouter un test supplémentaire pour la ligne rouge.

TestMessageBuilder.java

package com.mkyong.examples;

import org.junit.jupiter.api.Test;

import static org.junit.jupiter.api.Assertions.assertEquals;

public class TestMessageBuilder {

    @Test
    public void testNameMkyong() {

        MessageBuilder obj = new MessageBuilder();
        assertEquals("Hello mkyong", obj.getMessage("mkyong"));

    }

    @Test
    public void testNameEmpty() {

        MessageBuilder obj = new MessageBuilder();
        assertEquals("Please provide a name!", obj.getMessage(" "));

    }
}

Revoir le rapport à nouveau.

Terminal

$ mvn clean test

target/site/jacoco/index.html

image

3.2 Ajouter un test supplémentaire pour la ligne jaune si condition.

TestMessageBuilder.java

package com.mkyong.examples;

import org.junit.jupiter.api.Test;

import static org.junit.jupiter.api.Assertions.assertEquals;

public class TestMessageBuilder {

    @Test
    public void testNameMkyong() {

        MessageBuilder obj = new MessageBuilder();
        assertEquals("Hello mkyong", obj.getMessage("mkyong"));

    }

    @Test
    public void testNameEmpty() {

        MessageBuilder obj = new MessageBuilder();
        assertEquals("Please provide a name!", obj.getMessage(" "));

    }

    @Test
    public void testNameNull() {

        MessageBuilder obj = new MessageBuilder();
        assertEquals("Please provide a name!", obj.getMessage(null));

    }

}

Revoir le rapport à nouveau.

Terminal

$ mvn clean test

target/site/jacoco/index.html

image

image

Enfin, toutes les lignes sont testées, couverture à 100%.

4. FAQ

4.1 Assurez-vous que la couverture des lignes doit respecter le minimum de 90%.

pom.xml

    <plugin>
        <groupId>org.jacoco</groupId>
        <artifactId>jacoco-maven-plugin</artifactId>
        <version>${jacoco.version}</version>
        <executions>
            <execution>
                <goals>
                    <goal>prepare-agent</goal>
                </goals>
            </execution>
            <execution>
                <id>jacoco-report</id>
                <phase>test</phase>
                <goals>
                    <goal>report</goal>
                </goals>
            </execution>
            <!-- Add this checking -->
            <execution>
                <id>jacoco-check</id>
                <goals>
                    <goal>check</goal>
                </goals>
                <configuration>
                    <rules>
                        <rule>
                            <element>PACKAGE</element>
                            <limits>
                                <limit>
                                    <counter>LINE</counter>
                                    <value>COVEREDRATIO</value>
                                    <minimum>0.9</minimum>
                                </limit>
                            </limits>
                        </rule>
                    </rules>
                </configuration>
            </execution>

        </executions>
    </plugin>

L’objectif jacoco: check est associé à la phase de vérification de Maven.

Terminal

$ mvn clean verify
[INFO]Analyzed bundle 'maven-code-coverage' with 1 classes[WARNING]Rule violated for package com.mkyong.examples: lines covered ratio is 0.8, but expected minimum is 0.9

4.2 Comment mettre à jour le dossier de sortie par défaut de JaCoCo?

pom.xml

    <plugin>
        <groupId>org.jacoco</groupId>
        <artifactId>jacoco-maven-plugin</artifactId>
        <version>${jacoco.version}</version>
        <executions>
            <execution>
                <goals>
                    <goal>prepare-agent</goal>
                </goals>
            </execution>
            <execution>
                <id>jacoco-report</id>
                <phase>test</phase>
                <goals>
                    <goal>report</goal>
                </goals>
                <!-- default target/jscoco/site/**  -->
                <configuration>
                    <outputDirectory>target/jacoco-report</outputDirectory>
                </configuration>
            </execution>
        </executions>
    </plugin>

Télécharger le code source

$ git clone https://github.com/mkyong/maven-examples.git $ cd code-maven-couverture

$ mvn clean test # affiche le rapport sur «target/site/jacoco/index.html»

Références

  1. https://en.wikipedia.org/wiki/Java code coverage__tools[Wikipedia:

Outils de couverture de code Java]. JaCoCo Bibliothèque de couverture de code Java

  1. lien://maven/jacoco-code-java-couverture-exemple-maven/[JaCoCo dans

Eclipse IDE]

lien://étiquette/couverture de code/[couverture de code]lien://étiquette/jacoco/[jacoco]lien://tag/maven/[maven]