jacocoブランチカバレッジとソナー条件カバレッジの違いは何ですか?

アルバン:

SonarQubeスキャナー(バージョン3.1.0.1141)でJavaコードを分析しようとしています。

  • SonarQubeバージョン:5.6.6
  • Sonar Javaプラグインのバージョン:4.12.0.11033
  • jacocoバージョン:0.8.0

sonar-project.propertiesにこれらのプロパティを入力しました:

# Sonar sources and metadata
sonar.language=java
sonar.sources=src/main
sonar.java.source=1.8
sonar.sourceEncoding=UTF-8
sonar.java.binaries=target/classes
sonar.java.libraries=target/lib

sonar.tests=src/test
sonar.java.coveragePlugin=jacoco
sonar.junit.reportsPath=target/surefire-reports
sonar.surefire.reportsPath=target/surefire-reports

jacocoレポートは1つのクラスに対してこの結果を私に与えますが:

  • カバー84%
  • ブランチカバレッジ:71%
  • 見逃した:9
  • 複雑さ:24
  • 逃した:6
  • ライン:69
  • 逃した:0
  • 方法:8
  • 逃した:0
  • クラス:1

SonarQubeは測定値を表示します。

  • 条件カバレッジ62.5%
  • カバレッジ81.7%
  • ラインカバレッジ92.8%
  • 69をカバーする行
  • 全体的な状態の範囲62.5%
  • 全体的なカバー率81.7%
  • ライン全体のカバー率92.8%
  • 覆われていないブランチ全体15
  • カバーされていない全体的なライン5
  • 覆われていない枝15
  • 覆われていないライン5

ソナーメトリック定義ページよると、条件カバレッジのソナーキーはbranch_coverageなので、条件とブランチカバレッジは同じものだと思いました。

異なる結果を説明する方法は?

ジェラルド・ミュッケ:

あなたがいくつかの構成を持っていると仮定して

if(a == 1 && b == 2) {
  //do this
} else {
  //do that
}

あなたは2つのブランチを持っています

  • これを行う
  • それを行う

そして二つの条件

  • a == 1(cond1)
  • b == 2(cond2)

2つのテストケースがある場合

  • テスト(a == 1、b == 2)
  • テスト(a == 2、b == 2)

(cond1 && cond2)の組み合わせ条件がfalseまたはtrueであるため、両方のブランチをカバーしています。

しかし、cond1を完全にカバーし、cond2の半分のみをカバーします。つまり、条件カバー率は75%です。

完全な状態のカバレッジを取得するには、追加のテストが必要です

  • テスト(a == 1、b == 1)

編集する

どちらのツールも、ラインごとのブランチ情報を使用してカバレッジを計算します。一部のコードでテストを実行し、「カバーする条件」(Sonarqube)の数は、Jacocoレポートの「ブランチ」の総数と一致しますが、jacocoおよびSonarqube / sonar-javaの最新バージョンを使用しました。そのため、名前は別として、メジャーは同じである/同じである必要があります。

しかし、あなたが提供する数を考えると、あなたの分析一般には何か奇妙なようです。異なるのはパーセント値だけではなく、絶対値でもあります(Jacocoでカバーされていない9つのブランチとSonarqubeでカバーされていない15のブランチ)。

だから私はあなたが使っているバージョンをチェックしました-jacoco 0.8.0とjacoco 0.7.9を使うsonar-javaプラグインv4.11.0.11033。

Jacoco 0.8.0リリースノートを読む

