3. 考慮点
「ホワイトボックステスト」にはさまざまな考慮点があります。
3.1. データやデータ構造は網羅率に含まれない
プログラムは制御構造の他にデータが重要です。実際、ヴィルト先生の『アルゴリズム+データ構造=プログラム』(絶版)という名著もある程です。データやデータ構造に着目してテストを行いたい訳ですが、網羅率にはデータもデータ構造も含まれていません。C0、C1、C2網羅率がすべて100%だったとしても、十分テストしたと言えないことがあるのです。
3.2. 並列性やミドルウェアを利用したさまざまな処理など、別途テストが必要である
並列性(concurrency)のプログラミング言語レベルのサポートはかなり大きな挑戦です。ADAやJavaのように並列性を考慮している言語もありますが、それでも網羅率で並列性をテストできる訳ではありません。他の言語になると、API呼び出しなどで並列性を実現しますが、やはり網羅率で並列性のテストをするわけにはいきません。別途テストが必要になりますね。
3.3. コピー&ペーストしたプログラムではテスト対象が増える
ソースコードをコピー&ペーストしてプログラミングをしている場合、テスト対象はペーストしたソースを含みます。保守しているともっと劇的にテスト対象が増えることになります。つまり母体が1,000行、修正が10行だったとすると、テスト対象は1,000行からなる母体です。これは当たり前かもしれませんが、時としてテスト負担が大きく感じられます。
これは「ブラックボックステスト」では発生しない考慮点です。「ブラックボックステスト」を解説する時に、この考慮点を再び議論します。
3.4. C1網羅率が100%でも、テストしていない経路がある
例えば、図5に示したような「あるセグメント構造」を持つプログラムをテストするとしましょう。

図6(a)のようにテストしたとします。この時、C0網羅率は100%です。2つのテストケースでこのプログラムのすべてのセグメントを網羅しているからです。

ところで図6(b)の赤で示した経路にエラーがあったとします。そのエラーは赤の経路を実行しない限り発現しないとすれば、その経路のテストをしなかった場合、エラーを見過ごしたことになります。
つまりC1網羅率が100%でも、エラーを含む経路をテストしていない可能性があるということです。
3.5. C2網羅率が100%でも、大事なテストが抜けているかもしれない
例えば、図7に示したような「ある反復構造」を持つプログラムをテストするとしましょう。

図8のようにテストしたとします。この時、C1網羅率は100%です。赤い経路を通るテストケースが全セグメントを網羅しているからです。
C2網羅率も100%です。C1網羅率が100%の上、反復の内も外も網羅しているからです。

このプログラムではインテリアを5回実行すると初めてエラーが発現するとしましょう(例えばインテリアでメモリーを獲得していき一定回数を越えるとエラーになる場合、などを想定しています)。
C2網羅率が100%でも、エラーが発現する程十分にインテリアをテストしていなかった可能性があるということでうのです。
4. まとめ
今回も単体テストの手法のうちホワイトボックステストを見てみました。ホワイトボックステストではプログラムの構造に基づいてテストすることになります。今回取り上げた構造は「反復」でした。「反復」とはループのことでした。
網羅率の計算の仕方も勉強しました。サンプルを使っての網羅率の計算は「ブラックボックステスト」の解説の際に、まとめて勉強することにします。
網羅率の計算方法はプログラムの構造に依っているので、それ以外のデータや並列性などについては別途テストが必要です。コピー&ペーストした場合や保守の場合にはホワイトボックステストだとテスト対象が増えます。C1、C2網羅率がそれぞれ100%だったとしても、テストすべき重要な経路が抜けている場合があります。
ホワイトボックステストは単体テストの中で重要なテスト方法です。しかし、それが万能だということではなく、他のテスト方法と相補的に実施することが必要なのです。
参考文献
- 『SEのためのソフトウェア・テストの基本』 山村吉信 著、翔泳社、2003年12月
- CodeZine 『テンプレートから学ぶ 受注する開発者のためのテスト仕様書 (1)』 山村吉信 著、2009年7月
- CodeZine 『テンプレートから学ぶ 受注する開発者のためのテスト仕様書 (2)』 山村吉信 著、2009年8月
- CodeZine 『テンプレートから学ぶ受注する開発者のためのテスト仕様書(3)』 山村吉信 著、2009年8月
