(文献でも)パスと条件カバレッジ(ブランチまたはエッジではない)に関連する2つの矛盾する意見に遭遇しました。パスカバレッジは条件カバレッジよりも強いと言う人もいれば、反対の人もいます。
このようなコードを持っている:
If(X<0 OR X>100)
DoStuff();
パスカバレッジ-パスをカバーするには1つのテストケースが必要です。 X = -1の場合、2番目の式はテストされず、起こり得るバグが見落とされます。
条件カバレッジ-両方の条件をテストするには、テストケースX = -1およびX = 100が必要です。
何かが欠けているのですか、それとも条件カバレッジがパスカバレッジよりも本当に強いですか?
条件カバレッジ(ISTQB):
次のカバレッジレベルは条件カバレッジと呼ばれます。基本的な概念は、最終的にTRUEまたはFALSEと評価される複雑な式によって決定が行われる場合、各アトミック条件が両方の方法でテストされることを確認することです。 。
CMMIへの実用的な洞察
条件カバレッジは、各ブール部分式の真と偽の結果を測定します。
参照:
ソフトウェアテスト:Srinivasan Desikan、Gopalaswamy Rameshの原則と実践:61ページ
条件カバレッジはパスカバレッジよりはるかに強力な基準であり、パスカバレッジはステートメントカバレッジよりはるかに強力な基準です。
どちらも数学的な意味で「より強力」ではありません。
IF(A&&B)
とペアA=TRUE, B=FALSE
およびA=FALSE, B=TRUE
)。これは、どちらかが何らかの形で「より強い」という主張は無効になることを意味します。
条件カバレッジを 変更された条件/決定カバレッジ に「アップグレード」すると、答えは「はい」になります。 MC/DCは常にパスをカバーすることを意味しますが、パスをカバーすることは、MC/DCはもちろんのこと、状態をカバーすることを必ずしも意味するとは限りません。
ただし、これは100%MC/DCが常にパスカバレッジよりも優れていることを意味しません。トレードオフは、より多くのテストを作成する必要があるため、100%パスカバレッジよりもはるかに急な「価格」になるということです。時々、もっともっと。これにより、テストスイートのメンテナンスが複雑になる可能性があります。
単純な条件( "null or empty"ソートの引数チェックなど)と複雑なビジネスでの条件/決定をカバーするステートメントをパスカバーすることによって、条件/決定のカバーとパスカバレッジのバランスを保つことは良い考えだと思います論理。
パスカバレッジは、ブランチカバレッジよりも完全に完全です。
特定のモジュールの循環的複雑度Mの2つのプロパティ:
- Mは、完全なブランチカバレッジを達成するために必要なテストケースの数の上限です。
- Mは、制御フローグラフ(CFG)を通るパス数の下限です。
if( c1() )
f1();
else
f2();
if( c2() )
f3();
else
f4();
この例では、完全なブランチカバレッジを達成するには2つのテストケースで十分ですが、完全なパスカバレッジには4つのテストケースが必要です。プログラムの循環的複雑度は3です(プログラムの強連結グラフには9つのエッジ、7つのノード、1つの連結成分が含まれているため)(9-7 + 1)。
しかし、もう少し下で述べたように(強調のために太字にしています):
残念ながら、プログラムを介してすべての可能なパスをテストすることは必ずしも実用的ではありません。上記の例を考えると、追加のif-then-elseステートメントが追加、可能なパスの数は2倍になります。プログラムがこのように成長するにつれ、すべてのパスをテストすることが実用的ではなくなったポイントにすぐに到達します。
[〜#〜]編集[〜#〜]
わかりました、コメントの@ user970696がどこから来ているのかわかります。私が正しく理解している場合、答えはstill厳密にパスカバレッジです。分岐カバレッジとは異なる「特別な」結果が得られるのは、短絡のために実行される場合とされない場合がある条件付きで呼び出される関数がある場合のみです。
しかし、それが起こるとき、彼らは道の一部として数えます。
たとえば、次のようにします。
if (a() && b()):
foo()
else:
bar()
ただし、前述のように2番目のif
ステートメントを追加すると、パスの数は増加しますが、個々のif
ステートメントは同じ複雑さのままです。
条件カバレッジとパスカバレッジの主な違いは、条件カバレッジは一部の制御構造に対してローカルである(if、while、for、...)のに対し、パスカバレッジはプログラム全体にグローバルであり、したがってブランチのすべての可能な組み合わせ(条件)。
ローカルの観点では、状態カバレッジはより強力です。
グローバルな観点では、パスのカバレッジはより強力です。非常に強いため、通常は達成できません。
パスカバレッジには、基本的に、記述したプログラム内のステートメントのカバレッジが含まれます。つまり、プログラムに次のコード行が含まれている場合は、1。if(条件1)2.次に関数を呼び出します。 3.そうでなければ4.その関数を呼び出す。 5.別の関数を呼び出します。したがって、コードを注意深く観察すると、合計5つのステートメントがあり、それらの2つのステートメントは実際には条件であることがわかります。したがって、パスカバレッジは最初のパスから始まり、条件が真であるかどうかをチェックします。そうでない場合は、else部分に切り替えてステートメント4と5を実行します。したがって、カバーされるステートメントの数はすべて、1、3、4、5です。一方、条件カバレッジでは、ifとelseの部分は5番目のステートメントだけではなく、ステートメント1と3のみがチェックされます。ただし、条件のみが存在する場合、ここではパスカバレッジ=ステートメントカバレッジにも注意してください。
すでに述べたように、どちらも
次のことを証明する非常に単純な例があります。
(1):パスカバレッジは条件カバレッジを意味しません:
if (A and B) then
some elementary statement(s)
end if
パスカバレッジは以下によって提供されます:
A = false
A = true and B = true
しかし:条件カバレッジの場合、A = true and B = false
も必要です。
(2):条件カバレッジはパスカバレッジを意味しません:
if (A)
some elementary statement(s)
end if
if (B)
some (other) elementary statement(s)
end
条件カバレッジは以下によって提供されます:
A = false and B = false
A = true and B = true
But:パスカバレッジの場合、A = false and B = true
およびA = true and B = false
が必要です。