web-dev-qa-db-ja.com

SonarQubeが単体テストのカバレッジを取得していない

ソナーがjacoco分析レポートを取得する際に問題が発生しています。ただし、ジェンキンスはレポートを取得して結果を表示できます。私のプロジェクトはJenkinsによって構築されたMavenビルドです。 jacocoレポートは、maven(pomで構成)によって生成されます。ソナーは、Jenkinsプラグインを使用して実行されます。

これは私がSonarQubeで見るものです:

SonarQube Screen Capture

これはジェンキンスのプロジェクトについて見ることができるレポートです。

Jacoco report in Jenkins

Mavenプラグインの構成:

<plugin>
    <groupId>org.jacoco</groupId>
    <artifactId>jacoco-maven-plugin</artifactId>
    <version>0.6.4.201312101107</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>
      </execution>
    </executions>
</plugin>

Jenkins Sonarプラグインの構成 enter image description here

45
anton91

いくつかの重要なソナープロパティがありませんでした。ここに私のビルドの1つのサンプルを示します。

sonar.jdbc.dialect=mssql
sonar.projectKey=projectname
sonar.projectName=Project Name
sonar.projectVersion=1.0
sonar.sources=src
sonar.language=Java
sonar.binaries=build/classes
sonar.tests=junit
sonar.dynamicAnalysis=reuseReports
sonar.junit.reportsPath=build/test-reports
sonar.Java.coveragePlugin=jacoco
sonar.jacoco.reportPath=build/test-reports/jacoco.exec

Jenkinsコンソール出力のエラーは、コードカバレッジを機能させるのに非常に役立ちます。

クラスを持つディレクトリがないため、プロジェクトカバレッジは0%に設定されます。
Sonar.Binariesプロパティを正しく設定していないことを示します

テストごとのカバレッジに関する情報なし
Sonar.Testsプロパティを適切に設定していないことを示します

カバレッジ情報は収集されませんでした。おそらく、デバッグ情報をコンパイル済みクラスに含めるのを忘れていますか? sonar.binariesプロパティが正しく設定されたが、これらのファイルはデバッグモードでコンパイルされなかったことを示します。

62
Cole9350

https://github.com/SonarSource/sonar-examples/blob/master/projects/tycho/pom.xml に基づいて、次のPOMが機能します。

<properties>
    <sonar.core.codeCoveragePlugin>jacoco</sonar.core.codeCoveragePlugin>
    <sonar.dynamicAnalysis>reuseReports</sonar.dynamicAnalysis>
    <sonar.jacoco.reportPath>${project.basedir}/../target/jacoco.exec</sonar.jacoco.reportPath>
</properties>
<build>
    <plugins>
        <plugin>
            <groupId>org.jacoco</groupId>
            <artifactId>jacoco-maven-plugin</artifactId>
            <version>0.7.0.201403182114</version>
            <executions>
                <execution>
                    <goals>
                        <goal>prepare-agent</goal>
                    </goals>
                </execution>
            </executions>
            <configuration>
                <destFile>${sonar.jacoco.reportPath}</destFile>
            </configuration>
        </plugin>
    </plugins>
</build>
  • 宛先ファイルをレポートパスに設定すると、SonarがJaCoCoが生成するファイルを正確に読み取ることができます。
  • レポートパスは、プロジェクト間のカバレッジを考慮するために、プロジェクトのディレクトリの外にある必要があります(たとえば、テスト用に別のプロジェクトを使用するTychoの場合)。
  • reuseReports設定は、JaCoCoレポートファイルが読み取られる前に削除されないようにします! (4.3以降、 これはデフォルトです であり、非推奨です。)

それから私はただ走る

mvn clean install
mvn sonar:sonar
16
thSoft

SonarQube 6.7.2を使用したSonarダッシュボードでは、同様の問題があり、カバレッジが0.0%でユニットテストがカウントされません。Maven:3.5.2、Java:1.8、Jacoco:7.0/7.9/8.0、OSで動作します:Windows

ここでの単一モジュールプロジェクトとは異なり、Mavenマルチモジュールプロジェクトで正しいソリューションを見つけるために多くの苦労を見つけた後、個々のモジュールからjacocoレポートを選択して1つのレポートにマージするように言う必要があります。好む:

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

        <build>
            <pluginManagement>
                <plugins>
                    <plugin>
                        <groupId>org.Apache.maven.plugins</groupId>
                        <artifactId>maven-compiler-plugin</artifactId>
                        <configuration>
                            <source>1.5</source>
                            <target>1.5</target>
                        </configuration>
                    </plugin>

                    <plugin>
                        <groupId>org.sonarsource.scanner.maven</groupId>
                        <artifactId>sonar-maven-plugin</artifactId>
                        <version>3.4.0.905</version>
                    </plugin>

                    <plugin>
                        <groupId>org.jacoco</groupId>
                        <artifactId>jacoco-maven-plugin</artifactId>
                        <version>0.7.9</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>

                </plugins>
            </pluginManagement>
        </build>

