web-dev-qa-db-fra.com

Couverture du projet multi-modules Jacoco Maven

Il semble qu'il y ait quelques questions, qui sont assez anciennes et les choses ont changé de Java 8 support de Jacoco.

Mon projet contient la structure suivante

pom.xml
|
|
-----sub module A pom.xml
|
|
-----sub module B pom.xml
|
|
-----sub module C pom.xml

J'ai configuré le main pom comme ça

Main POM.xml

<project xmlns="http://maven.Apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xsi:schemaLocation="http://maven.Apache.org/POM/4.0.0 http://maven.Apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>
    <groupId>com.test</groupId>
    <artifactId>jacoco-multi</artifactId>
    <version>0.0.1-SNAPSHOT</version>
    <packaging>pom</packaging>
    <modules>
        <module>projectA</module>
        <module>projectB</module>
    </modules>

    <properties>
        <jacoco.version>0.5.7.201204190339</jacoco.version>
    </properties>

    <dependencies>
        <dependency>
            <groupId>junit</groupId>
            <artifactId>junit-dep</artifactId>
            <version>4.10</version>
            <scope>test</scope>
            <exclusions>
                <exclusion>
                    <groupId>org.hamcrest</groupId>
                    <artifactId>hamcrest-core</artifactId>
                </exclusion>
            </exclusions>
        </dependency>

        <dependency>
            <groupId>org.hamcrest</groupId>
            <artifactId>hamcrest-core</artifactId>
            <version>1.3.RC2</version>
            <scope>test</scope>
        </dependency>

        <dependency>
            <groupId>org.hamcrest</groupId>
            <artifactId>hamcrest-library</artifactId>
            <version>1.3.RC2</version>
            <scope>test</scope>
        </dependency>
    </dependencies>

    <build>
        <plugins>
            <plugin>
                <groupId>org.jacoco</groupId>
                <artifactId>jacoco-maven-plugin</artifactId>
                <version>0.7.5.201505241946</version>
                <configuration>
                    <destFile>${project.basedir}/../target/jacoco.exec</destFile>
                    <append>true</append>
                </configuration>
                <executions>
                    <execution>
                        <id>jacoco-initialize</id>
                        <goals>
                            <goal>prepare-agent</goal>
                        </goals>
                    </execution>
                    <execution>
                        <id>jacoco-site</id>
                        <phase>package</phase>
                        <goals>
                            <goal>report</goal>
                        </goals>
                    </execution>
                </executions>
            </plugin>
            <plugin>
                <groupId>org.Apache.maven.plugins</groupId>
                <artifactId>maven-failsafe-plugin</artifactId>
                <version>2.16</version>
                <executions>
                    <execution>
                        <id>default-integration-test</id>
                        <goals>
                            <goal>integration-test</goal>
                        </goals>
                    </execution>
                </executions>
            </plugin>
            <plugin>
                <groupId>org.Apache.maven.plugins</groupId>
                <artifactId>maven-surefire-plugin</artifactId>
                <version>2.16</version>
            </plugin>
        </plugins>
    </build>

</project>

Un Pom.xml

<project xmlns="http://maven.Apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xsi:schemaLocation="http://maven.Apache.org/POM/4.0.0 http://maven.Apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>
    <parent>
        <artifactId>jacoco-multi</artifactId>
        <groupId>com.test</groupId>
        <version>0.0.1-SNAPSHOT</version>
        <relativePath>..</relativePath>
    </parent>
    <artifactId>projectA</artifactId>

    <build>
        <pluginManagement>
            <plugins>
                <plugin>
                    <groupId>org.Apache.maven.plugins</groupId>
                    <artifactId>maven-surefire-plugin</artifactId>
                    <version>2.12</version>
                </plugin>

            </plugins>
        </pluginManagement>
    </build>

</project>

B pom.xml

<project xmlns="http://maven.Apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
     xsi:schemaLocation="http://maven.Apache.org/POM/4.0.0 http://maven.Apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<parent>
    <artifactId>jacoco-multi</artifactId>
    <groupId>com.test</groupId>
    <version>0.0.1-SNAPSHOT</version>
    <relativePath>..</relativePath>
</parent>
<artifactId>projectB</artifactId>

<dependencies>
    <dependency>
        <groupId>com.test</groupId>
        <artifactId>projectA</artifactId>
        <version>0.0.1-SNAPSHOT</version>
    </dependency>
</dependencies>

<build>
    <pluginManagement>
        <plugins>
            <plugin>
                <groupId>org.Apache.maven.plugins</groupId>
                <artifactId>maven-surefire-plugin</artifactId>
                <version>2.12</version>
            </plugin>
        </plugins>
    </pluginManagement>
</build>

J'exécute cette commande mvn clean package. Je peux voir que jacoco.exec est généré, mais je ne suis pas en mesure de voir que des rapports HTML sont en train de vérifier les données.

S'il vous plait, j'ai besoin de votre aide avec ceci. Un autre point est que ma configuration est correcte pour Multi-Module projets?

Mise à jour

Problème identifié. <destFile>${project.basedir}/../target/jacoco.exec</destFile> changé en <destFile>${project.basedir}/target/jacoco.exec</destFile>

Il génère maintenant des rapports pour des modules individuels. Toute idée de la façon de générer un rapport consolidé

14
Reddy

La version 0.7.7 de JaCoCo peut générer un rapport de couverture agrégé à partir de plusieurs modules Maven via un nouvel objectif jacoco:report-aggregate.

13
Rogério

Après avoir scanné de nombreuses solutions, j'ai créé un projet de démonstration simple mais complet Jacoco montrant:

  • Projet multi-modules
  • Test unitaire (via mvn clean install)
  • Test d'intégration (via mvn clean install -P integration-test)
  • Jacoco - couverture des tests (fichier de données agrégé et rapport agrégé)
  • FindBugs - qualité du code

Profitez du projet de démonstration simple .

2
tm1701

Copiez la fin du code de l'article à https://dzone.com/articles/jacoco-maven-multi-module et mettez-le dans .... ça marche pour moi. Ajoutez simplement autant de modules que vous le souhaitez. J'ai également dû changer antrun de 1.7 à 1.8 pour que les tâches de fourmi s'exécutent.

2
barryku

Un problème dans les projets multimodules est causé, si le pom d'agrégateur est utilisé comme pom parent pour les modules, comme c'est le cas dans l'exemple ci-dessus:

- parentAggregator pom
---sub module A pom.xml -> parentAggregator pom
---sub module B pom.xml -> parentAggregator pom
---sub module C pom.xml -> parentAggregator pom

Dans ce cas, l'ordre de construction est le suivant:

- parentAggregator
- sub module A
- sub module B
- sub module C

ce qui signifie que l'agrégateur parent ne peut pas collecter des informations complètes. Dans mon cas, un transfert de données dans sonarQube par mvn sonar: sonar a entraîné des résultats inattendus et incomplets.

Changer la structure du module pour:

- aggregator pom
-- parent pom
---sub module A pom.xml -> parent pom
---sub module B pom.xml -> parent pom
---sub module C pom.xml -> parent pom

changera l'ordre de construction en:

- parent
- sub module A
- sub module B
- sub module C
- aggregator

Dans ce cas, l'agrégateur sera le dernier et fonctionnera avec les résultats des modules. Dans mon cas, les résultats dans SonarQube étaient comme prévu.

0
Michael Remme