155

私はこれをインターネットで上下に検索しました。${sonar.jacoco.reportPath}、、またはorg.jacoco:jacoco-maven-plugin:prepare-agentで設定maven-surefire-plugin argLineするなどのMavenプロパティに関係する、多くの半分の答えがあります-javaagent

どういうわけか、これらの答えのいずれも、それ自体で、または組み合わせて、私が求めているものを生み出していません:使用されているエンティティなど、スタックの上位のテストで使用された場合にカバーされたクラスを示すカバレッジレポートDAOによるものですが、独自のモジュールでのテストでは完全にはカバーされていませんでした。

これを達成するために、どこかに決定的な構成がありますか?

4

13 に答える 13

189

私はあなたと同じ状況でした。多くの人が同じ問題を抱えているように見えたので、インターネット全体に散らばっている半分の答えは非常に迷惑でしたが、彼らがそれをどのように解決したかを完全に説明することは誰にもできませんでした。

Sonarのドキュメントは、役立つ例を含むGitHubプロジェクトを参照し ています。これを解決するために私がしたことは、統合テストロジックを通常の単体テストに適用することでした(適切な単体テストはサブモジュール固有である必要がありますが、常にそうであるとは限りません)。

親pom.xmlに、次のプロパティを追加します。

<properties>
    <!-- Sonar -->
    <sonar.java.coveragePlugin>jacoco</sonar.java.coveragePlugin>
    <sonar.dynamicAnalysis>reuseReports</sonar.dynamicAnalysis>
    <sonar.jacoco.reportPath>${project.basedir}/../target/jacoco.exec</sonar.jacoco.reportPath>
    <sonar.language>java</sonar.language>
</properties>

これにより、Sonarは、同じ場所(親プロジェクトのターゲットフォルダー)にあるすべてのサブモジュールの単体テストレポートを取得します。また、Sonarに対して、独自にロールするのではなく、手動で実行されたレポートを再利用するように指示します。ビルド/プラグイン内の親pomにこれを配置することにより、すべてのサブモジュールに対してjacoco-maven-pluginを実行する必要があります。

<plugin>
    <groupId>org.jacoco</groupId>
    <artifactId>jacoco-maven-plugin</artifactId>
    <version>0.6.0.201210061924</version>
    <configuration>
        <destFile>${sonar.jacoco.reportPath}</destFile>
        <append>true</append>
    </configuration>
    <executions>
        <execution>
            <id>agent</id>
            <goals>
                <goal>prepare-agent</goal>
            </goals>
        </execution>
    </executions>
</plugin>

destFileレポートファイルをSonarが検索する場所に配置し、append上書きするのではなくファイルに追加します。これにより、すべてのサブモジュールのすべてのJaCoCoレポートが同じファイルに結合されます。

Sonarは、サブモジュールごとにそのファイルを調べます。これは、上記で彼に指摘したことであり、Sonarのマルチモジュールファイルの単体テスト結果を組み合わせたものです。

于 2013-03-20T22:24:44.443 に答える
27

バージョン0.7.7以降の新しい方法

バージョン0.7.7以降、集計レポートを作成する新しい方法があります。

必要なすべてのレポートを収集する別の「レポート」プロジェクトを作成します(アグリゲータープロジェクトの目標はモジュールの前に実行されるため、使用できません)。

aggregator pom
  |- parent pom
  |- module a
  |- module b
  |- report module 

ルートpomは次のようになります(モジュールの下に新しいレポートモジュールを追加することを忘れないでください):

<build>
<plugins>
  <plugin>
    <groupId>org.jacoco</groupId>
    <artifactId>jacoco-maven-plugin</artifactId>
    <version>0.7.8</version>
    <executions>
      <execution>
        <id>prepare-agent</id>
        <goals>
          <goal>prepare-agent</goal>
        </goals>
      </execution>
    </executions>
  </plugin>
</plugins>

各サブモジュールのpomを変更する必要はまったくありません。レポートモジュールのpomは次のようになります。

<!-- Add all sub modules as dependencies here -->
<dependencies>
  <dependency>
    <module a>
  </dependency>
  <dependency>
    <module b>
  </dependency>
 ...

  <build>
    <plugins>
      <plugin>
        <groupId>org.jacoco</groupId>
        <artifactId>jacoco-maven-plugin</artifactId>
        <version>0.7.8</version>
        <executions>
          <execution>
            <id>report-aggregate</id>
            <phase>verify</phase>
            <goals>
              <goal>report-aggregate</goal>
            </goals>
          </execution>
        </executions>
      </plugin>
    </plugins>
  </build>

