はじめに
ソフトウェアテストにおけるカバレッジについて、まとめてみました。
カバレッジとは、プログラムコードのルート(経路)どの程度を通ったか表す指標で、以下の3つのレベルがあります。
C0 | ステートメントカバレッジ/命令網羅 | すべての命令を実行すればよい |
C1 | ブランチカバレッジ/分岐網羅 | すべての分岐において、すべての分岐の方向を実行すればよい。分岐網羅は命令網羅の基準を満たす |
C2 | コンディションカバレッジ/条件網羅 | 各々の個別条件について、全ての可能な結果を少なくとも1回はとるように実行すればよい。条件網羅基準は分岐の方向を意識しないため、分岐網羅・命令網羅の基準を満たさないことがある |
テスト対象のコード
#include "afx.h" bool MyMethod(CString val1); int _tmain(int argc, _TCHAR *argv[]) { CString val = "B"; bool ret = MyMethod(val); return 0; } bool MyMethod(CString val1) { if (val1 == "A" || val1 == "B") { printf("%s\n", "処理1"); } else { printf("%s\n", "処理2"); } if (val1 == "C") { printf("%s\n", "処理3"); } return true; }
C0カバレッジ/命令網羅(ステートメントカバレッジ)
すべての命令(ステートメント)のうち、テストで実行された命令の割合を意味します。
上記のコードの場合、処理1と処理2、処理3が実行されれば100%になるので、
1 | val1 == "A" | 処理1 |
2 | val1 == "C" | 処理2と処理3 |
この2ケースを実行すればC0カバレッジは100%になります。
C1カバレッジ/分岐網羅(ブランチカバレッジ)
すべての判定条件のうち、テストで実行された判定条件の割合を意味します。
if文の分岐が2つあるので、2^2 = 4通り実施するとC1カバレッジは100%になります。
(このコードの場合ケース1はあり得ないので、実質3ケースです)
# | "val1 == ""A"" or val1 == ""B""" | val1 == "C" | |
1 | TRUE | TRUE | ×(あり得ない) |
2 | FALSE | ||
3 | FALSE | TRUE | |
4 | FALSE |
C2カバレッジ/条件網羅(単純条件カバレッジ)
すべての条件のうち、テストで実行された条件の割合です。C1ではval1 == "A" || val1 == "B"を1つの条件としてみていましたが、これを分解して3つの分岐として考えて、2^3 = 8実施するとC2カバレッジは100%になります。
(このコードの場合ケース1~3とケース5はあり得ないので、実質4ケースです)
# | val1 == "A" | val1 == "B" | val1 == "C" | |
1 | TRUE | TRUE | TRUE | ×(あり得ない) |
2 | FALSE | ×(あり得ない) | ||
3 | FALSE | TRUE | ×(あり得ない) | |
4 | FALSE | |||
5 | FALSE | TRUE | TRUE | ×(あり得ない) |
6 | FALSE | |||
7 | FALSE | TRUE | ||
8 | FALSE |