2014年1月14日火曜日

CakePHP2.x 単体テストをやってみる

CakePHP2.x系にはPHPUnitを用いた単体テストが導入されているようだ。
PHPUnitは入っているし、ちょっとやってみた。

参考サイト
テスト - CakePHP Cookbook 2.x ドキュメント

今回はある程度整っている環境に導入するので、モデルの作成とかはすっぽかし。
とりあえずHogeモデルがすでにあると仮定して進める。

開発環境から作成する場合はこの時にスキーマをばっちり使用するとマイグレーションが
簡単になるらしい。

フィクスチャを作成する


このフィクスチャとやら、テスト時に一時的なテーブルを作成してそこで作業してくれるらしい。
テーブルの値に依存していて、テストの度に値を設定しないと、なんていうときに便利そう。
ファイルの作成場所はapp/Test/Fixture。

/*---------------------------------------------------------------------------*/
    class HogeFixture extends CakeTestFixture
    {
        public $import = array(
            "model"           => "Hoge",
            "connection"    => "hoge_db",
        );
    }
/*---------------------------------------------------------------------------*/

importプロパティに値を設定すると、
既存のモデルのスキーマを読み取って勝手にテーブルを作成する。
モデルが存在しないときはmodelではなくtableでテーブル名を指定するといい。
connectionはHogeモデルの接続先データベース。デフォルトのままでいいなら設定不要。

フィクスチャの接続先のデータベースを作る


ここで面倒くさがらずに、フィクスチャにはちゃんと専用のデータベースを用意してあげよう。
というのも、フィクスチャは
  1. 各フィクスチャで必要なテーブルを作成する
  2. フィクスチャにデータが存在すれば、それをテーブルに投入する
  3. テストメソッドを実行する
  4. フィクスチャのテーブルを空にする
  5. データベースからフィクスチャが作成していたテーブルを削除する
という手順を通過するので、仮にフィクスチャで使用するテーブルが指定したデータベースの
既存のテーブルと被っていた場合、発つ鳥後を濁さずと言わんばかりにテーブルを消してから
作業を終えるから。

1回テストを試してからテーブルが削除されているのに気づかず、
「あれ? テーブルがないぞ。接続先間違えてるのか?」なんて全くの見当違いの方向へ
悩んでいた自分のようになりかねない。(え? ならない?)

テストケースを作成する


app/Test/ModelにHogeTest.phpを作成。

/*---------------------------------------------------------------------------*/
    class HogeTest extends CakeTestCase
    {
        public $fixtures = array("app.Hoge");

        public function setUp()
        {
            parent::setUp();
            $this->Hoge ClassRegistry::init("Hoge");
        }

        public function testHoge()
        {
            $result = $this->Hoge->hogeru();
            $this->assertEquals("hogeru", $result);
        }
    }
/*---------------------------------------------------------------------------*/

テストケースのクラスとファイル名には必ず最後にTestをつける必要がある。
fixtureプロパティでさっき作成したHogeフィクスチャを指定。
setUpメソッドでテスト前の初期化を行う。ここではHogeモデルを作成している。
testHogeがテスト時に呼ばれるメソッド。
ひとつのファイルに定義されているものは一度のテストで全て実行される。
Hogeモデルのhogeruメソッドを呼び出している。中身はさっぱり知らないが"hogeru"が返ってくる。
assertEqualsで望みどおりの結果が返ってきているかチェック。
アサーション系のメソッドは他にもあるので状況にあわせて使おう。

テストを行う


http://[ホスト名]/[アプリケーション名]/test.phpにアクセスすると、行えるテストが表示される。
app/Test/Case/[フォルダ名]以下にある末尾にTest.phpが付いたファイルの一覧。
最初はController/Model/Viewの3つしかないが、自分で適当なフォルダを追加することもできる。

今回作成したHogeテストへのリンクがModel/Hogeという風に表示されているはず。
カチッと押せばテスト開始。バーの色でテストの成否を確認できる。緑が成功。赤が失敗。
失敗していたら失敗箇所を修正して緑を目指す。

おまけ:XDebugを導入する(XAMPP)


XDebugをインストールすると、Analyze Code Coverageという機能を使えるようになる。
今回のテストでコードをどれくらい使用したのか色付きで表示してくれる。

XAMPPの最新版には最初から入っており、php.iniのコメントアウトを数行外せばいい。
(多分)[XDebug]セクションが存在すると思うので、そこのコメントアウトを外してやろう。
とりあえず全部外しちゃったけど、特に問題起こってないので多分大丈夫。

apacheを再起動してphpinfoの中にxdebugの項目があればオーケー。

0 件のコメント:

コメントを投稿