完全な例はここにあります。

于 2017-01-13T15:03:54.657 に答える
25

よくある質問

それ以来、頭のてっぺんからの質問は、ジャココに夢中になりました。

シリアのイラクにある私のアプリケーションサーバー(jBoss、Glassfish ..)は、統合テストを実行するときにマルチモジュールカバレッジを取得できますか?JenkinsとSonarも異なるサーバー上にあります。

はい。モードで実行されるjacocoエージェント、jacocoantlibを使用する必要がありますoutput=tcpserver。基本的に2jar秒。これにより、99%の成功が得られます。

jacocoエージェントはどのように機能しますか?

文字列を追加します

-javaagent:[your_path]/jacocoagent.jar=destfile=/jacoco.exec,output=tcpserver,address=*

アプリケーションサーバーJAVA_OPTSに接続し、再起動します。この文字列で[your_path]は、アプリサーバーが実行されているVMに保存(保存!)されたjacocoagent.jarへのパスに置き換えるだけで済みます。その時点でアプリサーバーを起動すると、デプロイされているすべてのアプリケーションが動的に監視され、それらのアクティビティ(コードの使用を意味する)がtclリクエストによってjacocos.exec形式で取得できるようになります。

テスト開始時からのみ実行データの収集を開始するようにjacocoエージェントをリセットできますか?

はい、そのためには、jenkinsワークスペースにあるjacocoant.jarとantビルドスクリプトが必要です。

つまり、基本的にhttp://www.eclemma.org/jacoco/から必要なのは、jenkinsワークスペースにあるjacocoant.jarと、アプリサーバーVMにあるjacocoagent.jarですか?

それは正しい。

antは使いたくないのですが、jacocomavenプラグインでもすべてのことができると聞きました。

そうではありません。jacocomavenプラグインは単体テストデータといくつかの統合テストデータを収集できます(Arquillian Jacocoを参照)が、たとえば、jenkinsの個別のビルドとして安心できるテストがあり、マルチモジュールカバレッジを表示したい場合は、 Mavenプラグインがどのように役立つかわかりません。

ジャココエージェントは正確に何を生成しますか?

.execフォーマットのカバレッジデータのみ。ソナーはそれを読むことができます。

jacocoは私のJavaクラスがどこにあるかを知る必要がありますか?

いいえ、ソナーはしますが、ジャココはしません。mvn sonar:sonarクラスへのパスを実行すると、効果があります。

では、アリのスクリプトはどうですか?

jenkinsワークスペースに表示する必要があります。私のアリのスクリプト、私はそれをjacoco.xml次のように呼んだ:

<project name="Jacoco library to collect code coverage remotely" xmlns:jacoco="antlib:org.jacoco.ant">
    <property name="jacoco.port" value="6300"/>
    <property name="jacocoReportFile" location="${workspace}/it-jacoco.exec"/>

    <taskdef uri="antlib:org.jacoco.ant" resource="org/jacoco/ant/antlib.xml">
        <classpath path="${workspace}/tools/jacoco/jacocoant.jar"/>
    </taskdef>

    <target name="jacocoReport">
            <jacoco:dump address="${jacoco.host}" port="${jacoco.port}" dump="true" reset="true" destfile="${jacocoReportFile}" append="false"/>
    </target>

    <target name="jacocoReset">
            <jacoco:dump address="${jacoco.host}" port="${jacoco.port}" reset="true" destfile="${jacocoReportFile}" append="false"/>
        <delete file="${jacocoReportFile}"/>
    </target>
</project>

このスクリプトを呼び出すときに渡す必要のある2つの必須パラメーターは、このスクリプト -Dworkspace=$WORKSPACE を使用して、jenkinsワークスペースと-Djacoco.host=yourappserver.comホストをポイントします。http://

また、jacocoant.jar${workspace}/tools/jacoco/jacocoant.jarに移動したことにも注意してください。

次に何をすればいいですか?

アプリサーバーをjacocoagent.jarで起動しましたか?

antスクリプトとjacocoant.jarをjenkinsワークスペースに配置しましたか?

はいの場合、最後のステップはjenkinsビルドを構成することです。戦略は次のとおりです。

  1. antターゲットjacocoResetを呼び出して、以前に収集されたすべてのデータをリセットします。
  2. テストを実行する
  3. アリのターゲットjacocoReportを呼び出してレポートを取得する

