34

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

4

4 に答える 4

50

Paul の答えは正しくありません。少なくとも私はそう思います (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. 条件カバレッジには別のテストが必要です:

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

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

少なくとも私はこのように解釈しました。誰かがまだ興味を持っているなら:)

編集:最近見つけたほとんどのソースでは、決定/分岐カバレッジの用語は同等であり、決定カバレッジとして説明した用語は実際には条件カバレッジであるため、回答の更新です。

于 2015-08-25T09:16:21.820 に答える
40

テストが完全な分岐カバレッジを持っている場合、完全なステートメント カバレッジもあると言えますが、その逆ではありません。

100% の支店カバレッジ => 100% のステートメント カバレッジ

100% のステートメント カバレッジは、100% のブランチ カバレッジを意味するものではありません

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

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

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

ここに画像の説明を入力

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

于 2017-12-13T01:19:03.217 に答える
3

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

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%のカバレッジを達成することは困難です。

于 2013-02-06T09:52:02.077 に答える