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 */
テストの実行
$ oil test --group=App