it-swarm.com.de

Maven Jacoco Configuration - Schließen Sie Klassen/Pakete vom Bericht ab, der nicht funktioniert

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

Ich habe das Maven-Jacoco-Plugin wie folgt erklärt:

<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 jacoco beim Ausführen von mvn clean verify immer noch Klassen meldet, die aufgrund meiner XML-Konfiguration ausgeschlossen werden sollten. Wie kann ich es richtig konfigurieren?

59
resilva87

Ihr XML ist etwas falsch. Sie müssen Klassenausschlüsse in einem ausschließenden übergeordneten Feld hinzufügen. Daher sollte Ihre obige Konfiguration laut Jacoco docs folgendermaßen aussehen.

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

Die Werte der Ausschlussfelder sollten Klassenpfade (nicht Paketnamen) der kompilierten Klassen relativ zum Verzeichnis Ziel/Klassen/sein, wobei die Standard-Wildcard-Syntax verwendet wird

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

Sie können ein Paket und alle untergeordneten/untergeordneten Pakete auf diese Weise auch ausschließen:

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

Dies schließt jede Klasse in some.package sowie alle untergeordneten Klassen aus. Beispielsweise würde some.package.child auch nicht in den Berichten enthalten sein.

Ich habe mit einer reduzierten Anzahl von Klassen anhand der oben genannten Punkte Testberichte und Berichte zum Ziel durchgeführt.

Wenn Sie diesen Bericht dann in Sonar verschieben, müssen Sie Sonar anweisen, diese Klassen in der Anzeige auszuschließen. Dies kann in den Sonar-Einstellungen erfolgen

Einstellungen> Allgemeine Einstellungen> Ausschlüsse> Codeabdeckung

Sonar Docs erklärt es etwas mehr

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

107
Andrew Kew

Obwohl Andrew die Frage bereits mit Details beantwortet hat, gebe ich Code, wie er in Pom ausgeschlossen werden kann

           <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>
6
vaquar khan

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

Agent-Parameter, Ant-Tasks und Maven-Ziel für das Agent-Ziel

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

Diese Angaben erlauben Platzhalterzeichen * und?, Wobei * Platzhalterzeichen eine beliebige Anzahl von Zeichen enthalten, sogar mehrere verschachtelte Ordner.

Maven Berichtsziel

  • enthält: Dateiname
  • schließt aus: Dateiname

Diese Spezifikationen ermöglichen Ant Filespec wie Platzhalter *, ** und?, Wobei * Platzhalter nur Teile eines einzelnen Pfadelements enthalten.

3
cra6

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, was uns auf Paketebene ausschließt.

2
Arijit

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
user1401472

sie können den Coverage-Ausschluss in den Sonar-Eigenschaften 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>
....

denken Sie daran, die Ausschlusseinstellungen aus dem Plugin zu entfernen

1
leon cio

Hier ist das Arbeitsprobe in der pom.xml-Datei.

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