小さい頃はエラ呼吸

いつのまにやら肺で呼吸をしています。


ソフトウェアテストにおけるカバレッジ(C0/C1/C2)

はじめに

ソフトウェアテストにおけるカバレッジについて、まとめてみました。

知識ゼロから学ぶソフトウェアテスト 【改訂版】
高橋 寿一
翔泳社
売り上げランキング: 19,474

カバレッジとは、プログラムコードのルート(経路)どの程度を通ったか表す指標で、以下の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