すべてが正しければit-jacoco.exec、ビルドワークスペースに表示されます。

スクリーンショットを見てくださいant。ワークスペースの$WORKSPACE/tools/antdirにもインストールしましたが、jenkinsにインストールされているものを使用できます。

ここに画像の説明を入力してください

このレポートをソナーにプッシュする方法は?

Mavensonar:sonarがジョブを実行し(構成することを忘れないでください)、メインのpom.xmlをポイントして、すべてのモジュールで実行されるようにします。パラメータを使用sonar.jacoco.itReportPath=$WORKSPACE/it-jacoco.execして、統合テストレポートの場所をソナーに通知します。新しいモジュールクラスを分析するたびに、のカバレッジに関する情報を検索しますit-jacoco.exec

私はすでに`target`ディレクトリにjacoco.execを持っています、` mvn sonar:sonar`はそれを無視/削除します

デフォルトでmvn sonar:sonarclean、ターゲットディレクトリを削除しますが、これsonar.dynamicAnalysis=reuseReportsを回避するために使用します。

于 2014-05-23T13:42:00.023 に答える
16

JaCoCoのバイナリレポート形式(* .exec)が非推奨になり、推奨される形式がXML(SonarJava 5.12以降)である、新しいSonarバージョンの別のソリューションを見つけました。解決策は非常に単純で、このトピックの親ディレクトリに* .execレポートがある以前の解決策と似ています:https ://stackoverflow.com/a/15535970/4448263 。

プロジェクト構造が次のようになっていると仮定します。

moduleC - aggregate project's pom
  |- moduleA - some classes without tests
  |- moduleB - some classes depending from moduleA and tests for classes in both modules: moduleA and moduleB

集約プロジェクトのpomで次のMavenビルドプラグイン構成が必要です。

<plugin>
    <groupId>org.jacoco</groupId>
    <artifactId>jacoco-maven-plugin</artifactId>
    <version>0.8.5</version>
    <executions>
        <execution>
            <id>prepare-and-report</id>
            <goals>
                <goal>prepare-agent</goal>
                <goal>report</goal>
            </goals>
        </execution>
        <execution>
            <id>report-aggregate</id>
            <phase>verify</phase>
            <goals>
                <goal>report-aggregate</goal>
            </goals>
            <configuration>
                <outputDirectory>${project.basedir}/../target/site/jacoco-aggregate</outputDirectory>
            </configuration>
        </execution>
    </executions>
</plugin>

次に、Mavenを使用してプロジェクトをビルドします。

mvn clean verify

また、Sonarの場合は、管理GUIでプロパティを設定する必要があります。

sonar.coverage.jacoco.xmlReportPaths=target/site/jacoco/jacoco.xml,../target/site/jacoco-aggregate/jacoco.xml

またはコマンドラインを使用する:

mvn sonar:sonar -Dsonar.coverage.jacoco.xmlReportPaths=target/site/jacoco/jacoco.xml,../target/site/jacoco-aggregate/jacoco.xml

説明

これにより、デフォルトディレクトリに各モジュールのバイナリレポートが作成されますtarget/jacoco.exec。次に、デフォルトのディレクトリに各モジュールのXMLレポートを作成しますtarget/site/jacoco/jacoco.xml${project.basedir}/../target/site/jacoco-aggregate/次に、各モジュールの親ディレクトリに相対的なカスタムディレクトリに各モジュールの集計レポートを作成します。moduleAおよびmoduleBの場合、これは共通パスになりますmoduleC/target/site/jacoco-aggregate/

moduleBはmoduleAに依存しているため、moduleBは最後に作成され、そのレポートは、モジュールAとBの両方のSonarの集計カバレッジレポートとして使用されます。

JaCoCo集計レポートには依存関係のカバレッジデータのみが含まれているため、集計レポートに加えて、通常のモジュールレポートが必要です。

一緒に、これらの2つのタイプのレポートは、Sonarの完全なカバレッジデータを提供します。

小さな制限が1つあります。プロジェクトの親ディレクトリにレポートを記述できる必要があります(権限が必要です)。またはjacoco.skip=true、ルートプロジェクトのpom.xml(moduleC)とjacoco.skip=false、クラスとテストを含むモジュール(moduleAとmoduleB)にプロパティを設定できます。

于 2020-03-11T15:17:01.123 に答える
12

他のソリューションとは微妙に異なり、既存の回答の助けを借りて、解決策を正しく理解するのに1日かかったので、ソリューションを投稿します。

