このエントリーをはてなブックマークに追加

更新日: 2016年2月25日

実行時間: 0.0077

CI_Unit_test

 CI_Unit_testライブラリクラスは、「式」や「関数」、「メソッド」が想定した値を正しく返すかテストする ための単体テストを行う機能と、テスト結果をレポート表示する機能を提供します。

 主に、モデルクラスやユーザライブラリクラスのメソッドをテストしたり、ユーザヘルパーの関数をテスト するのに利用します。

CI_Unit_testクラスのロード

 「 CI_Loader 」クラスの「 library() 」メソッドでロードします。

 必要な設定項目はありません。

    $this->load->library('unit_test');

 ロードされたオブジェクトは「 $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()」メソッドは通常の処理を 最後まで処理することになります。

    if (ENVIRONMENT == 'production') {
        $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
    $this->unit->set_test_items(array( 'test_name', 'result'));
    echo $this->unit->run(hoge_func(), TRUE, 'TEST HOGE');
    Test Name TEST HOGE
    Result Passed
*注:
run()メソッドの不具合により「 set_test_items() 」メソッドでの結果項目の指定は、
後述する「 result() 」メソッド、「 report() 」メソッドには適用されません。

result()

 テスト結果を配列で返します。

    $this->unit->run(foo_func(), 'foo', 'Test Foo()');
    $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_func1(), 1, 'Foo Test 1');
    $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() 」メソッドが返すテスト結果のテキストテンプレートをセットします。

    • デフォルトテンプレート
    <table style="width:100%; font-size:small; margin:10px 0; border-collapse:collapse; border:1px solid #CCC;">
        {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))));