Software fault injection based testing

概要

 ネットワークやハードディスクがらみの例外処理は記述したとしても、実際にテストすることが困難です。この種のエラーをEclipse開発環境上でエミュレートしてテスト可能としたのが、この提案です。

動機

 ネットワークを利用するプログラムを記述する場合、開発者は常にネットワークのエラーなどに注意する必要があります。
最近のプログラミング言語〜例えばJavaではtry-catch構文で簡単に定義できます。

次のプログラムは簡単なHTTPクライアントで、下の機能を備えていますが期待通りに動作しません。
 実際にプログラムを走らせて、ダウンロード中にケーブルを引っこ抜いてみます。すると例外はきちんと発生しますが、中途半端なファイルは削除されず残ってしまいます。

 これは、FileOutputStreamはfinally節でクローズされるため、クローズ前のcatch節でdelete()を呼び出しても削除に失敗してしまうために起きています。
 こういった非同期なエラーが起こった場合のテストは一般に困難で、開発者によって見逃されがちです。

提案

 本提案ではソースコード上の任意の位置で低レベルエラーを発生させることで、これらのテストを行います。このようにソフトウェアを用いて故意に異常を導入する手法をSoftware Fault Injectionといいます。
 今回、プログラム上でエラーを発生させるツールをeclipseプラグインとして実装しました。開発者がプログラミングをする過程で指定し、実行することでエラーが起きた場合の挙動を確認できます。上のサンプルで示したプログラムでエラーを発生させる場合、eclipseのGUIからFigure 1のような指定を行います。

 下記のサンプルではFigure 1に示した行以降にネットワークの送受信が行えない、という設定をしています。これを実行すると、実行時にエラーが発生している様子(Figure 2)が確認できます。
dialog code
Figure 1: ネットワークの送受信を無効に設定したダイアログと、ソースコード上での指定
code
Figure2 : 実行した結果、エラーが導入されている

テストケースとしての記述

 このプラグインを使用すると、この種のエラーのテストコードをテストケースとして記述することができます。
 下の例は実際にエラーを導入した場合のテストケースで、実行後に「ファイルが存在しない」もしくは「ファイルが正しい大きさ」のいずれかであることを確認しています。
 このようなテストケース記述に加えて、「テストケースごとのエラー種類の切り替え」「各行でエラーが発生したそれぞれの場合のテストケース」も行うことができます。

実装

 今回、実装はWindowsXP上、Javaを対象として行いました。テスト対象のプロセスにエラーを導入する機構は以下のようになっています。

fig1  API呼び出しのフックにはWindows API hooking SDK 2.13を用いて実装し、任意の行へのエラーの導入にはBugdelを拡張してEclipse 3.1上で実行可能としました。

参考