マルチモジュールMavenプロジェクトの場合:

ROOT
|--WAR
|--LIB-1
|--LIB-2
|--TEST

WARプロジェクトがメインのWebアプリである場合、1と2は依存するLIB追加のモジュールであり、統合テストが行​​われる場所です。 埋め込まれたTomcatインスタンスを(Tomcatプラグイン経由ではなく)起動し、プロジェクトを実行して、一連のJUnitテストを介してそれらをテストします。とプロジェクトの両方に独自の単体テストがあります。WARTESTTESTWARWARLIB

これらすべての結果として、統合と単体テストのカバレッジが分離され、SonarQubeで区別できるようになります。

ROOT pom.xml

<!-- Sonar properties-->
<sonar.jacoco.itReportPath>${project.basedir}/../target/jacoco-it.exec</sonar.jacoco.itReportPath>
<sonar.jacoco.reportPath>${project.basedir}/../target/jacoco.exec</sonar.jacoco.reportPath>
<sonar.language>java</sonar.language>
<sonar.java.coveragePlugin>jacoco</sonar.java.coveragePlugin>

<!-- build/plugins (not build/pluginManagement/plugins!) -->
<plugin>
    <groupId>org.jacoco</groupId>
    <artifactId>jacoco-maven-plugin</artifactId>
    <version>0.7.6.201602180812</version>
    <executions>
        <execution>
            <id>agent-for-ut</id>
            <goals>
                <goal>prepare-agent</goal>
            </goals>
            <configuration>
                <append>true</append>
                <destFile>${sonar.jacoco.reportPath}</destFile>
            </configuration>
        </execution>
        <execution>
            <id>agent-for-it</id>
            <goals>
                <goal>prepare-agent-integration</goal>
            </goals>
            <configuration>
                <append>true</append>
                <destFile>${sonar.jacoco.itReportPath}</destFile>
            </configuration>
        </execution>
    </executions>
</plugin>

WARLIB およびTEST pom.xmlJaCoCoプラグインの実行を継承します。

TEST pom.xml

<plugin>
    <groupId>org.apache.maven.plugins</groupId>
    <artifactId>maven-failsafe-plugin</artifactId>
    <version>2.19.1</version>
    <executions>
        <execution>
            <goals>
                <goal>integration-test</goal>
                <goal>verify</goal>
            </goals>
            <configuration>
                <skipTests>${skip.tests}</skipTests>
                <argLine>${argLine} -Duser.timezone=UTC -Xms256m -Xmx256m</argLine>
                <includes>
                    <includes>**/*Test*</includes>
                </includes>
            </configuration>
        </execution>
    </executions>
</plugin>

また、PetriKainulainensのブログ投稿「JaCoCoMavenプラグインを使用したユニットテストと統合テストのコードカバレッジレポートの作成」は、JaCoCoのセットアップ側にとって価値があることがわかりました。

于 2016-06-17T00:04:39.893 に答える
9

これを達成する方法があります。魔法は、結合されたjacoco.execファイルを作成することです。そして、Maven 3.3.1を使用すると、これを取得する簡単な方法があります。ここに私のプロフィール:

<profile>
    <id>runSonar</id>
    <activation>
        <property>
            <name>runSonar</name>
            <value>true</value>
        </property>
    </activation>
    <properties>
        <sonar.language>java</sonar.language>
        <sonar.host.url>http://sonar.url</sonar.host.url>
        <sonar.login>tokenX</sonar.login>
        <sonar.jacoco.reportMissing.force.zero>true</sonar.jacoco.reportMissing.force.zero>
        <sonar.jacoco.reportPath>${jacoco.destFile}</sonar.jacoco.reportPath>
        <jacoco.destFile>${maven.multiModuleProjectDirectory}/target/jacoco_analysis/jacoco.exec</jacoco.destFile>
    </properties>
    <build>
        <plugins>
            <plugin>
                <groupId>org.jacoco</groupId>
                <artifactId>jacoco-maven-plugin</artifactId>
                <executions>
                    <execution>
                        <id>default-prepare-agent</id>
                        <goals>
                            <goal>prepare-agent</goal>
                        </goals>
                        <configuration>
                            <append>true</append>
                            <destFile>${jacoco.destFile}</destFile>
                        </configuration>
                    </execution>
                </executions>
            </plugin>
        </plugins>
        <pluginManagement>
            <plugins>
                <plugin>
                    <groupId>org.sonarsource.scanner.maven</groupId>
                    <artifactId>sonar-maven-plugin</artifactId>
                    <version>3.2</version>
                </plugin>
                <plugin>
                    <groupId>org.jacoco</groupId>
                    <artifactId>jacoco-maven-plugin</artifactId>
                    <version>0.7.8</version>
                </plugin>
            </plugins>
        </pluginManagement>
    </build>
</profile>

このプロファイルを親pomに追加して電話mvn clean install sonar:sonar -DrunSonarをかけると、完全なカバレッジが得られます。

ここでの魔法はですmaven.multiModuleProjectDirectory。このフォルダーは、常にMavenビルドを開始したフォルダーです。

于 2017-02-02T16:33:54.150 に答える
6

親レベルのpomで使用する構成で、ユニットと統合のテストフェーズが別々になっています。

親POMプロパティで次のプロパティを構成します

    <maven.surefire.report.plugin>2.19.1</maven.surefire.report.plugin>
    <jacoco.plugin.version>0.7.6.201602180812</jacoco.plugin.version>
    <jacoco.check.lineRatio>0.52</jacoco.check.lineRatio>
    <jacoco.check.branchRatio>0.40</jacoco.check.branchRatio>
    <jacoco.check.complexityMax>15</jacoco.check.complexityMax>
    <jacoco.skip>false</jacoco.skip>
    <jacoco.excludePattern/>
    <jacoco.destfile>${project.basedir}/../target/coverage-reports/jacoco.exec</jacoco.destfile>

    <sonar.language>java</sonar.language>
    <sonar.exclusions>**/generated-sources/**/*</sonar.exclusions>
    <sonar.core.codeCoveragePlugin>jacoco</sonar.core.codeCoveragePlugin>
    <sonar.coverage.exclusions>${jacoco.excludePattern}</sonar.coverage.exclusions>
    <sonar.dynamicAnalysis>reuseReports</sonar.dynamicAnalysis>
    <sonar.jacoco.reportPath>${project.basedir}/../target/coverage-reports</sonar.jacoco.reportPath>

    <skip.surefire.tests>${skipTests}</skip.surefire.tests>
    <skip.failsafe.tests>${skipTests}</skip.failsafe.tests>

