ユニットテストクラス
ユニットテストは、アプリケーションの各メソッド用のテストを書くというソフトウェア開発のアプローチです。このコンセプトにあまり慣れていないのであれば、このことについて少しwebで検索してみてください。
CodeIgniterのユニットテストクラスは、評価メソッドと2つの結果メソッドからなる非常にシンプルなものです。本格的なテストスイートを意図して作られたものではなく、コードを評価してコードが正しいデータ型と結果を生成するかを調べるシンプルなメカニズムになっています。
クラスの初期化
CodeIgniterの大部分のクラスと同様、ユニットテストクラスはコントローラの中で$this->load->library メソッドを使って初期化します:
$this->load->library('unit_test');
いったん読み込まれると、ユニットテストオブジェクトは、次のようにして利用可能です: $this->unit
テストの実行
テストの実行には、次のメソッドに、テストと期待される結果を渡す必要があります:
$this->unit->run( test, expected result, 'test name' );
ここでの test は、テストしたいコードの実行結果が入り、expected result には、期待するデータ型 [または期待する値] が入ります。それから、test name では、オプションで、テストに名前を付けることができます。例:
$test = 1 + 1;
$expected_result = 2;
$test_name = 'Adds one plus one';
$this->unit->run($test, $expected_result, $test_name);
期待する結果には、リテラルでの一致か、データ型での一致かどちらかを指定できます。次は、リテラルの場合の例です:
$this->unit->run('Foo', 'Foo');
次は、型の一致の例です:
$this->unit->run('Foo', 'is_string');
"is_string" を第2引数に使っているのにお気づきでしょうか? これは、テストが文字列型で結果を生成するということをこのメソッドに通知するものです。以下は、比較に使用できる型のリストです:
- is_string
- is_bool
- is_true
- is_false
- is_int
- is_numeric
- is_float
- is_double
- is_array
- is_null
レポートの生成
各テストの後に結果を表示するか、複数のテストを実行したときに最後にレポートを生成するかのどちらも可能です。レポートを直接表示させるには、run メソッドを単純に出力するか返すかします:
echo $this->unit->run($test, $expected_result);
全テストの全レポートを見るには、次のようにします:
echo $this->unit->report();
レポートは、表示用にHTMLテーブルでフォーマットされています。生データがほしい場合は、次のように配列で取得することもできます:
echo $this->unit->result();
Strictモード
初期状態では、ユニットテストクラスは、リテラルの一致をルーズに評価します。次のような例が挙げられます:
$this->unit->run(1, TRUE);
このテストでは、評価対象が整数で、期待する結果の値がブール値です。しかし、型付けが弱いPHPでは、上のコードを通常の等価テストとしてTRUEとして評価します:
if (1 == TRUE) echo 'これは true として評価されます';
必要な場合は、下記のように、値だけでなく型の比較も行うStrictモードでユニットテストクラスを動作させることもできます:
if (1 === TRUE) echo 'This evaluates as FALSE';
Strictモードを有効にするには次のようにします:
$this->unit->use_strict(TRUE);
ユニットテストの有効化/無効化
スクリプトの中にはテストコードを残しておきたいけれども、必要になるまでそれを実行しない場合、次のようにしてユニットテストを無効にできます:
$this->unit->active(FALSE)
テンプレートの作成
テスト結果を初期状態のものとは違ったフォーマットにしたい場合、ユーザ定義のテンプレートをセットできます。以下は、シンプルなテンプレートの例です。必須の擬似変数に注意してください:
$str = '
<table border="0" cellpadding="4" cellspacing="1">
{rows}
<tr>
<td>{item}</td>
<td>{result}</td>
</tr>
{/rows}
</table>';
$this->unit->set_template($str);
Note: テンプレートは、ユニットテストの処理を実行する前に定義する必要がります。