Maven Jacoco-Konfiguration - Schließen Sie Klassen / Pakete vom nicht funktionierenden Bericht aus


103

Ich habe ein Maven-Multimodul-Projekt und verwende Jacoco-Maven für Berichte zur Codeabdeckung. Einige Klassen sollten nicht gemeldet werden, da sie Spring-Konfiguration sind und ich nicht an ihnen interessiert bin.

Ich habe das Maven-Jacoco-Plugin wie folgt deklariert:

<plugin>
<groupId>org.jacoco</groupId>
<artifactId>jacoco-maven-plugin</artifactId>
<version>0.7.2.201409121644</version>
<configuration>
    <outputDirectory>${project.reporting.outputDirectory}/jacoco-ut</outputDirectory>
    <exclude>some.package.*</exclude>
    <exclude>**/*Config.*</exclude>
    <exclude>**/*Dev.*</exclude>
    <exclude>some/package/SomeClass.java</exclude>
</configuration>
<executions>
    <execution>
        <goals>
            <goal>prepare-agent</goal>
        </goals>
    </execution>
    <execution>
        <id>report</id>
        <phase>prepare-package</phase>
        <goals>
            <goal>report</goal>
        </goals>
    </execution>
    <execution>
        <id>post-unit-test</id>
        <phase>test</phase>
        <goals>
            <goal>report</goal>
        </goals>
    </execution>
</executions>
</plugin>

Das Problem ist, dass bei der Ausführung von mvn clean verifyjacoco immer noch Klassen gemeldet werden, die ausgeschlossen werden sollten, wie meine XML-Konfiguration zeigt. Wie kann ich es richtig konfigurieren?

Antworten:


181

Ihr XML ist leicht falsch. Sie müssen alle Klassenausschlüsse in ein übergeordnetes Ausschlussfeld einfügen , sodass Ihre obige Konfiguration gemäß den Jacoco-Dokumenten wie folgt aussehen sollte

<configuration>
    <excludes>
        <exclude>**/*Config.*</exclude>
        <exclude>**/*Dev.*</exclude>
    </excludes>
</configuration>

Die Werte der Ausschlussfelder sollten Klassenpfade (keine Paketnamen) der kompilierten Klassen relativ zum Verzeichnis target / classes / unter Verwendung der Standard-Platzhaltersyntax sein

*   Match zero or more characters
**  Match zero or more directories
?   Match a single character

Sie können ein Paket und alle seine untergeordneten Pakete / Unterpakete auch folgendermaßen ausschließen:

<exclude>some/package/**/*</exclude>

Dies schließt jede Klasse some.packagesowie alle Kinder aus. Zum Beispiel some.package.childwürde auch nicht in den Berichten enthalten sein.

Ich habe getestet und mein Berichtsziel berichtet über eine reduzierte Anzahl von Klassen unter Verwendung der oben genannten.

Wenn Sie diesen Bericht dann in Sonar verschieben, müssen Sie Sonar anweisen, diese Klassen in der Anzeige auszuschließen, was in den Sonareinstellungen möglich ist

Einstellungen> Allgemeine Einstellungen> Ausschlüsse> Codeabdeckung

Sonar Docs erklärt es etwas genauer

Führen Sie Ihren Befehl oben aus

mvn clean verify

Zeigt an, dass die Klassen ausgeschlossen wurden

Keine Ausschlüsse

[INFO] --- jacoco-maven-plugin:0.7.4.201502262128:report (post-test) @ ** ---
[INFO] Analyzed bundle '**' with 37 classes

Mit Ausschlüssen

[INFO] --- jacoco-maven-plugin:0.7.4.201502262128:report (post-test) @ ** ---
[INFO] Analyzed bundle '**' with 34 classes

Hoffe das hilft


2
Ich musste das Jacoco-Plugin von Version 0.7.5 auf 0.7.6 aktualisieren, um den Ausschluss zu berücksichtigen.
Stephane

2
Toller Tipp zu Sonar. Es ist leicht anzunehmen, dass JaCoCo-Ausschlüsse automatisch auf Sonar übertragen werden (wie ich es getan habe).
Markdsievers

