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 verify
を実行したときに、xml設定で指摘されているように、jacocoが除外すべきクラスをまだ報告していることです。どうすれば適切に設定できますか?
XMLが少し間違っているため、excludes親フィールド内にクラスの除外を追加する必要があるため、上記の構成は Jacoco docs に従って次のようになります。
<configuration>
<excludes>
<exclude>**/*Config.*</exclude>
<exclude>**/*Dev.*</exclude>
</excludes>
</configuration>
除外フィールドの値は、標準のワイルドカード構文を使用して、ディレクトリ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 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
お役に立てれば
Andrewはすでに質問に詳細に答えていましたが、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>
別の解決策:
<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>"
を使用しているので、パッケージレベルで除外するのに役立ちます。
https://github.com/jacoco/jacoco/issues/34
これらは、私たちが持っているクラスの異なる表記法です。
エージェントパラメータ、Antタスク、Maven prepare-agentゴール
これらの仕様では、ワイルドカード*および?を使用できます。*には、任意の数の文字、複数のネストされたフォルダーも含まれます。
Mavenレポートの目標
これらの仕様では、ワイルドカード*、** 、?などのAnt Filespecを使用できます。*は、単一のパス要素のワイルドカード部分のみです。
Sonar.coverage.exclusionsプロパティを使用します。
mvn clean install -Dsonar.coverage.exclusions=**/*ToBeExcluded.Java
これにより、クラスがカバレッジ計算から除外されます。
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>
....
プラグインから除外設定を削除することを忘れないでください
以下は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>