読者です 読者をやめる 読者になる 読者になる

テスト結果にexceptionsの詳細を表示する

Ethna

Ethnaユニットテストをやってると、Resultのexceptionsがいくつかカウントされてるときがあります。でもいちおう全部passしてるし・・・。
テストコードをとっかえひっかえして試してみたところ、どうやら文法エラーがあるとexceptionとしてカウントされるみたい?
Ethna_UnitTestReporterを下のように拡張するとexceptionの詳細を表示するようになった。


app/appid_UnitTestReporter.php

<?php

class appid_UnitTestReporter extends Ethna_UnitTestReporter
{
    /**
     *  エラー
     *
     *  @access public
     *  @param string   $message    メッセージ
     */
    function paintError($message)
    {
        parent::paintError($message);

        $breadcrumb = $this->getTestList();
        $test = $breadcrumb[2];
        array_shift($breadcrumb);
        $this->report[] = array(
            'type'       => 'Error',
            'test'       => $test,
            'breadcrumb' => $breadcrumb,
            'message'    => $message,
        );
    }
}

あとはこのUnitTestReporterを使うようにControllerとUnitTestManagerに手を加える。

app/appid_Controller.php
クラス定義を追加。

<?php

class appid_Controller extends Ethna_Controller
{
    /**
     *  @var    array   クラス定義
     */
    var $class = array(
        /*
         *  TODO: 設定クラス、ログクラス、SQLクラスをオーバーライド
         *  した場合は下記のクラス名を忘れずに変更してください
         */
        'unittest_reporter' => 'appid_UnitTestReporter', // 追加
    );
}

app/appid_UnitTestManager.php
UnitTestReporterのインスタンス取得部分を変更したいためだけにrun()をまるごとコピー。

<?php

class appid_UnitTestManager extends Ethna_UnitTestManager
{
    /**
     *  ユニットテストを実行する
     *
     *  @access private
     *  @return mixed   0:正常終了 Ethna_Error:エラー
     */
    function run()
    {
        $action_class_list = $this->_getTestAction();
        $view_class_list = $this->_getTestView();

        $test =& new GroupTest("Ethna UnitTest");

        // アクション
        foreach ($action_class_list as $action_name) {
            $action_class = $this->ctl->getDefaultActionClass($action_name, false).'_TestCase';
            $action_form = $this->ctl->getDefaultFormClass($action_name, false).'_TestCase';

            $test->addTestCase(new $action_class($this->ctl));
            $test->addTestCase(new $action_form($this->ctl));
        }

        // ビュー
        foreach ($view_class_list as $view_name) {
            $view_class = $this->ctl->getDefaultViewClass($view_name, false).'_TestCase';

            $test->addTestCase(new $view_class($this->ctl));
        }

        // 一般
        foreach ($this->testcase as $class_name => $file_name) {
            $dir = $this->ctl->getBasedir().'/';
            include_once $dir . $file_name;
            $testcase_name = $class_name.'_TestCase';
            $test->addTestCase(new $testcase_name($this->ctl));
        }

        // ActionFormのバックアップ
        $af =& $this->ctl->getActionForm();

        //出力したい形式にあわせて切り替える
        $reporter =& $this->backend->getObject('unittest_reporter');
        $test->run($reporter);

        // ActionFormのリストア
        $this->ctl->action_form =& $af;
        $this->backend->action_form =& $af;
        $this->backend->af =& $af;

        return array($reporter->report, $reporter->result);
    }
} 

これで文法エラーがあればNOTICEとかWARNINGとかのメッセージが各テスト結果の下に追加されます。ひとあんしん。