Software fault injection based testing
概要
ネットワークやハードディスクがらみの例外処理は記述したとしても、実際にテストすることが困難です。この種のエラーをEclipse開発環境上でエミュレートしてテスト可能としたのが、この提案です。動機
ネットワークを利用するプログラムを記述する場合、開発者は常にネットワークのエラーなどに注意する必要があります。最近のプログラミング言語〜例えばJavaではtry-catch構文で簡単に定義できます。
次のプログラムは簡単なHTTPクライアントで、下の機能を備えていますが期待通りに動作しません。
- 1. google.comに接続してリクエストを送信
- 2. 受信したバイト列を"download.dat"ファイルに書き込む
- 3. 送受信中に例外が起きると、中途半端なdownload.datファイルを削除する
これは、FileOutputStreamはfinally節でクローズされるため、クローズ前のcatch節でdelete()を呼び出しても削除に失敗してしまうために起きています。
こういった非同期なエラーが起こった場合のテストは一般に困難で、開発者によって見逃されがちです。
提案
本提案ではソースコード上の任意の位置で低レベルエラーを発生させることで、これらのテストを行います。このようにソフトウェアを用いて故意に異常を導入する手法をSoftware Fault Injectionといいます。今回、プログラム上でエラーを発生させるツールをeclipseプラグインとして実装しました。開発者がプログラミングをする過程で指定し、実行することでエラーが起きた場合の挙動を確認できます。上のサンプルで示したプログラムでエラーを発生させる場合、eclipseのGUIからFigure 1のような指定を行います。
下記のサンプルではFigure 1に示した行以降にネットワークの送受信が行えない、という設定をしています。これを実行すると、実行時にエラーが発生している様子(Figure 2)が確認できます。
Figure 1: ネットワークの送受信を無効に設定したダイアログと、ソースコード上での指定
Figure2 : 実行した結果、エラーが導入されている
テストケースとしての記述
このプラグインを使用すると、この種のエラーのテストコードをテストケースとして記述することができます。下の例は実際にエラーを導入した場合のテストケースで、実行後に「ファイルが存在しない」もしくは「ファイルが正しい大きさ」のいずれかであることを確認しています。
実装
今回、実装はWindowsXP上、Javaを対象として行いました。テスト対象のプロセスにエラーを導入する機構は以下のようになっています。
API呼び出しのフックにはWindows API hooking SDK 2.13を用いて実装し、任意の行へのエラーの導入にはBugdelを拡張してEclipse 3.1上で実行可能としました。
参考
- 黒田滋樹, 柴山悦哉. Software Fault Injection を用いた開発時テスト支援環境. コンピュータソフトウェア, Vol. 23, No. 4, pp. 82-86, 2006.
- Windows API hooking SDK 2.13(http://www.validtec.com/)
- Bugdel (http://www.csg.is.titech.ac.jp/projects/bugdel/)
