web-dev-qa-db-ja.com

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

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

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

85
Gillespie59

行カバレッジは、取得したステートメントの数を測定します(ステートメントは通常、コメント、条件などを含まないコード行です)。ブランチカバレッジは、各条件(if、while、for)に対してtrueおよびfalseブランチを使用したかどうかをチェックします。条件分岐の2倍のブランチがあります。

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

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

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

137
Kane

簡単な例としてこのコードを取り上げます。

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

テストでcondがtrueであるだけを実行し、elseブランチを実行しない場合:

  • 5行中4行が対象
  • 2つのブランチのうち1つが対象

また、Cobertura report 自体は、列ヘッダーがクリックされたときにニースのポップアップヘルプツールチップを導入します。

Line Coverage-このテスト実行で実行された行の割合。

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

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

LineCoverageとBranchCoverageの両方で100%のカバレッジを取得するには、ブランチ1とブランチ2のすべての回線に対処する必要があります。

あなたが他の何かを見逃した場合、あなたはブランチカバレッジの半分を得るでしょう。 ifとelseの両方で#行の行を逃した場合、BranchCoverageは100%になりますが、100%ではありません。

お役に立てれば。