プラグイン定義をプラグイン管理下に置きます。

確実な(surefireArgLine)引数とfailsafe(failsafeArgLine)引数のプロパティを定義して、jacocoが各テストで実行するようにjavaagentを構成できるようにすることに注意してください。

pluginManagementの下

  <build>
     <pluginManagment>
        <plugins>
            <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-compiler-plugin</artifactId>
                <version>3.1</version>
                <configuration>
                    <fork>true</fork>
                    <meminitial>1024m</meminitial>
                    <maxmem>1024m</maxmem>
                    <compilerArgument>-g</compilerArgument>
                    <source>${maven.compiler.source}</source>
                    <target>${maven.compiler.target}</target>
                    <encoding>${project.build.sourceEncoding}</encoding>
                </configuration>
            </plugin>

            <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-surefire-plugin</artifactId>
                <version>2.19.1</version>
                <configuration>
                    <forkCount>4</forkCount>
                    <reuseForks>false</reuseForks>
                    <argLine>-Xmx2048m ${surefireArgLine}</argLine>
                    <includes>
                        <include>**/*Test.java</include>
                    </includes>
                    <excludes>
                        <exclude>**/*IT.java</exclude>
                    </excludes>
                    <skip>${skip.surefire.tests}</skip>
                </configuration>
            </plugin>
            <plugin>
                <!-- For integration test separation -->
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-failsafe-plugin</artifactId>
                <version>2.19.1</version>
                <dependencies>
                    <dependency>
                        <groupId>org.apache.maven.surefire</groupId>
                        <artifactId>surefire-junit47</artifactId>
                        <version>2.19.1</version>
                    </dependency>
                </dependencies>
                <configuration>
                    <forkCount>4</forkCount>
                    <reuseForks>false</reuseForks>
                    <argLine>${failsafeArgLine}</argLine>
                    <includes>
                        <include>**/*IT.java</include>
                    </includes>
                    <skip>${skip.failsafe.tests}</skip>
                </configuration>
                <executions>
                    <execution>
                        <id>integration-test</id>
                        <goals>
                            <goal>integration-test</goal>
                        </goals>
                    </execution>
                    <execution>
                        <id>verify</id>
                        <goals>
                            <goal>verify</goal>
                        </goals>
                    </execution>
                </executions>
            </plugin>

            <plugin>
                <!-- Code Coverage -->
                <groupId>org.jacoco</groupId>
                <artifactId>jacoco-maven-plugin</artifactId>
                <version>${jacoco.plugin.version}</version>
                <configuration>
                    <haltOnFailure>true</haltOnFailure>
                    <excludes>
                        <exclude>**/*.mar</exclude>
                        <exclude>${jacoco.excludePattern}</exclude>
                    </excludes>
                    <rules>
                        <rule>
                            <element>BUNDLE</element>
                            <limits>
                                <limit>
                                    <counter>LINE</counter>
                                    <value>COVEREDRATIO</value>
                                    <minimum>${jacoco.check.lineRatio}</minimum>
                                </limit>
                                <limit>
                                    <counter>BRANCH</counter>
                                    <value>COVEREDRATIO</value>
                                    <minimum>${jacoco.check.branchRatio}</minimum>
                                </limit>
                            </limits>
                        </rule>
                        <rule>
                            <element>METHOD</element>
                            <limits>
                                <limit>
                                    <counter>COMPLEXITY</counter>
                                    <value>TOTALCOUNT</value>
                                    <maximum>${jacoco.check.complexityMax}</maximum>
                                </limit>
                            </limits>
                        </rule>
                    </rules>
                </configuration>
                <executions>
                    <execution>
                        <id>pre-unit-test</id>
                        <goals>
                            <goal>prepare-agent</goal>
                        </goals>
                        <configuration>
                            <destFile>${jacoco.destfile}</destFile>
                            <append>true</append>
                            <propertyName>surefireArgLine</propertyName>
                        </configuration>
                    </execution>
                    <execution>
                        <id>post-unit-test</id>
                        <phase>test</phase>
                        <goals>
                            <goal>report</goal>
                        </goals>
                        <configuration>
                            <dataFile>${jacoco.destfile}</dataFile>
                            <outputDirectory>${sonar.jacoco.reportPath}</outputDirectory>
                            <skip>${skip.surefire.tests}</skip>
                        </configuration>
                    </execution>
                    <execution>
                        <id>pre-integration-test</id>
                        <phase>pre-integration-test</phase>
                        <goals>
                            <goal>prepare-agent-integration</goal>
                        </goals>
                        <configuration>
                            <destFile>${jacoco.destfile}</destFile>
                            <append>true</append>
                            <propertyName>failsafeArgLine</propertyName>
                        </configuration>
                    </execution>
                    <execution>
                        <id>post-integration-test</id>
                        <phase>post-integration-test</phase>
                        <goals>
                            <goal>report-integration</goal>
                        </goals>
                        <configuration>
                            <dataFile>${jacoco.destfile}</dataFile>
                            <outputDirectory>${sonar.jacoco.reportPath}</outputDirectory>
                            <skip>${skip.failsafe.tests}</skip>
                        </configuration>
                    </execution>
                    <!-- Disabled until such time as code quality stops this tripping
                    <execution>
                        <id>default-check</id>
                        <goals>
                            <goal>check</goal>
                        </goals>
                        <configuration>
                            <dataFile>${jacoco.destfile}</dataFile>
                        </configuration>
                    </execution>
                    -->
                </executions>
            </plugin>
            ...

