CI_Unit_test
CI_Unit_testライブラリクラスは、「式」や「関数」、「メソッド」が想定した値を正しく返すかテストする ための単体テストを行う機能と、テスト結果をレポート表示する機能を提供します。
主に、モデルクラスやユーザライブラリクラスのメソッドをテストしたり、ユーザヘルパーの関数をテスト するのに利用します。
CI_Unit_testクラスのロード
「 CI_Loader 」クラスの「 library() 」メソッドでロードします。
必要な設定項目はありません。
ロードされたオブジェクトは「 $this->unit 」インスタンス変数から利用することができます。
単体テスト実行
通常、CI_Unit_testを利用した単体テストでは、コントローラにテスト用のアクションメソッドを用意し、
ブラウザからのリクエストをトリガーとしてテストを実行し、結果を出力します。
class Hoge_test extends CI_Controller { public function __construct() { parent::__construct(); $this->load->library('unit_test'); } public function hoge_test() { // テスト処理 // レポート出力 } }
run($test, $expected = TRUE, $test_name = 'undefined', $notes = '')
テスト評価したい関数やメソッドの返り値を第一引数に指定します。
第二引数には、テスト評価したい関数やメソッドが返す値の期待値、または、型を指定します。
第三引数は、テストを識別するテスト名を指定します。また、必要であれば、第四引数にテストの説明を指定することができます。
- 指定できる型
- 'is_object'
- 'is_string'
- 'is_bool'
- 'is_true'
- 'is_false'
- 'is_int'
- 'is_numeric'
- 'is_float'
- 'is_double'
- 'is_array'
- 'is_null'
// hoge_model の getHoge() メソッドをテスト
$this->load->model('hoge_model');
$this->unit->run(
$this->hoge_model->getHoge(),
'is_object',
'Test getHoge()'
);
// hoge_lib の calcHoge() メソッドをテスト
$this->load->library('hoge_lib');
$this->unit->run(
$this->hoge_lib->calcHoge($value),
'100',
'Test calcHoge()'
);
use_strict($state = TRUE)
CI_Unit_testの「run()」メソッドでは、テストする返り値と期待値の比較は、デフォルトでは
「 == 」比較演算子が用いられます。
PHPは型の評価がゆるい言語ですので、「 == 」比較演算子では厳密な型の比較は行われません。
(詳しくは
コチラを参照してください。)
厳密に型の比較を行いたい場合は、「 use_strict() 」メソッドを「run()」メソッド実行前に実行します。
再度、型の比較を行わないゆるい値の比較に戻すときは、FALSEを指定して実行します。
// hoge_model の setHoge() メソッドをテスト
$this->load->model('hoge_model');
$this->unit->use_strict();
$this->unit->run(
$this->hoge_model->setHoge(),
1,
'Test setHoge()'
);
// hoge_lib の execHoge() メソッドをテスト
$this->load->library('hoge_lib');
$this->unit->use_strict(FALSE);
$this->unit->run(
$this->hoge_lib->execHoge($data),
'1',
'Test execHoge()'
);
「 setHoge() 」のテストでは「TRUE」を返しても成功と判定されますが、 「 execHoge() 」のテストでは「TRUE」を返しても失敗と判定されます。
active($state = TRUE)
テスト用のメソッド内でテストを実行する場合は問題ないのですが、サービス提供のメソッド内に テスト処理を記述する場合、本番環境時にテスト処理が実行されてしまっては不都合です。
「active()」メソッドは、以降の「run()」メソッドの実行を制御します。
引数にFALSEを指定して実行すると、以降の「run()」メソッドは実行後ただちに
処理から抜けます。
TRUEを指定して再度実行すると、以降の「run()」メソッドは通常の処理を
最後まで処理することになります。
$this->unit->active(FALSE);
}
テスト結果レポート
テスト実行後、以下の7項目のテスト結果レポートを取得することができます。
| Test Name | run()メソッドの第三引数で指定したテスト名 | |
|---|---|---|
| Test Datatype | run()メソッドの第一引数で指定したテスト対象のメソッドなどが返した値の「型」 |
String Integer Boolean Object Array など… |
| Expected Datatype | run()メソッドの第二引数で指定した期待値の「型」 | |
| Result | テストの成功是非 | Passed Failed |
| File Name | テストが実行されたファイル名 (通常はコントローラクラス名) |
|
| Line Number | 実行されたrun()メソッドが記述されている行数 | |
| Notes | run()メソッドの第四引数で指定したテストの説明 |
「 run() 」メソッドは、そのテストのテスト結果をテキスト(<table>タグ)で返します。
後述する「 report() 」メソッドは、全てのテスト結果をテキスト(<table>タグ)で返します。
例えば、三回「 run() 」メソッドでテストを実行してから「 report() 」メソッドを実行すると
三つ分のテスト結果を返します。
set_test_items($items = array())
取得するテスト結果項目を制限することができます。
テスト結果として取得したいデータ項目を配列で指定します。
| 項目表示名 | 設定項目 |
|---|---|
| Test Name | test_name |
| Test Datatype | test_datatype |
| Expected Datatype | res_datatype |
| Result | result |
| File Name | file |
| Line Number | line |
| Notes | notes |
echo $this->unit->run(hoge_func(), TRUE, 'TEST HOGE');
| Test Name | TEST HOGE |
|---|---|
| Result | Passed |
後述する「 result() 」メソッド、「 report() 」メソッドには適用されません。
result()
テスト結果を配列で返します。
$result = $this->unit->result();
array (
0 =>
array (
'Test Name' => 'Test Foo()',
'Test Datatype' => 'String',
'Expected Datatype' => 'String',
'Result' => 'Passed',
'File Name' => '/web/app/application/controllers/test_foo.php',
'Line Number' => 11,
'Notes' => '',
),
)
report()
全てのテスト結果をテキストで返します。
デフォルトではHTMLの「<table>」タグでフォーマットされています。
$this->unit->run(foo_func2(), 2, 'Foo Test 2');
$this->unit->run(foo_func3(), 3, 'Foo Test 3');
echo $this->unit->report();
| Test Name | Foo Test 1 |
|---|---|
| Test Datatype | Boolean |
| Expected Datatype | Boolean |
| Result | Passed |
| File Name | /web/app/application/controllers/foo_test.php |
| Line Number | 55 |
| Notes |
| Test Name | Foo Test 2 |
|---|---|
| Test Datatype | Boolean |
| Expected Datatype | Boolean |
| Result | Passed |
| File Name | /web/app/application/controllers/foo_test.php |
| Line Number | 65 |
| Notes |
| Test Name | Foo Test 3 |
|---|---|
| Test Datatype | Boolean |
| Expected Datatype | Boolean |
| Result | Failed |
| File Name | /web/app/application/controllers/foo_test.php |
| Line Number | 75 |
| Notes |
set_template($template)
「 report() 」メソッド、「 run() 」メソッドが返すテスト結果のテキストテンプレートをセットします。
- デフォルトテンプレート
{rows}
<tr>
<th style="text-align: left; border-bottom:1px solid #CCC;">{item}</th>
<td style="border-bottom:1px solid #CCC;">{result}</td>
</tr>
{/rows}
</table>
$template = '<table class="unit_test_tbl">'; . '{rows}'; . ' <tr>'; . ' <th class="unit_test_th">{item}</th>'; . ' <td class="unit_test_td">{result}</td>'; . ' </tr>'; . '{/rows}'; . '</table>'; $this->unit->set_template($template);
run()メソッドの不具合修正
「 set_test_items() 」メソッドによる結果項目制御を「 result() 」メソッド、「 report() 」メソッドにも 適用するには「 system/libraries/Unit_test.php 」ファイルの「 run() 」メソッドを修正します。
// 111行目
- $report[] = array (
+ $report = array (
// 123行目
- return($this->report($this->result($report)));
+ return($this->report($this->result(array($report))));