現状すぐに手に入る自動化ツール
安全にソフトウェアの検査項目の削減を達成するために使える、特別にお金を掛けたり開発をしたりせずとも現状で入手可能なエンジニアリングツールはどんなものがあるでしょうか。
前提としてテスト項目とユニットの対応表はあるものとします。
すぐ思いつくものとしては、
- バージョン間の差分検出ツール(大概版管理ツールに付属する機能:Subversion や CVS などなど・・)
- クロスリファレンスリスト作成ツール(Microsoft の C 言語コンパイラですとコンパイラオプションでクロスリファレンスリストを作成してくれたはず)
1 の利用法は、コードの変更箇所の同定です。どこが変わったか分かれば、「その変更に関連するテスト」だけに絞れます。
現実は、以前の投稿でも指摘しているように「その変更に影響を受ける範囲」の決定が課題になるので話は単純にはなりませんが、取っ掛かりとしては明快です。その「影響範囲」を見積もるために 2 のクロスリファレンスリストが有効に使えます。
見積もりの方針はいろいろありえます:
- 変更されたユニット(関数など)含め、それ以降の制御が通るところ(そのユニットが呼び出すユニットも影響を受けるとするし、もちろん戻り先も)すべて影響範囲とする
- 変更されたユニット含め、戻り先の呼び出しコード以降の制御が通るところすべて影響範囲とする(1 と異なり変更ユニットが呼ぶユニットは問題にしない)
- 変更された部分の結果のなんらかの値を使うところだけを影響範囲とする
などでしょうけれど、1 は大概のプログラムで結果としてほとんど全ての部分が影響を受けるという判定になってしまいそうですし、2 の場合は(3 とも関連するのですが)変更されたユニットから呼び出ししているようなサブユニットが変更箇所の結果を利用しているような場合に問題が起こる可能性があります。
3 は結局クロスリファレンスリストのレベルを超えた、意味解析が必要になってきますから、現状のクロスリファレンサーで全自動というわけには行かなくなってきます。
と言った具合で、完全な自動化で検査項目減らすことは困難そうです。とはいえかなり工数は減らせる可能性はあると思えます。
- 変更箇所を見て、その結果を利用している下位の呼び出されるユニットがある場合、そのユニット以下は影響範囲とする⇒そのユニット以下が対象になるテスト項目は実施
- 変更箇所を見て、その結果をユニットの戻り先が使っている場合、その使っているところから先は影響範囲とする⇒大雑把に戻り先ユニットの対応テスト項目は実施し、戻り先以降のコードで呼び出しているユニットが、その値の変化に影響を受ける可能性があるならそれらのユニットに対応するテストも実施
このような方針でしょうか。現状これを簡単に見積もってくれるツールは、あるかもしれませんが只ではなさそう。
これは上でも書きましたが、簡単でも意味解析が必要ですので言語依存で難易度が変わります。その点では、人依存のレビューは間違いもしますがすぐに行える。問題は人件費が結局一番のコストってことでしょうか。
言語依存の難易度ですが、シンプルな関数プログラミング言語ですと難易度は簡単な部類でしょう。副作用を認める言語は一様に困難さが上がりますが、そこの部分に目を瞑ると単純な C 言語はやはり比較的簡単な方へ入るかと思えます。しかし C++ とかなると、もう考えたくも無いという部類かも。
C 言語であれば、制限付きでよければ比較的楽に見積もり情報を吐けるツールを作れそうではあります。これで全部 OK とはなりませんが、人によるレビューの補完もしくは補助として十分有効(コストを削減できる)そうなものは作れそう。
高度なマクロ機能やテンプレート機能(ジェネリックプログラミング)をガンガン使うスタイルが主流の言語(最近の C++ や Java など)は、かなり難しいように思えます。それでも補助としては有用かもしれませんが。
※上記検討では、C 言語でのポインタ周りをいじったら全てが自動的に影響範囲(オーバーランを起こしたらどこでも影響を受ける可能性がある)という話は棚上げにしています。
<つづく>