2016-11-11 68 views
0

Jacocoエージェントで単体テストを実行すると、私のローカルJacocoレポートとSonarQubeのカバレッジには若干の相違があります。これはネストされたクラスを含むファイルにのみ影響を与えているようです。ローカルで生成されたレポートには、外部クラスおよびすべての内部クラスのカバレッジ情報が含まれていますが、SonarQubeのカバレッジデータには内部クラスのみが含まれています。SonarQubeのカバレッジに、Jacocoレポートの対象行がありません

たとえば、Foo.javaには外部クラスFooと内部クラスBarおよびBazが含まれています。

私のローカルレポートでは、Fooクラスで26%、Foo.Barクラスで46%、Foo.Bazクラスで0%の命令範囲を示しています。 Foo.javaの全体の命令カバレッジは30%です。 SonarQubeカバレッジ・ページは、Foo.javaのラインカバレッジを15%にします。私はラインカバレッジがインストラクションのカバレッジと等しくないことを理解していますが、私はその数値が近いと予想します。さらに調べると、SonarQubeのFoo.javaのファイルベースのカバレッジビューでは、外部クラスFooのすべての行が「単体テストで覆われていません」とマークされており、マークされている唯一の行はFooのものです私が期待したバー。この差は、JacocoのレポートとSonarQubeとの間の約15%のギャップを構成する。ローカルのスキャナログまたはサーバー分析ログには例外がありません。

私はJaCoCo 0.7.7.201606060606、Javaバージョン1.8.0_73、およびsonar-scanner 2.8をローカルで実行しています。サーバーはJavaバージョン1.8.0_66-b17、SonarQubeバージョン5.6.3、SonarQube Javaプラグインバージョン4.2.1.6971を実行しています。

私はどんな提案もありがとうと思います。

答えて

0

ユニットテストの実行に使用されたクラスファイル(ローカルレポートを生成するためにも使用される)は、sonar-scannerで使用されるものとは異なります。これは、コンパイル、単体テスト、およびローカルレポートの生成後に、クラスファイルに対してbndが実行され、クラスファイルが@Componentクラスに書き換えられるためです。 sonar-scannerはbndの後に実行されるため、異なるクラスファイルが表示されます。私の問題は内部クラスと外部クラスではなく、むしろOSGiコンポーネントと非コンポーネントです。クラスFooはOSGiコンポーネントであり、内部クラスはOSGiコンポーネントではありません。

Jacocoエージェントで使用されているのと同じクラスファイルでスキャナを実行すると、SonarQubeによって報告されたFoo.javaのラインカバレッジは27%(15%ではなく)で、ファイルベースのカバレッジビューはローカル報告する。

1

「指示」と他のものとの比較は、リンゴとオレンジの比較に似ています。それらは同じことを表すものではありません。単一行のコードには通常、多くのバイトコード命令が含まれています。たとえば、10行に100命令、20命令で1行をカバーすると、命令が80%失われていますが、行が欠落している場合など、「命令範囲」が「ライン範囲」に近いと期待するのは間違いです。 90%。

JaCoCoが提供するカウンタについては、http://www.eclemma.org/jacoco/trunk/doc/counters.htmlを参照してください。 SonarQubeが示すものについてはhttp://docs.sonarqube.org/display/SONAR/Metric+Definitionsです。指示内容はJaCoCoでのみ表示されます。

SonarQubeで表示され、JaCoCoで表示されたFoo.javaのカバーラインの違いが分かりますか?その場合は、スクリーンショットを提供してください。

+0

ポインタとフィードバックに感謝します!私はラインと指示のカバレッジが異なると予想されることを理解しています。より大きな懸念は、SonarQubeとJaCoCoのFoo.javaのカバーラインの違いでした。私の答えで説明するように、彼らは分析を実行するために異なるクラスファイルを使用していたことが判明しました。お邪魔して申し訳ありません! –

関連する問題