10
Wenn ich eine Datei aus jacoco ausschließe, wird sie im Abdeckungsbericht mit 0% Abdeckung angezeigt. Im Grunde genommen bekomme ich schlechtere Ergebnisse als ohne Ausschluss. Kann das behoben werden?
Adam Arold

4
Denken Sie daran, einen Schrägstrich zwischen Dateinamen und keinen Punkt zu verwenden. Außerdem endet die Datei mit .class und nicht mit .java.
ThomasRS

1
Es ist wichtig, die Auswirkungen von ** und * zu verstehen. Wenn Sie ** nicht einschließen, wird es nicht in zugrunde liegende Verzeichnisse übertragen. Das * ist ein einzelnes Zeichen und sollte für Dateinamenzwecke verwendet werden.
Smart Coder

17

Obwohl Andrew die Frage bereits mit Details beantwortet hat, gebe ich Code, wie man sie in pom ausschließt

           <plugin>
                <groupId>org.jacoco</groupId>
                <artifactId>jacoco-maven-plugin</artifactId>
                <version>0.7.9</version>
                <configuration>
                    <excludes>
                        <exclude>**/*com/test/vaquar/khan/HealthChecker.class</exclude>
                    </excludes>
                </configuration>
                <executions>
                    <!-- prepare agent for measuring integration tests -->
                    <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>

Für Springboot-Anwendung

<build>
        <plugins>
            <plugin>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-maven-plugin</artifactId>
            </plugin>
            <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-surefire-plugin</artifactId>
            </plugin>
            <plugin>
                <groupId>org.codehaus.mojo</groupId>
                <artifactId>sonar-maven-plugin</artifactId>
            </plugin>
            <plugin>
                <groupId>org.sonarsource.scanner.maven</groupId>
                <artifactId>sonar-maven-plugin</artifactId>
            </plugin>
            <plugin>
                <groupId>org.jacoco</groupId>
                <artifactId>jacoco-maven-plugin</artifactId>
                <configuration>
                    <excludes>
                       <!-- Exclude class from test coverage -->
                        <exclude>**/*com/khan/vaquar/Application.class</exclude>
                        <!-- Exclude full package from test coverage -->
                        <exclude>**/*com/khan/vaquar/config/**</exclude>
                    </excludes>
                </configuration>
            </plugin>
        </plugins>
    </build>

1
HI Vaquar, ich habe mir den Kopf geschlagen, um das Paket über das Jacoco Maven Plugin auszuschließen. Ich möchte keine ausgeschlossenen Pakete auf Index.html anzeigen, die erstellt werden. Wenn Sie den Code haben, können Sie dasselbe tun. Bitte helfen Sie mir dabei. Senden Sie mir den Code an imvrajendra@gmail.com
Vrajendra Singh Mandloi

3
Es scheint, dass der Klassenpfad ohne .classEnde sein sollte , wie zum Beispiel: <exclude>**/*com/test/vaquar/khan/HealthChecker</exclude>
Hovenko

3
Dies entfernt das gesamte Paket aus dem Bericht für mich: <exclude>com/mycompany/mypackage/**/*</exclude>
Jim Tough

4

Eine andere Lösung:

<plugin>
    <groupId>org.jacoco</groupId>
    <artifactId>jacoco-maven-plugin</artifactId>
    <version>0.7.5.201505241946</version>
    <executions>
        <execution>
            <id>default-prepare-agent</id>
            <goals>
                <goal>prepare-agent</goal>
            </goals>
        </execution>
        <execution>
            <id>default-report</id>
            <phase>prepare-package</phase>
            <goals>
                <goal>report</goal>
            </goals>
        </execution>
        <execution>
            <id>default-check</id>
            <goals>
                <goal>check</goal>
            </goals>
            <configuration>
                <rules>
                    <rule implementation="org.jacoco.maven.RuleConfiguration">
                        <excludes>
                            <exclude>com.mypackage1</exclude
                            <exclude>com.mypackage2</exclude>
                        </excludes>
                        <element>PACKAGE</element>
                        <limits>
                            <limit implementation="org.jacoco.report.check.Limit">
                                <counter>COMPLEXITY</counter>
                                <value>COVEREDRATIO</value>
                                <minimum>0.85</minimum>
                            </limit>
                        </limits>
                    </rule>
                </rules>
            </configuration>
        </execution>
    </executions>
