web-dev-qa-db-fra.com

Fusion de rapports d'intégration et de tests unitaires avec JaCoCo

Je génère des rapports sécurisés et infaillibles avec maven avec le plug-in JaCoCo, mais je ne peux que les obtenir dans des rapports séparés. J'aimerais aussi avoir une vue globale de la couverture (fusion entre les tests unitaires et les tests d'intégration). 

Après ce que je pense être une recherche approfondie sur Google, je n'ai trouvé qu'un moyen de faire cela avec Sonar. Y a-t-il un moyen plus simple de faire cela?

Question connexe: Tests unitaires et tests d'intégration distincts Maven

21
raf

Vous devriez consulter la documentation du plug-in JaCoCo Maven qui contient un merge goal.

7
khmarbaise

J'ai récemment implémenté ceci: après quelques maux de tête et de nombreux tests, j'ai une configuration qui fonctionne à merveille.

                 <plugin>
                    <groupId>org.jacoco</groupId>
                    <artifactId>jacoco-maven-plugin</artifactId>
                    <version>${jacoco.version}</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>
                                <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>**/*UT.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>
                <excludes>
                    <exclude>**/*UT*.Java</exclude>
                </excludes>
            </configuration>
            <executions>
                <execution>
                    <goals>
                        <goal>integration-test</goal>
                        <goal>verify</goal>
                    </goals>
                </execution>
            </executions>
        </plugin>

