ラインとブランチのカバレッジの違い


93

私はプロジェクトの1つにCobertura Mavenプラグインを使用しています。しかし、私は生成されたレポートについて質問があります:

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

回答:


168

行カバレッジは、実行したステートメントの数を測定します(ステートメントは通常、コメント、条件などを含まないコード行です)。ブランチカバレッジは、条件付き(if、while、for)ごとにtrueとfalseのブランチをとったかどうかをチェックします。分岐は条件付きの2倍になります。

なんで気にするの?例を考えてみましょう:

public int getNameLength(boolean isCoolUser) {
    User user = null;
    if (isCoolUser) {
        user = new John(); 
    }
    return user.getName().length(); 
}

このメソッドをにisCoolUser設定して呼び出すとtrue、ステートメントのカバレッジが100%になります。いいですね?いいえ、で呼び出した場合、nullポインタが存在しますfalse。ただし、最初のケースでは50%のブランチカバレッジがあるため、テスト(および多くの場合、コード)に欠けているものがあることがわかります。


8
正解です。行カバレッジが良いコードを持っているという誤った感覚を与えるときを示しています!
MAGx2 2014年

ラインカバレッジまたはブランチカバレッジが原因で発生する可能性のあるバグは何ですか?
Emna Ayadi

61

このコードを簡単な例として考えてみましょう:

if(cond) {
    line1();
    line2();
    line3();
    line4();
} else {
    line5();
}

あなたのテストcondが真実のみを行使し、elseあなたが持っているブランチを決して実行しない場合:

  • 5行のうち4行をカバー
  • 2本の枝のうち1本をカバー

また、Cobertura レポート自体には、列ヘッダーがクリックされたときにいくつかの素晴らしいポップアップヘルプツールチップが導入されています。

行カバレッジ -このテスト実行によって実行された行の割合。

ブランチカバレッジ -このテスト実行で実行されたブランチの割合。


私はこの答えを書きたいと思っていましたが、あなたは私を(何年も)先制しました。明確な答え。ありがとう。
Soundararajan

3
if(cond){
    //branch 1
}else{  
    //branch 2
}

LineCoverageとBranchCoverageの両方を100%カバーするには、すべての回線をブランチ1とブランチ2にアドレス指定する必要があります。

他で何かを見逃した場合、ブランチのカバレッジの半分を取得します。ifとelseの両方で#の行で何かを見逃した場合、100%ではなく100%のBranchCoverageが得られます。

お役に立てれば。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.