C0/C1/C2カバレッジの違い
テストカバレッジ(網羅率)の種類(C0/C1/C2)まとめ
カバレッジとは、検査網羅率(テストカバレージ) のことを指し、どれだけテストしたかの指標を表します。
ソフトウェアテストにおいて、カバレッジ(網羅率)を測定/分析することは、ソフトウェアの品質向上に非常に大きな意味があります。
コードのカバレッジを測定し、テストが実施されていないコード(通らないプログラム)を確認することにより、テストの妥当性を向上させることができます。
一般的には、単体テストでコードのカバレッジを測定し、テストの品質を測ります。
C++testなどの静的解析ツールも出ています。
その指標の中に、網羅率ごとのC0/C1/C2カバレッジがあります。
- C0:命令網羅(ステートメント・カバレッジ)
- C1:分岐網羅(ブランチ・カバレッジ)
- C2:条件網羅(コンディション・カバレッジ)
文章にすると上記のとおりなのですが、毎回忘れてしまいがちなので、コードと照らし合わせてまとめておきます。
解説
概念
int abs(int x) {
if (x < 0) {
x = -x;
}
return x;
}
C0:命令網羅(ステートメント・カバレッジ)
すべての命令を実行すればC0は100%となります。
言い方を変えると、通っていない処理がなくなればC0は100%となります。
上記のコードでは、if文の中に入ればよいことになります。
したがって上記のabs関数では、例えば x = -1のテストケース1つを作ればC0は網羅できることになります。
C1:分岐網羅(ブランチ・カバレッジ)
判定条件網羅(ディシジョン・カバレッジ)とも言われます。
すべての分岐におけるすべての方向を実行すればC1は100%となります。
したがって上記のabs関数では、例えば x = -1 と x = 0 を用いたテストケース2つあれば、分岐網羅基準にしたがってテストできたことになる。
if文に対するelse文の処理があると想定すると分かりやすいかもしれません。その場合、C0を網羅するためにもテストケースは2つ必要になります。
C2:条件網羅(コンディション・カバレッジ)
条件式(AND/ORなど複合条件であれば各々の個別条件)において、すべての可能な結果を少なくとも1回は通るように実行すれば、C2は100%となります。
注目点は条件式になるため、C2カバレッジが100%になったとしても、C0、C1が100%になるとは限りません。
if (x > 0 || y > 0) { ... }
例えば上記のような判定条件の場合、x > 0の真為、y > 0の真為の両方を考慮する必要があります。
したがって以下の4通りが必要になり、テストケースは4つ必要になります。
- x > 0、y > 0
- x > 0、y <= 0
- x <= 0、 y > 0
- x <= 0、y <= 0
ただし上記の場合、x > 0 で最初の判定が真の時点で、y > 0は判定が不要になるため、実質的には以下のテストケース3つでよいことになります。
- x > 0、y > 0(または、
x > 0
、y <= 0
) - x <= 0、 y > 0
- x <= 0、y <= 0
応用
少し複雑化したコード例で考えてみます。
void function(...) {
if ( 条件a1 || 条件a2 ) { // 判定条件A
命令1
} else {
命令2
}
if ( 条件b ) { // 判定条件B
命令3
}
}
C0:命令網羅(ステートメント・カバレッジ)
上記コードでは、命令1、命令2、命令3を少なくとも1度通るべきであるということになります。
つまり、命令の数分のケースが必要ですので、命令3つの3通りが必要です。
テストケースで言えば、例えば最低以下のケース2つを作ればC0は網羅できることになります。
(※命令が3箇所ありますが、効率よく2ケースで通している)
- 命令1、命令3を通るケース
- 命令2を通るケース
C1:分岐網羅(ブランチ・カバレッジ)
上記コードでは、判定条件Aと判定条件Bがすべての方向に網羅できればよいことになります。
つまり、判定条件の真意の数分のケースが必要ですので、2通り×2箇所の4通りが必要です。
テストケースで言えば、例えば最低以下のケース2つを作ればC1は網羅できることになります。
(※判定条件2通り×2箇所ありますが、効率よく2ケースで通せるため結果的にC0と同じ)
- 命令1、命令3を通るケース
- 命令2を通って、命令3を通らないケース
C2:条件網羅(コンディション・カバレッジ)
上記コードでは、条件a1、条件a2、条件bのそれぞれの真為が網羅できればよいことになります。
つまり、条件すべての真意の数分のケースが必要ですので、2通り×3箇所の6通りが必要です。
例えば最低以下のテストケース2つを作ればC2は網羅できることになります。
- 条件a1=false、条件a2=false、条件b=falseのケース
- 条件a1=true、条件a2=true、条件b=trueのケース
ちなみに、上記であれば、C0、C1も網羅できますが、以下の場合にはC2を網羅できても、C0とC1は命令2が通らないため網羅できません。
- 条件a1=false、条件a2=true、条件b=falseのケース
- 条件a1=true、条件a2=false、条件b=trueのケース
また、C2は、複合条件網羅として混同されることがあります。
複合条件網羅の場合、全ての条件の組み合わせを考える必要があります。
つまり、以下の8ケースが考えられます。
- 条件a1=false、条件a2=false、条件b=falseのケース
- 条件a1=false、条件a2=false、条件b=trueのケース
- 条件a1=false、条件a2=true、条件b=falseのケース
- 条件a1=false、条件a2=true、条件b=trueのケース
- 条件a1=true、条件a2=false、条件b=falseのケース
- 条件a1=true、条件a2=false、条件b=trueのケース
- 条件a1=true、条件a2=true、条件b=falseのケース
- 条件a1=true、条件a2=true、条件b=trueのケース
ただし、最後の4ケースについては、条件a1がtrueの時点で、条件Bは判定されず、true/falseどちらでもよいことになるため、テストケースとしては実質的に6ケースあればよいことになります。
- 条件a1=false、条件a2=false、条件b=falseのケース
- 条件a1=false、条件a2=false、条件b=trueのケース
- 条件a1=false、条件a2=true、条件b=falseのケース
- 条件a1=false、条件a2=true、条件b=trueのケース
- 条件a1=true、条件a2=DC、条件b=falseのケース
- 条件a1=true、条件a2=DC、条件b=trueのケース
※DC:Don't Care(どうでもいいということ)
参考
https://www.techmatrix.co.jp/product/ctest/unittest/c2.html
https://www.techmatrix.co.jp/product/ctest/structural-code-coverage/index.html#ctest-coverage