Comme vous pouvez le constater, il existe 6 exécutions différentes de Jacoco pour exécuter les tests, fusionner les fichiers et créer un rapport global. En plus de la configuration de Jacoco, vous devez également configurer Surefire et Failsafe pour accepter un argument de Jacoco (Surefire exécute les tests unitaires et Failsafe exécute les tests d'intégration).

Toute la configuration que j'ai utilisée devrait être là, ce que vous en faites est votre architecture de conception pour l'adapter à vos besoins. Personnellement, je vous recommande de jeter un coup d'œil sur ce que j'exclus et d'inclure dans surefire et Failsafe si vous rencontrez des problèmes avec des fichiers non lus.

24
Chad Van De Hey

Pas la réponse que vous cherchez, mais quand même ...

Dans la plupart des cas, vous ne devez pas fusionner la couverture des tests unitaires et des tests d'intégration.

La valeur des tests unitaires est qu'ils améliorent la conception de votre application et garantissent le bon fonctionnement des cascades de votre code. Vous devriez essayer d'avoir une couverture élevée de vos tests unitaires.

La valeur de vos tests d'intégration est qu'ils garantissent que les principaux cas d'utilisation de votre application fonctionnent correctement et que toute la pile est correctement intégrée. Vous devriez essayer d'avoir une couverture fonctionnelle élevée pour vos tests d'intégration. (Mais il est assez difficile de mesurer la couverture fonctionnelle avec un outil).

Si vous avez besoin de tests d'intégration pour améliorer la couverture de vos succursales, cela signifie que vous devriez revoir la conception de votre code. Et si vous avez déjà une couverture élevée de branches sans tests d'intégration, leur ajout ne devrait pas modifier de manière significative vos métriques.

Ne hésitez pas à voter cette réponse car il est un peu sujet et assez d'opinion ...

18
Guillaume

S'appuyant sur la réponse de Chad, voici ma configuration. Il est configuré en tant que profil distinct nommé jacoco afin que je puisse l'activer et le désactiver facilement. Il utilise uniquement la configuration par défaut. Il peut créer un rapport de couverture de code distinct pour les tests unitaires, un rapport de couverture de code séparé pour les tests d'intégration et également un rapport de couverture de code combiné.

    <profile>
        <id>jacoco</id>
        <build>
            <plugins>
                <plugin>
                    <groupId>org.jacoco</groupId>
                    <artifactId>jacoco-maven-plugin</artifactId>
                    <executions>
                        <execution>
                            <id>pre-unit-test</id>
                            <goals>
                                <goal>prepare-agent</goal>
                            </goals>
                        </execution>
                        <execution>
                            <id>post-unit-test</id>
                            <phase>test</phase>
                            <goals>
                                <goal>report</goal>
                            </goals>
                        </execution>
                        <execution>
                            <id>pre-integration-test</id>
                            <goals>
                                <goal>prepare-agent-integration</goal>
                            </goals>
                        </execution>
                        <execution>
                            <id>post-integration-test</id>
                            <goals>
                                <goal>report-integration</goal>
                            </goals>
                        </execution>
                        <execution>
                            <id>merge-results</id>
                            <phase>verify</phase>
                            <goals>
                                <goal>merge</goal>
                            </goals>
                            <configuration>
                                <fileSets>
                                    <fileSet>
                                        <directory>${project.build.directory}</directory>
                                        <includes>
                                            <include>*.exec</include>
                                        </includes>
                                        <excludes>
                                            <exclude>aggregate.exec</exclude>
                                        </excludes>
                                    </fileSet>
                                </fileSets>
                                <destFile>${project.build.directory}/aggregate.exec</destFile>
                            </configuration>
                        </execution>
                        <execution>
                            <id>post-merge-report</id>
                            <phase>verify</phase>
                            <goals>
                                <goal>report</goal>
                            </goals>
                            <configuration>
                                <dataFile>${project.build.directory}/aggregate.exec</dataFile>
                                <outputDirectory>${project.reporting.outputDirectory}/jacoco-aggregate</outputDirectory>
                            </configuration>
                        </execution>
                    </executions>
                </plugin>
            </plugins>
        </build>
    </profile>
1
Nikolaos Georgiou

Le moyen le plus simple d’atteindre est peut-être d’utiliser le même fichier jacoco, mais laissez-le tester de nouveau, ce qui fonctionne pour nous - l’unité et les tests.

            <plugin>
                <groupId>org.jacoco</groupId>
                <artifactId>jacoco-maven-plugin</artifactId>
                <version>0.8.1</version>
                <executions>
                    <execution>
                        <id>default-prepare-agent</id>
                        <goals>
                            <goal>prepare-agent</goal>
                        </goals>
                        <configuration>
                            <skip>${maven.surefire.skipTests}</skip>
                            <propertyName>maven.surefire.argLine</propertyName>
                            <!-- using the same dest file for both UT and IT -->
                            <destFile>${sonar.jacoco.reportPath}</destFile>
                        </configuration>
                    </execution>
                    <execution>
                        <id>default-prepare-agent-integration</id>
                        <goals>
                            <goal>prepare-agent-integration</goal>
                        </goals>
                        <configuration>
                            <skip>${maven.failsafe.skipTests}</skip>
                            <propertyName>maven.failsafe.argLine</propertyName>
                            <!-- append to the UT dest file -->
                            <destFile>${sonar.jacoco.reportPath}</destFile>
                            <append>true</append>
                        </configuration>
                    </execution>
                </executions>
            </plugin>
            <plugin>
            <artifactId>maven-surefire-plugin</artifactId>
            <configuration>
                <skipTests>${maven.surefire.skipTests}</skipTests>
                <failIfNoTests>${maven.surefire.failIfNoTests}</failIfNoTests>
                <!-- allow argLine to be modified by other plugins, e.g. jacoco -->
                <argLine>@{maven.surefire.argLine}</argLine>
            </configuration>
        </plugin>
        <plugin>
            <artifactId>maven-failsafe-plugin</artifactId>
            <configuration>
                <skipTests>${maven.failsafe.skipTests}</skipTests>
                <failIfNoTests>${maven.failsafe.failIfNoTests}</failIfNoTests>
                <!-- allow argLine to be modified by other plugins, e.g. jacoco -->
                <argLine>@{maven.failsafe.argLine}</argLine>
            </configuration>
        </plugin>
0
Cipous