FuelPHP Advent Calendar 2012 6日目です。昨日はFuelPHPで日本人にやさしいフォームを作る(@redsnow_さん)でした。今日はユニットテストのすすめです。公式マニュアルhttp://fuelphp.com/docs/general/unit_testing.htmlを参考にしています。
PHPUnitのインストール
FuelPHPでは、PHPUnitというテスティングフレームワークを利用しています。まずPHPUnitをインストールしましょう。
PHPUnitは、PEARインストーラを使用してインストールします。まず、pear.phpunit.deからインストールできるようにします。auto_discover を有効にして、新規チャネルを自動的に探すようにします。 
pear config-set auto_discover 1
続いてインストールします。
pear install pear.phpunit.de/PHPUnit
詳しくは第3章 PHPUnit のインストールをごらんください。なお、Ubuntuでは、sudo apt-get install phpunitでインストールできます。
簡単なユニットテストの例
FuelPHPのコアコードhttps://github.com/fuel/core/blob/1.4/master/tests/num.phpから引用です。
namespace FuelCore;
/**
 * Numeric helper tests
 *
 * @package		Fuel
 * @category	Core
 * @author      Chase "Syntaqx" Hutchins
 *
 * @group Core
 * @group Num
 */
class Test_Num extends TestCase
{
	/**
	 * @see     Num::bytes
	 */
	public function test_bytes()
	{
		$output = Num::bytes('200K');
		$expected = '204800';
		$this->assertEquals($expected, $output);
	}
...
ユニットテストするには、TestCaseクラスを継承したクラスを作ります。(元々のPHPUnitではPHPUnit_Framework_TestCaseクラスを継承しますが、FuelPHPではTestCaseを継承します。)
テストのクラス名は、Test_テストするクラス名とする規約になっています。上の例ではTest_Numです。テストするクラスがModel_Loginなら、Test_Model_Loginと命名します。
このクラスで、test_で始まるメソッドを定義してください。上の例ではtest_bytesメソッドが定義されており、このメソッドはNum::bytes('200K');の実行結果が’204800’に等しいことを確かめています。assertEqualsは、PHPUnitのメソッドで、1つ目の引数と2つ目の引数が等しいかどうかを確かめます。
ユニットテストを書くメリット
ユニットテストを書くメリットは、テストを実行するコストが下がるので頻繁にテストを実行しやすくなること、クラス毎にテストを書くのでバグの箇所を見つけ易いこと、等があげられます。
プログラムを実行した結果をブラウザで目視して動作確認する、という方式だと、頻繁にテストするのは大変ですし、バグの箇所を見つけて修正するのも大変です。
ユニットテストを書いておけば、FuelPHPをインストールしたルートディレクトリで
oil test
コマンドでテストを実行することができます。またテストに失敗した場合、どのテストが失敗したかが分かります。バグがあった場合に早期発見/修正しやすくなります。
まずはテストしやすいところから
いきなり全部のコードのテストを完璧に書く、というのは難しいでしょう。まずはテストしやすいところから始めれば良いと思います。PHPUnitには様々なテストメソッドが用意されていますが、まずはassertEquals、assertTrue、assertFalseぐらいで良いと思います。FuelPHPのコアコードのテストコードも、大半はassertEquals、assertTrue、assertFalseです。
- assertEquals($expected, $actual) : $actual が $expected に等しい
 - assertTrue($actual) : $actual が TRUE
 - assertFalse($actual) : $actual が FALSE
 
テストのグループ化
oil testを実行すると、コアを含む全てのテストを実行します。自分のアプリケーションをテストしたい場合には、アプリケーション部分のみのテストができると嬉しいですね。
- 自分で書いたテストのクラスに、@group App アノテーションを書く
 - テストを書いたファイルをapp/testsフォルダに置く
 oil test --group=Appを実行する
で、グループ化してテスト実行できます。
アノテーションは、上の例のTest_numでは、@group Core となっています。自分のアプリケーションには、@group App を付けると、自分のアプリケーションのテストだけを実行することができます。App の部分は好きな名前を付けることができます。
明日は「
FuelPHP の Fieldset クラスをこんな風に拡張してまーす、という話」(@omoonさん)です。お楽しみに。
[…] @ounziwさんの「ユニットテストのすすめ」です。お楽しみに〜 […]
[…] FuelPHPのテストについては、FuelPHP Advent Calendar 2012の6日目に@ounziwさんが、「ユニットテストのすすめ」という記事を書かれていますので、ぜひご一読ください! […]
[…] FuelPHP Advent Calendar 2012 の 7 日目の記事です。昨日は @ounziw さんの『ユニットテストのすすめ』でした。 […]