wake-up-neo.com

Integrations- und Unit-Testberichte mit JaCoCo zusammenführen

Ich generiere mit dem JaCoCo-Plugin ausfallsichere und todsichere Berichte mit maven, aber ich kann sie nur in separaten Berichten erhalten. Ich möchte auch einen Überblick über die Gesamtabdeckung (Zusammenführen von Komponententests und Integrationstests). 

Nach einer meiner Meinung nach gründlichen Google-Suche konnte ich nur mit Sonar einen Weg finden. Gibt es einen einfacheren Weg, dies zu tun?

Zugehörige Frage: Maven separate Unit-Test- und Integrationstests

21
raf

Sie sollten einen Blick in die Dokumentation des JaCoCo Maven-Plugins werfen, das ein merge -ziel enthält.

7
khmarbaise

Ich habe dies kürzlich implementiert: Nach einigen Kopfschmerzen und vielen Tests habe ich eine Konfiguration, die wunderbar funktioniert.

                 <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>

Wie Sie sehen, gibt es sechs verschiedene Jacoco-Ausführungen, um die Tests auszuführen, die Dateien zusammenzuführen und einen zusammenfassenden Bericht zu erstellen. Zusätzlich zur Jacoco-Konfiguration müssen Sie Surefire und Failsafe so konfigurieren, dass sie ein Argument von Jacoco annehmen (Surefire führt die Unit-Tests und Failsafe die Integrationstests durch).

Die gesamte Konfiguration, die ich verwendet habe, sollte vorhanden sein. Was Sie damit tun, ist Ihre Entwurfsarchitektur, um sie an Ihre gewünschten Anforderungen anzupassen. Ich persönlich empfehle einen Blick auf das, was ich ausschließe und in die Funktionstüchtigkeit und Ausfallsicherheit einbeziehen, wenn Sie Probleme mit nicht gelesenen Dateien haben.

24
Chad Van De Hey

Nicht die Antwort, die Sie suchen, aber trotzdem ...

In den meisten Fällen sollten Sie die Abdeckung von Einheiten- und Integrationstests nicht zusammenführen.

Der Wert von Komponententests besteht darin, dass sie das Design Ihrer Anwendung verbessern und sicherstellen, dass Eckfälle Ihres Codes richtig funktionieren. Sie sollten versuchen, eine hohe Verzweigungsabdeckung Ihrer Komponententests zu haben.

Der Wert Ihrer Integrationstests besteht darin, dass sie sicherstellen, dass die Hauptanwendungsfälle Ihrer Anwendung ordnungsgemäß funktionieren und der gesamte Stapel korrekt integriert ist. Sie sollten versuchen, eine hohe Funktionsabdeckung für Ihre Integrationstests zu haben. (Es ist jedoch ziemlich schwierig, die funktionale Abdeckung mit einem Werkzeug zu messen.).

Wenn Sie Integrationstests zur Verbesserung der Zweigabdeckung benötigen, ist dies ein deutlicher Hinweis darauf, dass Sie das Design Ihres Codes überprüfen sollten. Wenn Sie bereits über eine hohe Zweigabdeckung ohne Integrationstests verfügen, sollten Sie durch das Hinzufügen dieser Werte Ihre Metriken nicht wesentlich ändern.

Fühlen Sie sich frei, diese Antwort nach unten zu stimmen, da sie ein wenig thematisch und ziemlich einvernehmlich ist ...

18
Guillaume

Aufbauend auf der Antwort von Tschad, hier meine Konfiguration. Es ist als separates Profil mit dem Namen jacoco konfiguriert, sodass ich es problemlos ein- und ausschalten kann. Es verwendet nur die Standardkonfiguration. Es kann einen separaten Codeabdeckungsbericht für Komponententests, einen separaten Codeabdeckungsbericht für Integrationstests sowie einen kombinierten Codeabdeckungsbericht erstellen.

    <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

Vielleicht ist es schöner, dieselbe Jacoco-Datei zu verwenden, aber lassen Sie es andere Tests, die für uns funktionieren - Einheit und es testet.

            <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