Practical Symfony #20: PHPUnit、Stagehand_TestRunner、MakeGoodに対応したユニットテスト実行環境の構築
本ブログではこれまで「Stagehand_TestRunnerおよびMakeGoodによるSymfonyの機能テストの実行」、「Symfonyアプリケーションのテスト実行環境を改善する」といった記事でSymfonyのユニットテスト実行環境の構築についてご紹介してきました。本記事ではSymfony2ベースのユーザー登録サンプルで私たちが採用している、PHPUnit、Stagehand_TestRunner、MakeGoodいずれにも対応したユニットテスト実行環境の構築手順を改めてご紹介します。
ユニットテスト実行用ブートストラップファイルの作成
最初にユニットテスト実行用のブートストラップファイルとして以下のようなPHPスクリプトを作成します。
app/bootstrap_test.php:
<?php $_SERVER['KERNEL_DIR'] = __DIR__; require_once $_SERVER['KERNEL_DIR'] . '/bootstrap.php.cache';
PHPUnit以外のプロダクトでComposerのオートローディングが有効でないものを使う場合、このファイルでロードや設定を行うようにします。例えば、インクルードパス上にあるPhakeを使う場合のコードは以下のようになります。
app/bootstrap_test.php:
<?php $_SERVER['KERNEL_DIR'] = __DIR__; require_once $_SERVER['KERNEL_DIR'] . '/bootstrap.php.cache'; require_once 'Phake.php'; Phake::setClient(Phake::CLIENT_PHPUNIT);
Note ブートストラップファイルはStagehand_TestRunnerまたはMakeGoodのプリロードスクリプト機能とPHPUnitのブートストラップ機能によって2回ロードされることがあります。したがって、ブートストラップファイルのコードは、複数回ロードされても問題が発生しないようにしておかなければなりません。
ユニットテスト実行環境の設定
次に前述のブートストラップファイルを使用するようにPHPUnitのXML設定ファイルを変更します。
app/phpunit.xml.dist:
<?xml version="1.0" encoding="UTF-8"?> <!-- http://www.phpunit.de/manual/current/en/appendixes.configuration.html --> <phpunit ... bootstrap = "bootstrap_test.php"> ...
テストランナーとしてMakeGoodを使用する場合はプロジェクトのプロパティを以下のように設定します。
- プロジェクトのプロパティを開き、MakeGoodを選択します。
- テスティングフレームワークでPHPUnitを選択します。
- テストフォルダーにsrcディレクトリを追加します。
- プリロードスクリプトに前述のブートストラップファイルのパスを入力します。

ユニットテストの実行
最後にそれぞれのテストランナーのユニットテスト実行方法を示します。
PHPUnit
$ php /path/to/phpunit -c app/phpunit.xml.dist
Stagehand_TestRunner
$ php /path/to/testrunner phpunit -p app/bootstrap_test.php -R src
Stagehand_TestRunner(phpunit:passthroughコマンド)
$ php /path/to/testrunner phpunit:passthrough -p app/bootstrap_test.php -c app/phpunit.xml.dist
Note phpunit:passthroughはStagehand_TestRunner経由でphpunitコマンドを実行するコマンドです。Stagehand_TestRunnerでは1つのファイルに複数のテストクラスを定義することができますが、phpunitでは1つのファイルに1つのテストクラスしか定義することができません。したがって、1つのファイルに複数のテストクラスが定義されている場合、phpunitコマンドではすべてのテストを実行できず、カバレッジ等が使い物にならないという状況が発生します。phpunit:passthroughコマンドを使うと、1つのファイルに複数のテストクラスが定義されている場合でもすべてのテストを実行することができます。
MakeGood
継続的テストが有効な場合はファイルを保存する度に自動的にテストが実行されます。また、MakeGoodビューやコンテキストメニューからいつでも任意のテストを実行することもできます。詳細についてはMakeGoodユーザーガイドをご覧ください。