</plugin>

Bitte beachten Sie, dass wir "<element>PACKAGE</element>"in der Konfiguration verwenden, die uns dann hilft, auf Paketebene auszuschließen.


Ich benutze das Jacoco-Maven-Plugin: 0.7.9. Mit Ihrer Lösung werden die Ergebnisse korrekt berechnet. Alle Klassen im Projekt werden jedoch im Jacoco-Bericht (index.html) angezeigt. Ist es möglich, im Bericht nur zu zeigen, was das Plugin analysiert hat, um den tatsächlichen Wert des Covered Ratio zu erhalten?
Aloplop85

3

https://github.com/jacoco/jacoco/issues/34

Dies sind die verschiedenen Notationen für Klassen, die wir haben:

  • VM-Name: java / util / Map $ Entry
  • Java-Name: java.util.Map $ Entry File
  • Name: java / util / Map $ Entry.class

Agentenparameter, Ant-Aufgaben und Maven-Vorbereitungsagentenziel

  • beinhaltet: Java Name (VM Name funktioniert auch)
  • ausgenommen: Java Name (VM Name funktioniert auch)
  • exclclassloader: Java-Name

Diese Spezifikationen erlauben Platzhalter * und?, Wobei * Platzhalter eine beliebige Anzahl von Zeichen, sogar mehrere verschachtelte Ordner.

Maven meldet Ziel

  • beinhaltet: Dateiname
  • Ausgeschlossen sind: Dateiname

Diese Spezifikationen erlauben Ant-Dateispezifikationen wie Platzhalter *, ** und ?, Wobei * Platzhalter nur Teile eines einzelnen Pfadelements sind.


3

Verwenden Sie die Eigenschaft sonar.coverage.exclusions.

mvn clean install -Dsonar.coverage.exclusions=**/*ToBeExcluded.java

Dies sollte die Klassen von der Deckungsberechnung ausschließen.


2

Sie können den Ausschluss der Abdeckung in den Sonareigenschaften außerhalb der Konfiguration des Jacoco-Plugins konfigurieren:

...
<properties>
    ....
    <sonar.exclusions>
        **/generated/**/*,
        **/model/**/*
    </sonar.exclusions>
    <sonar.test.exclusions>
        src/test/**/*
    </sonar.test.exclusions>
    ....
    <sonar.java.coveragePlugin>jacoco</sonar.java.coveragePlugin>
    <sonar.jacoco.reportPath>${project.basedir}/../target/jacoco.exec</sonar.jacoco.reportPath>
    <sonar.coverage.exclusions>
        **/generated/**/*,
        **/model/**/*
    </sonar.coverage.exclusions>
    <jacoco.version>0.7.5.201505241946</jacoco.version>
    ....
</properties>
....

und denken Sie daran, die Ausschlusseinstellungen aus dem Plugin zu entfernen


1

Hier ist das Arbeitsbeispiel in der pom.xmlDatei.

    <plugin>
        <groupId>org.jacoco</groupId>
        <artifactId>jacoco-maven-plugin</artifactId>
        <version>${jacoco.version}</version>


        <executions>
            <execution>
                <id>prepare-agent</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>default-check</id>
                <goals>
                    <goal>check</goal>
                </goals>

            </execution>
        </executions>
        <configuration>
            <dataFile>target/jacoco.exec</dataFile>
            <!-- Sets the output directory for the code coverage report. -->
            <outputDirectory>target/jacoco-ut</outputDirectory>
            <rules>
                <rule implementation="org.jacoco.maven.RuleConfiguration">
                    <element>PACKAGE</element>
                    <limits>
                        <limit implementation="org.jacoco.report.check.Limit">
                            <counter>COMPLEXITY</counter>
                            <value>COVEREDRATIO</value>
                            <minimum>0.00</minimum>
                        </limit>
                    </limits>
                </rule>
            </rules>
            <excludes>
                <exclude>com/pfj/fleet/dao/model/**/*</exclude>
            </excludes>
            <systemPropertyVariables>

                <jacoco-agent.destfile>target/jacoco.exec</jacoco-agent.destfile>
            </systemPropertyVariables>
        </configuration>
    </plugin>
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.