FuelPHP での PHPUnit によるユニットテスト
FuelPHP でのユニットテストには PHPUnit が使われています。
FuelPHP では、oil コマンドからテストが実行できるようになっていますが、単なるコマンドラッパーであり、特に何か追加でしているわけではありません。また、継承する TestCase クラスも今のところ PHPUnit_Framework_TestCase そのままです。
ということで、あまり FuelPHP 独自の点はありません。
PHPUnit のインストール
$ sudo pear channel-discover pear.phpunit.de $ sudo pear channel-discover components.ez.no $ sudo pear channel-discover pear.symfony-project.com $ sudo pear install phpunit/PHPUnit
FuelPHP 本体のテストの実行方法
FuelPHP には FuelPHP 本体のテストが含まれています。このテストを実行するには、FuelPHP のルートフォルダに移動し、以下のコマンドを実行します。
$ oil test --group=Core
あるいは、以下でも同じです。
$ php oil test --group=Core
この oil コマンドは、以下を実行しています。
$ phpunit -c fuel/core/phpunit.xml --group=Core
group の種類は Core の他に Package と App が定められています。App はアプリケーション用、Package はパッケージ用です。
Note: テストのないコードは FuelPHP には受け入れられません。コントリビュートする場合はテストも書きましょう。
アプリケーションのユニットテスト
作成するアプリケーションのテストは、
fuel/app/tests/
フォルダに配置します。
テストクラス名は「Tests_クラス名」のように命名し、TestCase を継承します。ファイル名はすべて小文字にします。
テストメソッド名は「test_テスト名」のように命名します。
また、@group アノテーションで「App」を必ず指定します。
@group App
と、ここまでは、https://github.com/fuel/fuel/blob/1.1/master/TESTING.md に記載されていますが、データベースのテストをどう書くかまでは記述されていません。
データベースのテスト
データベース設定
テスト用のデータベース設定ファイルを以下に作成します。
fuel/app/config/test/db.php
フィクスチャの準備
既存のテーブルからデータを取得し、yaml ファイルを作成する task を作成しました。task とは、oil コマンドから実行できるクラスのことです。fuel/app/tasks/ に配置します。
これで、以下のコマンドを実行すれば、
$ oil refine dbfixt:generate posts
posts テーブルから 5件のデータを取得し、posts_fixt.yml というファイルを作成します。
DbTestCase の作成
CIUnit をまねて、テストクラスに $tables が定義されている場合、指定された yaml ファイルの内容でテーブルのデータを書き換える setUp() メソッドを追加した DbTestCase クラスを作成しました。
読み込んだ yaml データは「$this->テーブル名_fixt」に保存されます。
Post モデルのテストの作成
これで準備ができましたので、ブログチュートリアル で作成された Post モデルのテストを作成してみます。
DbTestCase を継承して Tests_Model_Post クラスを作成します。
<?php namespace Fuel\Core; use Model\Post; /** * Model Post class tests * * @group App * @group Post */ class Tests_Model_Post extends \DbTestCase { protected $tables = array( // table_name => yaml_file_name 'posts' => 'posts', ); public function test_find_all() { $test = count(Post::find_all()); $expected = count($this->posts_fixt); $this->assertEquals($expected, $test); } public function test_find_one_by_id() { foreach ($this->posts_fixt as $row) { $post = Post::find_one_by_id($row['id']); $test = array(); foreach ($row as $field => $value) { $test = $post->$field; $expected = $row[$field]; $this->assertEquals($expected, $test); } } } } /* End of file app/tests/model/post.php */