連載
» 2016年11月17日 11時00分 公開

山浦恒央の“くみこみ”な話(89):猫でも分かるソフトウェアのテスト網羅(6):パス・カバレッジの王者の意外な弱点 (2/3)

[山浦恒央 東海大学 大学院 組込み技術研究科 非常勤講師(工学博士),MONOist]

2.1 テスト項目数が爆発的に増大

 これまで何回も繰り返していますが、C2カバレッジの100%網羅は、理論的には可能でも、現実的には(すなわち、スケジュール的に、コスト的に)非常に困難です。C2カバレッジを100%網羅する場合、テスト項目を自動生成するツールを導入して作業量を減らすことは可能ですが、実行結果と期待する結果は、どうしても人間が一致することを確認する必要があります。C2の完璧さを「パス・カバレッジの王者」と呼ぶなら、作業量や困難さも「パス・カバレッジの王者」なのです。また、ツールの習得にも一定の時間がかかります。よって、C2を導入するなら、重要な機能やモジュールに限定するなど、一定の制限を設けるべきです。

 全ソースコードで、「C2カバレッジを100%実施する」などと、「勇気のありすぎるエンジニア」になってはなりません。とにかく、実施するテスト項目数は、C1カバレッジに比べて、爆発的に増加します。そして、その割に、プログラムの品質向上は望めません。

2.2 結合したプログラム全体のカバレッジ

 単体レベルでC2カバレッジを実施する場合に比べ、プログラム全体でC2を実施するケースでは、テストするパス数が爆発的に増えます。常識的に、統合テストで、C1やC2カバレッジのような制御パステストを実施することは非常に困難となります。研究者によっては、C0でも難しいと言っています。制御パステストは、人間が目で追跡でき、また、組み合わせの数の少ない単体テストで実施すべきです。

2.3 デバッグ用ツールが必須

 C2カバレッジを本気で網羅しなければならない場合、デバッガが必須です(時にはC1カバレッジでも)。プログラムは、開発を担当したエンジニアが考える以上に複雑で、通常の入力では実施できないテストのパスが必ず現れます。C2カバレッジは、組み合わせをテストしなければなりませんので、組み合わせによってはパス網羅が不可能となります。その場合、以下のようにせざるを得ません。

  • デバッガのステップ実行を用いて、強制的にテストする
  • 網羅できない場合、顧客に報告する

 デバッガを持っていれば、通常では通せないパスも無理やり実行が可能です(*1)。なお、この話はC1カバレッジでも出てくることがありますので、最低限、デバッグ用ツールは持っておくと良いでしょう(*2)。

*1:どうしても実行できないパスがある場合は、「網羅できない」ことを顧客に報告しなければなりません。その時、なぜ、網羅できないかと、網羅できないことによるリスクを顧客に理解してもらわねばなりません。これは、結構、政治的な問題になることがあり、「実際にC2を100%網羅する」ことより神経が擦り減ったりしますので、くれぐれも、深みにはまらないようにしてください。

*2:制御パステストをやらないにしても、デバッグ用ツールは開発エンジニアのトラブルシュートに非常に有効です。導入していない組織は、ぜひ、導入を強くお勧めします。筆者だけでなく、あらゆる書籍や研究者がそのように力説しても、使用する組織は圧倒的に少ないと思います。今まで参画したプロジェクトで、幾つのプロジェクトがカバレッジ用ツールを使っていたか、思い出してください。半分以上の読者が「ゼロ」と答えると思います。まずは、そんな身近なところから、「ソフトウェア開発の近代化」に着手しましょう。そうでないと、「石器時代」のままです。

2.4 ブラックボックス・テストも併用する必要がある

 エンジニアによっては、「単体テスト=制御パステスト」と思っている人が少なくありません。例えば、コードを実装後、開発側エンジニアがC0やC1カバレッジを満たすテスト項目を作成し、次工程に進むやり方です。筆者は、このやり方には、疑問を感じます。次の例から、考えてみましょう。

  • 仕様:入力された年齢から、未成年か成年かを判定する
  • 仕様−1:入力された年齢をチェックし、未成年の場合、「未成年です」と出力する
#include <stdio.h>
main() {
	int in;
	scanf("%d",&in);
	if (in < 20) {
		printf("未成年です\n");
	}
} 

 このプログラムは、入力した年齢が未成年の場合、「未成年です」と出力します。この例に対し、単にC1カバレッジ100%を網羅する場合、テスト項目は2件で十分です。例えば、「in=9」と「in=30」の2つで、見かけ上は、C1カバレッジを100%網羅できます。

 上記の例には、以下の2つの欠点が存在します。

  • 「未満」と「以下」の誤解を検出できない可能性がある
  • 仕様のエラーを検出できない可能性がある

Copyright © ITmedia, Inc. All Rights Reserved.