Maven Jacoco構成-レポートからクラス/パッケージを除外すると機能しない


103

Mavenマルチモジュールプロジェクトがあり、コードカバレッジレポートにjacoco-mavenを使用しています。一部のクラスはSpring構成であり、私はそれらに興味がないため、報告すべきではありません。

私はmaven-jacocoプラグインを次のように宣言しました:

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

問題は、mvn clean verifyjacoco を実行しても、xml構成で指摘されているように、除外されているはずのクラスがまだ報告されていることです。どうすれば適切に設定できますか?

回答:


181

あなたのXMLは少し間違っています、excludes親フィールド内にクラスの除外を追加する必要があるため、上記の構成はJacocoドキュメントに従って次のようになります

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

excludeフィールドの値は、標準のワイルドカード構文を使用して、ディレクトリtarget / classes /を基準にしてコンパイルされたクラスの(パッケージ名ではなく)クラスパスである必要があります

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

次のようにして、パッケージとそのすべての子/サブパッケージを除外することもできます。

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

これにより、のすべてのクラスsome.packageとすべての子が除外されます。たとえばsome.package.child、レポートにも含まれません。

上記を使用して、少数のクラスでテストおよびレポート目標レポートをテストしました。

次に、このレポートをSonarにプッシュする場合、Sonarにこれらのクラスを除外するようにSonarに指示する必要があります。これは、Sonar設定で実行できます。

設定>一般設定>除外>コードカバレッジ

Sonar Docsがもう少し説明します

上記のコマンドを実行する

mvn clean verify

クラスが除外されたことを示します

除外なし

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

除外あり

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

お役に立てれば


2
除外が考慮されるようにするには、Jacocoプラグインをバージョン0.7.5から0.7.6にアップグレードする必要がありました。
ステファン2016年

2
ソナーに関する素晴らしいヒント。JaCoCoの除外が(私がしたように)自動的にSonarに伝播すると仮定するのは簡単です。
markdsievers 2016年

10
jacocoからファイルを除外すると、カバレッジレポートに0%のカバレッジで表示されます。つまり、除外しない場合と比較して、基本的に結果が悪くなります。これは修正できますか?
Adam Arold 16

4
ファイル名の間にはドットではなくスラッシュを使用することを忘れないでください。また、ファイルの末尾は.classではなく.classです。
ThomasRS 2016年

1
**と*の影響を理解することが重要です。**を含めない場合、基礎となるディレクトリに移動しません。*は1文字で、ファイル名の目的で使用する必要があります。
スマートコーダー

17

アンドリューはすでに詳細で質問に答えましたが、私はそれをpomで除外する方法をコードに与えています

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

Springbootアプリケーションの場合

<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
こんにちはVaquar、私はjacoco mavenプラグインを介してパッケージを除外するために頭を殴っています。作成されたIndex.htmlにExcludedパッケージを表示したくありません。同じコードを使用できる場合は、親切に手伝ってください。imvrajendra@gmail.comでコードを送ってください
Vrajendra Singh Mandloi

3
クラスパスは次のよう.class終了しないでください: <exclude>**/*com/test/vaquar/khan/HealthChecker</exclude>
hovenko '29

3
これは私のためのレポートからパッケージ全体を削除します <exclude>com/mycompany/mypackage/**/*</exclude>
ジム・タフ

4

別の解決策:

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

"<element>PACKAGE</element>"パッケージレベルで除外するのに役立つ構成で使用していることに注意してください。


私はjacoco-maven-plugin:0.7.9を使用しています。あなたのソリューションで、それは結果を正しく計算します。ただし、プロジェクトのすべてのクラスはjacocoレポート(index.html)に表示されます。カバー率の実際の値を得るためにプラグインが分析したものだけをレポートに表示することは可能ですか?
aloplop85

3

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

これらは私たちが持っているクラスの異なる表記法です:

  • VM名:java / util / Map $ Entry
  • Java名:java.util.Map $ Entryファイル
  • 名前:java / util / Map $ Entry.class

エージェントパラメータ、Antタスク、Maven準備エージェントの目標

  • インクルード:Java名(VM名も機能)
  • 除外:Java名(VM名も機能します)
  • exclclassloader:Java名

これらの仕様では、ワイルドカード*および?を使用できます。*は、複数のネストされたフォルダーであっても、任意の数の文字をワイルドカードとして使用します。

Mavenレポートの目標

  • インクルード:ファイル名
  • 除外:ファイル名

これらの仕様では、ワイルドカード*、** 、?などのAnt Filespecを使用できます。*は、単一のパス要素の一部のみをワイルドカードに使用します。


3

sonar.coverage.exclusionsプロパティを使用します。

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

これにより、クラスがカバレッジ計算から除外されます。


2

jacocoプラグインの構成以外に、ソナープロパティでカバレッジの除外を構成できます。

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

プラグインから除外設定を削除することを忘れないでください


1

pom.xmlファイルのサンプルは次のとおりです。

    <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>
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.