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コントローラーを変更しており、テストを行う対象にする場合は、解除対象から外してください。