ユニットテスト

FuelPHP は自動ユニットテストを念頭に置いて作られていて、PHPUnit テストフレームワークを基にしたテストクラスとテストそのものが含まれています。

ユニットテストとは?

ユニットテストは、あるコード単位 (通常は関数やメソッド) が設計されたとおりに動作することを確認するために書かれた、自動化された一連のテスト群のことです。 これらのテストはまた、開発者がシステムに加えた変更が、すでに動作している何物をも壊していないことを確認するために役立ちます。 またユニットテストは、テスト駆動開発 (TDD: Test Driven Development) の考えのベースになっている主要な技術でもあります。

PHPUnit

FuelPHP 付属のテストを実行したい場合や、あなたが書いたテストを Oil コマンドで実行したい場合は、 PHPUnit をローカルにインストールする必要があります。 まだインストールしていない場合は、 PHPUnit のインストールドキュメントを参照してください。 https://phpunit.de/manual/current/ja/installation.html

FuelPHP でのユニットテストに興味がなければ、特に PHPUnit をインストールする必要はありません。

ユニットテストの実行

FuelPHP に含まれる Oil コマンドラインユーティリティは、ユニットテストの実行も可能なように作られています。 あなたが作成した FuelPHP プロジェクトの全てのテストは以下の Oil コマンドで実行出来ます。

$ php oil test

Tests Running...This may take a few moments.
PHPUnit 3.6.10 by Sebastian Bergmann.

Configuration read from /home/user/sites/example/fuel/core/phpunit.xml

...............................................................  63 / 251 ( 25%)
............................................................... 126 / 251 ( 50%)
............................................................... 189 / 251 ( 75%)
..............................................................

Time: 6 seconds, Memory: 22.25Mb

OK (251 tests, 206 assertions)

ユニットテストの作成

FuelPHP では、テストファイルは fuel/app/tests とそのサブディレクトリに配置されます。 もし上記のディレクトリがまだ存在しなかったら、どうぞ作って下さい。 慣例では、テストファイルは fuel/app/tests に、テストされるクラスファイルは fuel/app/classes に、それぞれ同じ名前で配置されます。例えば fuel/app/classes/model/login.php にあるクラスをテストするファイルは fuel/app/tests/model/login.php となります。

テストは TestCase クラスを継承したクラスになります。 TestCase クラスは PHPUnit_Framework_TestCase を FuelPHP で拡張したクラスですので、PHPUnit のすべてのアサーションとメソッドをテスト内で使用できます。 慣例では、テストクラスは Test_ ではじまり、テストしたいクラスの名前が続くクラス名になっています。例えば Model_Login をテストするクラスは Test_Model_Login になります。

class Test_Model_Login extends TestCase
{
	public function test_foo()
	{
	}
}

テストを書くための更なる情報は、以下の PHPUnit のマニュアルを見て下さい。 http://www.phpunit.de/manual/current/ja/writing-tests-for-phpunit.html

テストグループ

もし開発中にテストの一部だけを実行したいと考えたなら、テストグループを使うことができます。 php oil test コマンドに --group= スイッチを付けて実行します。

$ php oil test --group=App

このコマンドは「App」グループのテストのみを実行します。 docblock の @group 属性を使うと、ひとつのテストクラスを任意の数のテストグループに割り当てることができます。

/**
 * @group App
 * @group Login
 */
class Test_Model_Login extends TestCase
{
	public function test_foo()
	{
	}
}

高度な設定

もし phpunit.xml に書かれている内容を変更する必要がある場合は、 fuel/core/phpunit.xml を fuel/app にコピーして下さい。 FuelPHP は fuel/core の古いものの代わりに、コピーされた新しいファイルを認識してそちらを使用します。

モジュールのユニットテスト

もし FuelPHP を用いて大規模システムを開発している場合は、モジュールを用いての開発が推奨されます。 しかしモジュールの配置場所が設定可能になっているために、モジュールのテストを実行するためには phpunit.xml 内のモジュールの場所も同様に変更しないといけません。 例えば fuel/app/modules にモジュールを置いているならば、以下のテストスイート設定を PHPUnit 設定に追加したいと思うでしょう。

<testsuite name="modules">
    <directory suffix=".php">../app/modules/*/tests</directory>
</testsuite>

fuel/ ディレクトリの名前を変更した場合のテスト

fuel ディレクトリの名前を変更している場合は、 phpunit.xml に設定されているシステム変数 (ドキュメントルート、コアパスなど) は間違った参照になっています。 あなたのルートにある oil スクリプト内にあるパスを変更することは、他の Oil コマンドにとっては役に立ちますが、PHPUnit はそれとは別の独自の環境で動作しますので、ディレクトリ名を fuel から変更した環境ではテストは動作しないでしょう。 この問題を修正するには、app/ ディレクトリの phpunit.xml ファイルを修正して、新しいファイル構造を反映するようにシステム変数を変更します。