そしてビルドセクションで

 <build>
     <plugins>
        <plugin>
            <groupId>org.apache.maven.plugins</groupId>
            <artifactId>maven-compiler-plugin</artifactId>
        </plugin>

        <plugin>
            <!-- for unit test execution -->
            <groupId>org.apache.maven.plugins</groupId>
            <artifactId>maven-surefire-plugin</artifactId>
        </plugin>
        <plugin>
            <!-- For integration test separation -->
            <groupId>org.apache.maven.plugins</groupId>
            <artifactId>maven-failsafe-plugin</artifactId>
        </plugin>
        <plugin>
            <!-- For code coverage -->
            <groupId>org.jacoco</groupId>
            <artifactId>jacoco-maven-plugin</artifactId>
        </plugin>
        ....

そして、レポートセクションで

    <reporting>
    <plugins>
        <plugin>
            <groupId>org.apache.maven.plugins</groupId>
            <artifactId>maven-surefire-report-plugin</artifactId>
            <version>${maven.surefire.report.plugin}</version>
            <configuration>
                <showSuccess>false</showSuccess>
                <alwaysGenerateFailsafeReport>true</alwaysGenerateFailsafeReport>
                <alwaysGenerateSurefireReport>true</alwaysGenerateSurefireReport>
                <aggregate>true</aggregate>
            </configuration>
        </plugin>
        <plugin>
            <groupId>org.jacoco</groupId>
            <artifactId>jacoco-maven-plugin</artifactId>
            <version>${jacoco.plugin.version}</version>
            <configuration>
                <excludes>
                    <exclude>**/*.mar</exclude>
                    <exclude>${jacoco.excludePattern}</exclude>
                </excludes>
            </configuration>
        </plugin>
     </plugins>
  </reporting>
于 2016-05-03T06:42:46.250 に答える
3

ソナーとしてsonar.jacoco.reportPathsonar.jacoco.itReportPathそしてsonar.jacoco.reportPathsすべてが非推奨になっているので、今すぐ使用する必要がありますsonar.coverage.jacoco.xmlReportPaths。これは、SonarとJacocoを使用してマルチモジュールMavenプロジェクトを構成する場合にも影響します。

@Lonzakが指摘したように、Sonar 0.7.7以降、Sonarsレポートの集約目標を使用できます。次の依存関係を親pomに入れるだけです。

<plugin>
    <groupId>org.jacoco</groupId>
    <artifactId>jacoco-maven-plugin</artifactId>
    <version>0.8.5</version>
    <executions>
        <execution>
            <id>report</id>
            <goals>
                <goal>report-aggregate</goal>
            </goals>
            <phase>verify</phase>
        </execution>
    </executions>
</plugin>

jacoco-maven-pluginの現在のバージョンはxml-reportsと互換性があるため、これにより、独自のターゲットフォルダー内のすべてのモジュールに対して、ファイルを含むsite/jacoco-aggregateフォルダーが作成されjacoco.xmlます。

Sonarにすべてのモジュールを結合させるには、次のコマンドを使用します。

mvn -Dsonar.coverage.jacoco.xmlReportPaths=full-path-to-module1/target/site/jacoco-aggregate/jacoco.xml,module2...,module3... clean verify sonar:sonar

maven-surefire-plugin答えを短く正確に保つために、との maven-failsafe-plugin依存関係については触れませんでした。他の構成なしでそれらを追加することができます:

<plugin>
    <groupId>org.apache.maven.plugins</groupId>
    <artifactId>maven-surefire-plugin</artifactId>
    <version>2.22.2</version>
</plugin>
<plugin>
    <groupId>org.apache.maven.plugins</groupId>
    <artifactId>maven-failsafe-plugin</artifactId>
    <version>2.22.2</version>
    <executions>
        <execution>
        <id>integration-test</id>
            <goals>
                <goal>integration-test</goal>
            </goals>
        </execution>
    </executions>
</plugin>
于 2019-11-28T07:13:35.430 に答える
2
    <sonar.language>java</sonar.language>
    <sonar.java.coveragePlugin>jacoco</sonar.java.coveragePlugin>
    <sonar.jacoco.reportPath>${user.dir}/target/jacoco.exec</sonar.jacoco.reportPath>
    <sonar.jacoco.itReportPath>${user.dir}/target/jacoco-it.exec</sonar.jacoco.itReportPath>
    <sonar.exclusions>
        file:**/target/generated-sources/**,
        file:**/target/generated-test-sources/**,
        file:**/target/test-classes/**,
        file:**/model/*.java,
        file:**/*Config.java,
        file:**/*App.java
    </sonar.exclusions>

            <plugin>
                <groupId>org.jacoco</groupId>
                <artifactId>jacoco-maven-plugin</artifactId>
                <version>0.7.9</version>
                <executions>
                    <execution>
                        <id>default-prepare-agent</id>
                        <goals>
                            <goal>prepare-agent</goal>
                        </goals>
                        <configuration>
                            <destFile>${sonar.jacoco.reportPath}</destFile>
                            <append>true</append>
                            <propertyName>surefire.argLine</propertyName>
                        </configuration>
                    </execution>
                    <execution>
                        <id>default-prepare-agent-integration</id>
                        <goals>
                            <goal>prepare-agent-integration</goal>
                        </goals>
                        <configuration>
                            <destFile>${sonar.jacoco.itReportPath}</destFile>
                            <append>true</append>
                            <propertyName>failsafe.argLine</propertyName>
                        </configuration>
                    </execution>
                    <execution>
                        <id>default-report</id>
                        <goals>
                            <goal>report</goal>
                        </goals>
                    </execution>
                    <execution>
                        <id>default-report-integration</id>
                        <goals>
                            <goal>report-integration</goal>
                        </goals>
                    </execution>
                </executions>
            </plugin>             
于 2018-03-28T10:53:55.007 に答える
1

Mavenでmergeというantタスクを呼び出して、すべてのカバレッジファイル(* .exec)を同じファイルにまとめることができます。

単体テストを実行する場合はフェーズprepare-packageを使用し、統合テストを実行する場合はpost-integration-testを使用します。

このサイトには、Mavenプロジェクトでjacocoantタスクを呼び出す方法の例があります

このマージされたファイルはソナーで使用できます。

于 2012-10-23T19:39:45.510 に答える
1

単体テストと統合テストを行うには、maven-surefire-pluginとmaven-failsafe-pluginを制限付きの包含/除外で使用できます。私はソナー/ジャココと連絡を取りながらCDIで遊んでいたので、このプロジェクトに行き着きました。

https://github.com/FibreFoX/cdi-sessionscoped-login/

多分それはあなたに少し役立つでしょう。私のpom.xmlでは、指定されたテストプラグインの構成セクションでargLine-optionを設定することにより、暗黙的に「-javaagent」を使用します。MAVENプロジェクトでANTを明示的に使用することは、私が試してみようとは思わないことです。私にとっては、2つの世界が非常に混ざり合っています。

私は単一モジュールのMavenプロジェクトしか持っていませんが、おそらくそれはあなたがあなたのプロジェクトを機能するように調整するのに役立つでしょう。

注:すべてのmavenプラグインがup2dateであるとは限らない場合があります。また、一部の問題は後のバージョンで修正される場合があります。

于 2013-02-20T12:51:49.850 に答える
1

このサンプルは私にとって非常にうまく機能します:

<plugin>
            <groupId>org.jacoco</groupId>
            <artifactId>jacoco-maven-plugin</artifactId>
            <version>0.8.2</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>
                        <!--<excludes>
                            <exclude>com.asimio.demo.rest</exclude>
                            <exclude>com.asimio.demo.service</exclude>
                        </excludes>-->
                        <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>**/*Test.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>
                <includes>
                    <include>**/*IT.java</include>
                </includes>
                <!--<excludes>
                    <exclude>**/*UT*.java</exclude>
                </excludes>-->
            </configuration>
            <executions>
                <execution>
                    <goals>
                        <goal>integration-test</goal>
                        <goal>verify</goal>
                    </goals>
                </execution>
            </executions>
        </plugin>
