web-dev-qa-db-ja.com

ステートメントと意思決定カバレッジの違い

ステートメントカバレッジは、コード内のすべてのステートメントが少なくとも1回実行されることを保証すると言われています。
判定/ブランチカバレッジは、判定の各ブランチ/出力がテストされる、つまり、false/trueブランチの両方のすべてのステートメントが実行されることをテストすると言われています。
しかし、それは同じではありませんか?ステートメントカバレッジでは、すべてのステートメントを実行する必要があるため、可能なすべての方法を実行することによってのみ実行できると思います。私はここに何かが欠けていることを知っています。

24
John V

テストが完全なブランチカバレッジを持っている場合、完全なステートメントカバレッジも持っていると言えます

100%分岐カバレッジ=> 100%ステートメントカバレッジ

100%のステートメントカバレッジは、100%のブランチカバレッジを意味しません

理由は、すべてのステートメントの実行とは別にブランチカバレッジにあるため、テストがすべてのブランチを実行するかどうかも確認する必要があります。これは、制御フローブランチのすべてのエッジをカバーすると解釈できます。

if(a){
   if(b){
     bool statement1 = true;
   }
}

a = true、b = trueは、100%のステートメントカバレッジを提供しますが、ブランチカバレッジは提供しません。

enter image description here

ブランチカバレッジでは、すべてのエッジをカバーする必要があります。上記のred linesとして示されるステートメントカバレッジでは見逃していました。画像

15
murali krish

ポールの答えは正しくありません。少なくとも私はそう思う(ISTQBの定義による)。ステートメント、決定/ブランチ、および条件カバレッジにはかなりの違いがあります。他の回答のサンプルを使用しますが、少し修正したので、3つのテストカバレッジの例をすべて表示できます。ここに書かれたテストは、各タイプに対して100%のテスト範囲を提供します。

if(a || b)) {
    test1 = true;
}
else {
    if(c) {
      test2 = true
    }
}

ここに、これらのカバレッジの違いを完全に説明するif(a || b)とif(c)の2つのステートメントがあります。

  1. ステートメントカバレッジ各ステートメントを少なくとも1回テストする必要があるため、必要なテストは2つだけです。
    • a = true b = false-これにより、パスif(a || b)true-> test1 = true
    • a = false、b = false、c = true-これはパスを提供します:if(a || b)false-> else-> if(c)-> test2 = true。

このようにして、すべてのステートメントを実行しました。

  1. 分岐/決定カバレッジもう1つのテストが必要です:

    • a = false、b = false、c = false-ステートメントカバレッジで実行されなかった、そのステートメントからfalseブランチを実行している場合、その2番目につながります

    このようにして、すべてのブランチをテストしました。つまり、すべてのパスを調べました。

  2. 条件カバレッジ別のテストが必要:

    • a = false、b = true-最初のテストと同じパスを経由しますが、ORステートメント(a || b)の別の決定を実行してそれを実行します。

そのようにして、すべての条件をテストしました。つまり、すべてのパス(ブランチ)を通過し、各条件でトリガーしました-最初のテストではa = trueがトリガーされ、最後のテストでは最初の 'if'ステートメントが真でしたb = trueがトリガーしました。もちろん、誰かがa = trueとb = trueの場合もテストする必要があると主張することができますが、「または」がどのように機能するかを確認すると、それが必要ではなく、変数cが任意の値であることがわかりますこれらのテストでは評価されません。

少なくともこのように解釈しました。誰かがまだ興味があるなら:)

編集:最近の決定/ブランチカバレッジの用語は同等であり、決定カバレッジとして説明した用語は実際には条件カバレッジであることがわかったため、回答の更新です。

37
Faflok

次のようなステートメントがあります。

if(a || b || (c && d && !e)) {
    test1 = true;
} else {
    test2 = false;
}

コードカバレッジにtest1とtest2の両方の行がヒットしていると表示されている場合、ステートメントカバレッジがありますが、完全なブランチカバレッジを取得するには、aがtrueの場合、aがfalseの場合、bがtrueの場合、aおよびbがfalseの場合にテストする必要がありますしかし、cとdは真で、eは偽などです。

ブランチカバレッジは、ブランチの選択肢のあらゆる潜在的な組み合わせをカバーするため、100%のカバレッジを達成することは困難です。

4
Paul Rutland

いい質問ですね。私がよく使う説明は、else-branchのないif-statementには、目に見えない「空の」else-statementがまだあるということです。

  • 単純なステートメントカバレッジは、実際に存在するすべてのステートメントが実際に実行されると主張するだけです。

  • ブランチカバレッジは、見えないelseブランチでさえ実行されると主張しています。

同様の状況は、デフォルトケースのないswitch-statements、およびrepeat-untilループでも発生します。ブランチカバレッジでは、default-caseが実行され、repeat-untilが少なくとも2回実行される必要があります。

コード例:

if (passwordEnteredOK()) {
    enterSystem();
} 
/* Invisible else part 
else {
  // do nothing
}
*/

ステートメントカバレッジでは、正しいパスワードでシステムを使用できることを確認するだけです。ブランチカバレッジでは、間違ったパスワードでnotシステムに入ることもテストします。

3
avandeursen