PHPUnitで直接Laravelの単体テストを行う
Laravelでは通常Artisanコマンドラインツールを使用し、単体テストを行います。
php artisan test
これで、application/tests
以下に含まれている.test.phpサフィックスのファイルが全部テストされます。
しかし、この方法ですとPHPUnitの持つ柔軟なテスト機能が十分に生かせません。ですから、直接phpunitコマンドで実行することをおすすめします。
Laravelを含め他のフレームワークでも同様ですが、単体テストと言っても、そのフレームワーク上でテストしなければ意味がありません。そのためにブートストラップコードを指定し、フレームワークを立ち上げます。artisan test
コマンドが内部で行なっている設定をphpunitで実行する場合は自分で指定することになります。
PHPUnitはテストを実行する場合、環境ファイルであるphpunit.xmlとphpunit.xml.distファイルを探し、見つかったらそのファイル中の環境で実行します。Laravelを使用し、インストールしたトップディレクトリーでphpunit
コマンドを実行する場合、phpunit.xml
をトップディレクトリーに、以下の内容で作成してください。
<?xml version="1.0" encoding="UTF-8"?> <phpunit bootstrap="laravel/cli/tasks/test/phpunit.php" verbose="true"> <!-- Laravelの実行環境をテスト用にセット --> <php> <env name="LARAVEL_ENV" value="test" /> </php> <testsuites> <testsuite name="Sample test suite"> <!-- テストケースファイルのサフィックスを指定 --> <!-- ディレクトリーを指定すれば、その以下のサブフォルダー内のファイルも実行される --> <directory suffix="Test.php">application/tests</directory> </testsuite> </testsuites> <!-- このログ出力はJenkinsで結果を表示する場合に使用 --> <logging> <!-- Cloverカバーレッジレポートを使用する場合、次の2つのログが必要 --> <log type="coverage-html" target="build/coverage" title="Base32" charset="UTF-8" yui="true" highlight="true" lowUpperBound="35" highLowerBound="70"/> <log type="coverage-clover" target="build/logs/clover.xml"/> <!-- JUnitテスト結果を表示する場合、このログが必要 --> <log type="junit" target="build/logs/junit.xml" logIncompleteSkipped="false"/> </logging> <!-- カバーレージのターゲット指定。テストだけなら使用しない。 --> <filter> <whitelist addUncoveredFilesFromWhitelist="true"> <directory suffix=".php">application/models</directory> <directory suffix=".php">application/controllers</directory> <!-- 対象外ファイル、blacklistで指定することも可能 --> <exclude> <file>application/controllers/base.php</file> </exclude> </whitelist> </filter> </phpunit>
このファイルで以下の指定を行なっています。
- bootstrapでブートストラップコードを指定しています。
- 環境変数、
LARAVEL_ENV
をtest
にセットしています。これによりapplication/config
下にtest
ディレクトリーが存在する場合、その中の設定ファイルで指定した項目が優先的に使用されます。テスト用に環境を設定しておくとよいでしょう。 - テストを実行するディレクトリーを指定しています。suffixで対象ファイルのサフィックスを指定します。この場合、Laravel標準の.test.phpではなく、Test.phpを指定しています。スケルトンジェネレーターが生成するファイル名に合わせてあります。
loging
はカバーレージツール・機能やJenkinsで結果を表示する場合に必要なログを残すための設定です。このようなツールを使用せず、テストだけを行えば良い場合は必要ありません。削除して構いません。filter
はカバーレージの対象ディレクトリー、除外ディレクトリーを指定しています。この例の場合application
ディレクトリー下の、models
とcontrollers
を対象としています。カバーレージを使用しない場合は削除しましょう。controller
下のbase.phpは、全コントローラーで共通の動作を実現しやすいように用意されています。このPHPファイルを変更しない場合、テストする項目がありませんので、外しています。対象外ファイルを指定する例として指定してあります。baseコントローラーを変更しており、テストを行う対象にする場合は、解除対象から外してください。