私はjacoco-aggregateのような他のオプションをいくつか試しましたが、それを親pomに含めることでサブモジュールを作成しましたが、実際には何も動作しませんでした&これは簡単です。ログには<sonar.jacoco.reportPath>は廃止されていますが、それでもそのまま機能し、実行時に自動置換されるように見えるか、手動で<sonar.jacoco.reportPaths>または最新に更新できます。 cmdでセットアップを行った後、mvn clean installで開始し、次にmvn org.jacoco:jacoco-maven-plugin:prepare-agent install(プロジェクトのターゲットフォルダーでjacocoかどうかを確認します。 execが作成されます)&do mvn sonar:sonar、これは私が試みたものであり、他の最良の解決策が利用可能かどうかを教えてください。そうでない場合は、質問を投稿してください。

5
srinivasy

Jenkinsは、jenkins jacocoプラグインとmaven jacocoプラグインのバージョン互換性の問題であるため、カバレッジ結果を表示しません。私の側では、最新バージョンのmaven jacocoプラグインを使用して修正しました

<build>
   <pluginManagement>
     <plugins>
       <plugin>
         <groupId>org.jacoco</groupId>
         <artifactId>jacoco-maven-plugin</artifactId>
         <version>0.7.9</version>
       </plugin>
     <plugins>
   <pluginManagement>
<build>
2
TomateEtCarotte

私は同じ問題に直面しており、私の場合の課題はJacocoを正しく構成し、Sonarの適切なパラメーターを構成することでした。 SonarQubeがテスト結果とテストカバレッジを正しく表示するようになった方法を簡単に説明します。

プロジェクトでは、pomまたは親pomにJacocoプラグインが必要です(すでに入手済みです)。さらに、テスト結果を表示するために使用されるmaven-surefire-pluginが必要です。すべてのテストレポートは、mavenビルドを実行すると自動的に生成されます。難しい部分は、Sonarに適切なパラメーターを見つけることです。すべてのパラメーターが正規表現で機能するように見えるわけではないため、それらにコンマ区切りのリストを使用する必要があります(ドキュメントは、私の意見ではあまり良くありません)。私が使用したパラメーターのリストは次のとおりです(Bambooから使用しました。sonar.propertiesファイルを使用する場合は、「-D」を省略できます)。

-Dsonar.branch.target=master (in newer version of SQ I had to remove this, so that master branch is analyzed correctly; I used auto branch checkbox in bamboo instead)
-Dsonar.working.directory=./target/sonar
-Dsonar.Java.binaries=**/target/classes
-Dsonar.sources=./service-a/src,./service-b/src,./service-c/src,[..]
-Dsonar.exclusions=**/data/dto/**
-Dsonar.tests=.
-Dsonar.test.inclusions=**/*Test.Java [-> all your tests have to end with "Test"]
-Dsonar.junit.reportPaths=./service-a/target/surefire-reports,./service-b/target/surefire-reports,
./service-c/target/surefire-reports,[..]
-Dsonar.jacoco.reportPaths=./service-a/target/jacoco.exec,./service-b/target/jacoco.exec,
./service-c/target/jacoco.exec,[..]
-Dsonar.projectVersion=${bamboo.buildNumber}
-Dsonar.coverage.exclusions=**/src/test/**,**/common/**
-Dsonar.cpd.exclusions=**/*Dto.Java,**/*Entity.Java,**/common/**

プロジェクトでLombokを使用している場合は、正しいコードカバレッジを取得するためにlombok.configファイルも必要です。 lombok.configファイルはプロジェクトのルートディレクトリにあり、次のコンテンツが含まれています。

config.stopBubbling = true
lombok.addLombokGeneratedAnnotation = true
1
Max

Sunfireおよびjacocoプラグインをpom.xmlに含め、以下に示すようにmavenコマンドを実行します。

mvn jacoco:prepare-agent jacoco:report sonar:sonar

<properties>
    <surefire.version>2.17</surefire.version>
    <jacoco.version>0.7.2.201409121644</jacoco.version>
<plugin>
            <groupId>org.Apache.maven.plugins</groupId>
            <artifactId>maven-surefire-plugin</artifactId>
            <version>${surefire.version}</version>
        </plugin> 

        <plugin>
            <groupId>org.jacoco</groupId>
            <artifactId>jacoco-maven-plugin</artifactId>
            <version>${jacoco.version}</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>
            </executions>
        </plugin>
    </plugins>
0
Raghav Mo