CakePHP1.3でテストコード(1) -モデルのテスト-
公開日: : CakePHP, IT, SimpleTest, テスト
※CakePHP2系ではPHPUnitになっています。
今回、すでにあるサービスにテストコードを導入することにしたので覚書。
まずは、モデルに対してテストをケースを作成してみます。
事前準備
SimpleTestをダウンロード&設置
- SimpleTestをダウンロード
- ※注意点※ 1.1系は利用できないので、1.0系をダウンロード
- ダウンロードして解凍した「simpletest」フォルダを/app/vendors/配下に移動
- または、/vendors/配下に移動
テスト用のデータベースの設定
すでにあるサービスに対してテストをおこなうため、本来のテーブルとは異なるテスト用のテーブルを扱うようにします。
そこで、データベースの設定ファイルの$testを記述します。
※$testがないと$defaultが使われます。
ファイルの場所:app/config/database.php
var $test = array( 'driver' => 'mysql', 'persistent' => false, 'host' => 'localhost', 'login' => 'user', 'password' => 'password', 'database' => 'sample', 'prefix' => 'test_', );
prefixに値を入れることによりテスト用のテーブルを扱うようにしています。
※実際にテーブルを作る必要はありません。
テスト用データの準備
フィクスチャ(fixture)を用いてデータ準備
テストで利用する一時的なデータのためにフィクスチャを用います。
基本的なフィクスチャの流れは以下のとおり。
引用:502 Bad Gateway
- 各フィクスチャで必要なテーブルを作成する。
- フィクスチャにデータが存在すれば、それをテーブルに投入する。
- テストのメソッドを実行する。
- フィクスチャのテーブルを空にする。
- データベースからフィクスチャが作成したテーブルを削除する。
フィクスチャの記述例は以下のような感じです。
ただし、設置場所やファイル名に決まりがあります。
[ルール]
- 設置場所:app/tests/fixturesディレクトリ
- ファイル名:今回の例だと、sample_fixture.php(xxxx_fixure.phpになります)
<?php class SampleFixture extends CakeTestFixture { var $name = 'Sample'; var $import = 'Sample'; //テスト用データ var $records = array( array( 'id' => 1, 'name'=> 'サンプル', ), ); }
今回のケースのように、すでにテーブルの情報がある場合は、$importを使って指定します。
あとはテストデータを上記のように$recordsに値を入れます。
すでにあるデータを使う場合
- app/config/database.phpの$testの値をデータが入っているデータベースに変更
- $importを以下のように記述
var $import = array('model' => 'Article', 'records' => true);
※すでにあるデータを使う場合で、フィクスチャの書き方を間違えるとそのデータが消えてしまうこともあるので注意してください。
テストの作成・実行
ここまでくれば、あとはテストコードを実際に書いて実行するだけです。
テストコードの記述(モデル)
Sampleモデル(CakePHP1.3で記述したモデル例)
<?php class Sample extends AppModel { var $name = 'sample'; var $useTable = 'sample'; /** * データ取得(id使用) * @param $id ID */ public function get($id) { $conditions = array('id' => $id,); $field = array('id', 'name'); $params = array( 'conditions' => $conditions, 'fields' => $field); $data = $this->find('first',$params); return $data; } }
このgetメソッドに対するテストコードを書いてみます。
モデルのテストコードの例は以下のとおりです。
ただし、フィクスチャ同様に設置場所やファイル名に決まりがあります。
[ルール]
- 設置場所:app/tests/cases/ディレクトリ
- ファイル名:今回の例だと、sample_test.php(xxxx_test.phpになります)
<?php class SampleTestCase extends CakeTestCase { var $fixtures = array('app.sample'); //フィクスチャ function startTest() { $this->Sample =& ClassRegistry::init('Sample'); } function endTest() { unset($this->Sample); ClassRegistry::flush(); } /** * 簡単なテスト例 */ function testGet() { $result = $this->Sample->get(1); $expected = array('Sample' => array('id' => 1, 'name' => 'サンプル', ), ); //一致するかどうか $this->assertEqual($result, $expected); } }
assertEqualで、実際の値と期待した値が一致するかをチェックしています。
テストの実行
- テストケースを作成したら、以下にアクセス
- サービスのアドレス/test.php
- ローカル環境でやっているなら、http://localhost/service名/test.phpとかですかね。
- サービスのアドレス/test.php
- 左側に表示されている「App」の「Test Cases」をクリック
- App Test Casesに表示された「models/Sample」をクリック
以上の操作で記述したテストが表示されます。
おまけ
今回は、すでにあるCakePHP1.3で作ったサービスでのテストコードの導入についてちょろっと書きました。
ただ、今回のようにテストの実行をtest.phpにアクセスしておこなうというのは非常に面倒&無駄です。
そこで、テストの実行に関してはJenkinsを利用してソースがコミットされる度に、テストを実行する方法に変えていったほうがいいですね。
参考サイト
広告
関連記事
-
iPhoneアプリ開発 −遷移先のViewControllerに値を引き継ぎたい−
例えば、トップページに複数個のボタンがあって、「A」と「B」というボタンを押下した際に、同じView
-
jQuery Mobileの1.0Beta3、1.0RC1で起きた現象 -iOS5で動かない!?-
最近おきたjQuery Mobile周りについてのメモ。 本来なら色々チェックしてちゃんと原因を調
-
CakePHP1.2から1.3への変更作業
CakePHP1.2から1.3への変更作業でおこなったことまとめ。 思ったよりも面倒なので、誰かの
-
さくらのVPSでJenkins -執事さんとご対面-
さくらのVPSを利用している方は多いかと思います。 私も、自分で遊ぶ用(開発用)として借りてみまし
-
jQuery Mobileではまったこと -広告が表示されない!($.mobile.changePage()でのページ遷移)-
swipeした際にページ遷移をさせるためにjQueryMobileの$.mobile.changeP
-
Jenkins+Capistranoを設定した時にしたこと -「ポート変更」「公開鍵認証」対応-
* 前段階 上記にあるように、Jenkins+Capistranoの設定をしています。 ただし、設
-
MySQLのバックアップ手順 -消えたら困るものはバックアップ-
そろそろデータが消えてもらったら困るぐらいになっていたのでバックアップをとることにしました。 とい
-
str_padとsprintfの速度
PHPで同じことが出来る「str_pad」と「sprintf」。 今まではsprintfを使う機会
-
CAPTCHAの導入方法 -KCAPTCHAの導入-
CakePHP(1.2、1.3)にKCAPTCHAを導入してみたのでメモ。 * CAPTCHA
-
iPhoneアプリ開発 −フォントの変更−
一言:最近、iPhoneアプリの開発のためMacばかり触ってて、Windowsに戻ると混乱します。