165 votes

Comment configurer Maven + Sonar + JaCoCo pour obtenir un rapport de couverture fusionné ?

Je l'ai cherché sur Internet. Il y a beaucoup de demi-réponses, en rapport avec les propriétés de Maven telles que ${sonar.jacoco.reportPath} ou org.jacoco:jacoco-maven-plugin:prepare-agent ou le réglage maven-surefire-plugin argLine con -javaagent .

D'une manière ou d'une autre, aucune de ces réponses, qu'elles soient isolées ou combinées, ne produit ce que je recherche : Un rapport de couverture qui montre qu'une classe est couverte si elle est utilisée dans des tests plus haut dans la pile, comme les entités utilisées par les DAO, même si elle n'a pas été entièrement couverte par les tests dans son propre module.

Existe-t-il quelque part une configuration définitive pour y parvenir ?

2voto

SerhatTopkaya Points 51

Cet échantillon fonctionne très bien pour moi :

<plugin>
            <groupId>org.jacoco</groupId>
            <artifactId>jacoco-maven-plugin</artifactId>
            <version>0.8.2</version>
            <executions>
                <execution>
                    <id>pre-unit-test</id>
                    <goals>
                        <goal>prepare-agent</goal>
                    </goals>
                    <configuration>
                        <destFile>${project.build.directory}/coverage-reports/jacoco-ut.exec</destFile>
                        <propertyName>surefireArgLine</propertyName>
                    </configuration>
                </execution>
                <execution>
                    <id>pre-integration-test</id>
                    <goals>
                        <goal>prepare-agent-integration</goal>
                    </goals>
                    <configuration>
                        <destFile>${project.build.directory}/coverage-reports/jacoco-it.exec</destFile>
                        <!--<excludes>
                            <exclude>com.asimio.demo.rest</exclude>
                            <exclude>com.asimio.demo.service</exclude>
                        </excludes>-->
                        <propertyName>testArgLine</propertyName>
                    </configuration>
                </execution>
                <execution>
                    <id>post-integration-test</id>
                    <phase>post-integration-test</phase>
                    <goals>
                        <goal>report</goal>
                    </goals>
                    <configuration>
                        <dataFile>${project.build.directory}/coverage-reports/jacoco-it.exec</dataFile>
                        <outputDirectory>${project.reporting.outputDirectory}/jacoco-it</outputDirectory>
                    </configuration>
                </execution>
                <execution>
                    <id>post-unit-test</id>
                    <phase>prepare-package</phase>
                    <goals>
                        <goal>report</goal>
                    </goals>
                    <configuration>
                        <dataFile>${project.build.directory}/coverage-reports/jacoco-ut.exec</dataFile>
                        <outputDirectory>${project.reporting.outputDirectory}/jacoco-ut</outputDirectory>
                    </configuration>
                </execution>
                <execution>
                    <id>merge-results</id>
                    <phase>verify</phase>
                    <goals>
                        <goal>merge</goal>
                    </goals>
                    <configuration>
                        <fileSets>
                            <fileSet>
                                <directory>${project.build.directory}/coverage-reports</directory>
                                <includes>
                                    <include>*.exec</include>
                                </includes>
                            </fileSet>
                        </fileSets>
                        <destFile>${project.build.directory}/coverage-reports/aggregate.exec</destFile>
                    </configuration>
                </execution>
                <execution>
                    <id>post-merge-report</id>
                    <phase>verify</phase>
                    <goals>
                        <goal>report</goal>
                    </goals>
                    <configuration>
                        <dataFile>${project.build.directory}/coverage-reports/aggregate.exec</dataFile>
                        <outputDirectory>${project.reporting.outputDirectory}/jacoco-aggregate</outputDirectory>
                    </configuration>
                </execution>
            </executions>
        </plugin>

        <plugin>
            <groupId>org.apache.maven.plugins</groupId>
            <artifactId>maven-surefire-plugin</artifactId>
            <version>2.18.1</version>
            <configuration>
                <argLine>${surefireArgLine}</argLine>
                <!--<skipTests>${skip.unit.tests}</skipTests>-->
                <includes>
                    <include>**/*Test.java</include>
                    <!--<include>**/*MT.java</include>
                    <include>**/*Test.java</include>-->
                </includes>
            <!--    <skipTests>${skipUTMTs}</skipTests>-->
            </configuration>
        </plugin>
        <plugin>
            <groupId>org.apache.maven.plugins</groupId>
            <artifactId>maven-failsafe-plugin</artifactId>
            <version>2.12.4</version>
            <configuration>
                <!--<skipTests>${skipTests}</skipTests>
                <skipITs>${skipITs}</skipITs>-->
                <argLine>${testArgLine}</argLine>
                <includes>
                    <include>**/*IT.java</include>
                </includes>
                <!--<excludes>
                    <exclude>**/*UT*.java</exclude>
                </excludes>-->
            </configuration>
            <executions>
                <execution>
                    <goals>
                        <goal>integration-test</goal>
                        <goal>verify</goal>
                    </goals>
                </execution>
            </executions>
        </plugin>

1voto

Andre Piantino Points 151

Vous pouvez appeler une tâche de fourmi appelée fusionner sur maven, pour mettre tous les fichiers de couverture (*.exec) dans le même fichier.

Si vous exécutez des tests unitaires, utilisez la phase préparer le paquet Si vous effectuez des tests d'intégration, utilisez donc test de post-intégration .

Ce site a un exemple de comment appeler une tâche ant jacoco dans un projet maven

Vous pouvez utiliser ce fichier fusionné sur le sonar.

1voto

FibreFoX Points 324

Pour avoir des tests unitaires ET des tests d'intégration, vous pouvez utiliser maven-surefire-plugin et maven-failsafe-plugin avec des inclusions/exclusions restreintes. Je jouais avec CDI tout en prenant contact avec sonar/jacoco, et je me suis retrouvé dans ce projet :

https://github.com/FibreFoX/cdi-sessionscoped-login/

Dans mon pom.xml, j'utilise "-javaagent" implicitement en définissant l'option argLine dans la section de configuration des plugins de test spécifiés. L'utilisation explicite d'ANT dans les projets MAVEN est quelque chose que je n'essaierai pas, pour moi c'est trop mélanger deux mondes.

Je n'ai qu'un projet maven à module unique, mais cela vous aidera peut-être à adapter le vôtre.

note : tous les maven-plugins ne sont peut-être pas à jour, certains problèmes ont peut-être été corrigés dans les versions ultérieures.

0 votes

Merci pour cette information ; je vais jeter un coup d'œil et je vous ferai savoir comment cela fonctionne. Mais ce ne sera peut-être pas cette semaine :)

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X