レポートの作成中に、コンパイラによって生成されたさまざまなアーティファクトが除外されます。カバレッジが部分的または欠落しないようにするために、不必要な、時には不可能なトリックが必要になります。

  • メソッドvalueOfおよび列挙型の値(GitHub#491)。
  • 引数なしのプライベートな空のコンストラクター(GitHub#529)。
  • Lombok> = 1.16.14との統合を改善するために@ lombok.Generatedで注釈が付けられたメソッド。Rüdigerzu Dohna(@ t1)(GitHub#513)による初期の分析と貢献。
  • @ groovy.transform.Generatedでアノテーションが付けられたメソッドは、Groovy> = 2.5.0との統合を改善します。アノテーションをGroovy(GitHub#610)に追加してくれたAndres Almiray(@aalmiray)に感謝します。
  • 同期ブロックのバイトコードの一部(GitHub#501)。
  • try-with-resourcesステートメントのバイトコードの一部(GitHub#500)。
  • finallyブロックのバイトコードの一部(GitHub#604)。
  • java.lang.String値のスイッチステートメントのバイトコードの一部(GitHub>#596)。

したがって、ここでの私の最良の推測は、Jacoco 0.8.0によって生成されたレポートが、前述の生成されたアーティファクトの一部をフィルターで除去して、ブランチの総数に効果的に減少したことです。ただし、Sonar-JavaはJacoco 0.7.9を使用します。これは生成されたアーティファクトをフィルターで除外しないため、数値は高くなります(カバレッジは低くなります)。

たぶん、jacocoバージョンを0.7.9にダウングレードするか、sonar-javaプラグインをアップグレードする必要があります。

この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。

侵害の場合は、連絡してください[email protected]

編集
0

コメントを追加

0

関連記事

分類Dev

ブロックカバレッジとブランチカバレッジの違いは何ですか?

分類Dev

JaCoCoブランチカバレッジはリソースで試してください

分類Dev

リソースを試すための8つのブランチ-jacocoのカバレッジは可能ですか?

分類Dev

Jestがこのコードで75%のブランチカバレッジを示す原因は何ですか?

分類Dev

100%のステートメントカバレッジなしで100%のブランチカバレッジを持つことは可能ですか?

分類Dev

PHPUnitカバレッジ:「addUncoveredFilesFromWhitelist」オプションと「processUncoveredFilesFromWhitelist」オプションの違いは何ですか?

分類Dev

コマンドラインからのJunitとJacocoでのJavaカバレッジは0%です

分類Dev

ソナー偽の全体的なカバレッジ(jacoco)

分類Dev

ソナー偽の全体的なカバレッジ(jacoco)

分類Dev

if条件でfor-inループのjestのブランチカバレッジを増やす方法は?

分類Dev

ブランチカバレッジとアサートカバレッジ?

分類Dev

Jacocoはブランチのカバレッジがありそうもないことに不満を漏らしています

分類Dev

論理和または(||)を使用したifステートメントのカバレッジをテストします-Javaの短絡を使用して、JaCoCoがカバーしてほしい4番目の条件は何ですか?

分類Dev

ソナーブランチ分析:カバレッジを計算して表示

分類Dev

コードカバレッジの部分的なヒットとは何ですか?

分類Dev

コードカバレッジ分析の3つの方法の違いは何ですか?

分類Dev

コードカバレッジレポートに、ライブラリがカバーされていないと表示されるのはなぜですか?

分類Dev

SonarはコードカバレッジにJacocoプラグインを使用していますか

分類Dev

マルチモジュールプロジェクトでソナーランナーとの統合カバレッジを使用できません

分類Dev

フラッターのグローバルポジションとローカルポジションの違いは何ですか?

分類Dev

Jacocoコードカバレッジ:存在しないStaticブロックは75%のカバレッジしか表示しません

分類Dev

Pesterを使用してすべてのブランチのコードカバレッジを取得するにはどうすればよいですか?

分類Dev

Android Gradleプラグイン0.10.0以降を使用してjacocoカバレッジレポートを取得するにはどうすればよいですか?

分類Dev

サーキットブレーカーとバルクヘッドパターンの違いは何ですか?

分類Dev

JaCoCo Jenkinsレポートにインストラクションカバレッジのみが表示されるのはなぜですか?

分類Dev

Gradle jacoco マルチプロジェクト。ターミナルですべてのプロジェクトのコードカバレッジを出力するにはどうすればよいですか?

分類Dev

Jacocoカバレッジからクラスを除外するにはどうすればよいですか?

分類Dev

Jacocoチェックとjacocoレポートの異なるカバレッジ率の値

分類Dev

ローカルのHerokuバージョンとHerokuSaaSバージョンの違いは何ですか?

Related 関連記事

  1. 1

    ブロックカバレッジとブランチカバレッジの違いは何ですか?

  2. 2

    JaCoCoブランチカバレッジはリソースで試してください

  3. 3

    リソースを試すための8つのブランチ-jacocoのカバレッジは可能ですか?

  4. 4

    Jestがこのコードで75%のブランチカバレッジを示す原因は何ですか?

  5. 5

    100%のステートメントカバレッジなしで100%のブランチカバレッジを持つことは可能ですか?

  6. 6

    PHPUnitカバレッジ:「addUncoveredFilesFromWhitelist」オプションと「processUncoveredFilesFromWhitelist」オプションの違いは何ですか?

  7. 7

    コマンドラインからのJunitとJacocoでのJavaカバレッジは0%です

  8. 8

    ソナー偽の全体的なカバレッジ(jacoco)

  9. 9

    ソナー偽の全体的なカバレッジ(jacoco)

  10. 10

    if条件でfor-inループのjestのブランチカバレッジを増やす方法は?

  11. 11

    ブランチカバレッジとアサートカバレッジ?

  12. 12

    Jacocoはブランチのカバレッジがありそうもないことに不満を漏らしています

  13. 13

    論理和または(||)を使用したifステートメントのカバレッジをテストします-Javaの短絡を使用して、JaCoCoがカバーしてほしい4番目の条件は何ですか?

  14. 14

    ソナーブランチ分析:カバレッジを計算して表示

  15. 15

    コードカバレッジの部分的なヒットとは何ですか?

  16. 16

    コードカバレッジ分析の3つの方法の違いは何ですか?

  17. 17

    コードカバレッジレポートに、ライブラリがカバーされていないと表示されるのはなぜですか?

  18. 18

    SonarはコードカバレッジにJacocoプラグインを使用していますか

  19. 19

    マルチモジュールプロジェクトでソナーランナーとの統合カバレッジを使用できません

  20. 20

    フラッターのグローバルポジションとローカルポジションの違いは何ですか?

  21. 21

    Jacocoコードカバレッジ:存在しないStaticブロックは75%のカバレッジしか表示しません

  22. 22

    Pesterを使用してすべてのブランチのコードカバレッジを取得するにはどうすればよいですか?

  23. 23

    Android Gradleプラグイン0.10.0以降を使用してjacocoカバレッジレポートを取得するにはどうすればよいですか?

  24. 24

    サーキットブレーカーとバルクヘッドパターンの違いは何ですか?

  25. 25

    JaCoCo Jenkinsレポートにインストラクションカバレッジのみが表示されるのはなぜですか?

  26. 26

    Gradle jacoco マルチプロジェクト。ターミナルですべてのプロジェクトのコードカバレッジを出力するにはどうすればよいですか?

  27. 27

    Jacocoカバレッジからクラスを除外するにはどうすればよいですか?

  28. 28

    Jacocoチェックとjacocoレポートの異なるカバレッジ率の値

  29. 29

    ローカルのHerokuバージョンとHerokuSaaSバージョンの違いは何ですか?

ホットタグ

アーカイブ