于 2019-10-04T13:02:26.830 に答える
0

Jacoco Wikiで述べられているように、新しいレポートモジュールを生成することもできます。

戦略:依存関係のあるモジュール:アグリゲータープロジェクトの問題は、追加の「レポート」モジュールで解決できます。マルチモジュールのMavenプロジェクトでは、実際のコンテンツを提供しないが、結合されたカバレッジレポートを作成する個別のモジュールが定義されます。結合されたレポートに含める必要があるすべてのモジュールへの依存関係を定義します。「レポート」モジュールは、依存関係の後に構築され、依存するプロジェクトのクラスファイルとソースファイルだけでなく、execファイルにもアクセスできます。この戦略は、現在のMavenアーキテクチャーで最も効果的に機能するようです。ユーザーの観点からは、そのような別個のモジュールがビルド定義を肥大化させると主張することができます。または、個別のモジュールに、execファイルまたはクラスファイルを消費する可能性のあるサブモジュールを含めることはできません。でも、

これは、モジュール化がいくつかの子モジュールを持つ1つの親よりも複雑な場合に特に役立ちます。

レポートpomは次のようになります。

 <dependencies>
    <dependency>
        <groupId>org.sonarqube</groupId>
        <artifactId>module1</artifactId>
        <version>1.0-SNAPSHOT</version>
    </dependency>
    <dependency>
        <groupId>org.sonarqube</groupId>
        <artifactId>module2</artifactId>
        <version>1.0-SNAPSHOT</version>
    </dependency>
</dependencies>

<build>
    <plugins>
        <plugin>
            <groupId>org.jacoco</groupId>
            <artifactId>jacoco-maven-plugin</artifactId>
            <executions>
                <execution>
                    <id>report</id>
                    <goals>
                        <goal>report-aggregate</goal>
                    </goals>
                    <phase>verify</phase>
                </execution>
            </executions>
        </plugin>
    </plugins>
</build>
于 2021-03-25T17:37:07.117 に答える