PHPUnitで直接Laravelの単体テストを行う

タグ: Laravel3   PHPUnit   PHP  

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_ENVtestにセットしています。これによりapplication/config下にtestディレクトリーが存在する場合、その中の設定ファイルで指定した項目が優先的に使用されます。テスト用に環境を設定しておくとよいでしょう。
  • テストを実行するディレクトリーを指定しています。suffixで対象ファイルのサフィックスを指定します。この場合、Laravel標準の.test.phpではなく、Test.phpを指定しています。スケルトンジェネレーターが生成するファイル名に合わせてあります。
  • logingはカバーレージツール・機能やJenkinsで結果を表示する場合に必要なログを残すための設定です。このようなツールを使用せず、テストだけを行えば良い場合は必要ありません。削除して構いません。
  • filterはカバーレージの対象ディレクトリー、除外ディレクトリーを指定しています。この例の場合applicationディレクトリー下の、modelscontrollersを対象としています。カバーレージを使用しない場合は削除しましょう。controller下のbase.phpは、全コントローラーで共通の動作を実現しやすいように用意されています。このPHPファイルを変更しない場合、テストする項目がありませんので、外しています。対象外ファイルを指定する例として指定してあります。baseコントローラーを変更しており、テストを行う対象にする場合は、解除対象から外してください。