ホワイトテストと網羅率

著者:杉浦

ホワイトテストと網羅率

 テストはプログラムの構成要素を参考にするもの、参考にしないもので二種類に分けられます。前者がホワイトテスト、後者がブラックテストとされます。ホワイトテストは設計の通りにプログラムが動作するかを確かめます。ホワイトテストによるテストではテスト内容を条件分岐の網羅などソースコードを元に定められます。ホワイトテストで考えられるテストは、ソースコードの全ての部分を実行する、ソースコードの全ての部分を様々な状態で実行する、ソースコードの全ての部分をあり得る全ての状態で実行する、といった様なテストです。
 ホワイトテストにはテスト達が所定の網羅条件をどれだけ達成しているかを表すカバレッジ(網羅率)という単位が定められています。hogehoge coverage xx%やCx xx%の様に表されることが多いです。

命令網羅 (statement coverage) (C0) 実行可能な命令の網羅率です。条件分岐の仕方に関わらずコード全体のうちどれだけが実行されたかを表します。
分岐網羅 (branch coverage) (C1) 実行可能な分岐の網羅率です。全体のうちどれだけの分岐を通ったかを表します。
条件網羅 (condition coverage) (C2) 実行可能な条件の網羅率です。全体のうちどれだけの条件を通ったかを表します。

真にプログラム上でありうる状態を網羅するためには条件網羅であっても力不足ですが、現実の時間は有限です。組み合わせ爆発にあるように、真に網羅を行うテストは実行時間が現実的でありません。後述しますが、網羅を目標にするテストのみではバグを見逃すことが多々あります。
 次のコードを例に命令網羅、分岐網羅、条件網羅それぞれを説明します。

function (a,b,c){
	if((a == 1 && b == 2) || c==3){
		//ifの中の処理。分岐なし
	}
	return;
}

このコードで入力引数がa=0,b=0,c=3のテストのみを実行した場合、C0:100%、C1:50%、C2:33%となります。まずC0:100%について説明します。これは実行可能な命令の網羅率です。引数がa=0,b=0,c=3ならばifの中に入りコード全体の命令を実行したことになり網羅率100%となります。次いでC1:50%について説明します。これは実行可能な分岐の網羅率です。このコードはifの中に入る入らないで2通りの実行ルートがあります。引数がa=0,b=0,c=3のテストのみを実行した場合、片方のルートのみを通ったということであり網羅率50%です。最後にC2:33%です。これは実行可能な条件の網羅率です。このコードにおいて実行可能な条件の組み合わせは(a == 1 && b == 2)=true,(a == 1 && b == 2)=falseかつ(c==3)=true,(a == 1 && b == 2)=falseかつ(c==3)=falseの3種類です。(a == 1 && b == 2)=trueの場合、二つ目の条件c==3の結果を評価せずとも条件の真偽値が定まるため二つ目の条件を評価しない言語が大多数です。そのためカバレッジでも二つ目の条件を評価しません。1/3を網羅したためC2:33%です。
 カバレッジはテストケースを考えるのに有用な基準ですが先に述べた通り100%を追求することは割に合わないことが多いです。実際のケースは上手く記述しようとも巨大で複雑になります。そのような場合、完全に網羅を行い、現実的な実行時間に収まるテスト達を考えることは困難です。加えて、カバレッジの追求のみでは実行パスに関わらないエラー要素、例えばa=b/cという処理におけるc=0の場合の様なバグが漏れやすいです。あくまで経験ですが高級言語の様な通常の記述において暗黙的な処理を多分に含む言語ほど命令、条件の網羅によるテストから漏れるバグが増えます。多方面からテストを行うことによって効率よくソフトウェアの品質を検証できます。

  • この記事いいね! (0)

著者について

杉浦 administrator