somemo programming etc.

プログラマ、雑記、プログラミング関係はLinkから、数式はこっちでまとめていることが多い

【Symfony2】テスト環境の作成

Symfony2でテストを実行したので、メモしておきます。

PHPUnit

バンドル作成時にも書きましたがSymfony2ではPHPUnitを使用しています。まずは、PHPUnitの環境を整えましょう。自分は、3.5.15をインストールしています。Zendのときに失敗した3.5.16(今はそれ以上?)は動くのかな?

設定ファイル

Symfony2ではappディレクトリ配下に「phpunit.xml.dist」というファイルがあります。このファイルを修正してphpunit.xmlを作成してテストします。

設定ファイルを読み込むには、-cオプションで設定ファイル本体のパス指定します。指定しない場合、PHPUnitを実行したときのカレントディレクトリにphpunit.xmlが存在していれば読み込みます。または、-cオプションで設定ファイルの存在するディレクトリを指定してもいけるようです(Symfony2日本語ドキュメントより)。自分は、app/consoleも実行できるプロジェクトルートでの設定ファイルのディレクトリ指定で実行がいいと思いました。

phpunit.xml.dist

デフォルトの設定は以下のとおりです。

<?xml version="1.0" encoding="UTF-8"?>

<!-- http://www.phpunit.de/manual/current/en/appendixes.configuration.html -->
<phpunit
    backupGlobals               = "false"
    backupStaticAttributes      = "false"
    colors                      = "true"
    convertErrorsToExceptions   = "true"
    convertNoticesToExceptions  = "true"
    convertWarningsToExceptions = "true"
    processIsolation            = "false"
    stopOnFailure               = "false"
    syntaxCheck                 = "false"
    bootstrap                   = "bootstrap.php.cache" >

    <testsuites>
        <testsuite name="Project Test Suite">
            <directory>../src/*/*Bundle/Tests</directory>
            <directory>../src/*/Bundle/*Bundle/Tests</directory>
        </testsuite>
    </testsuites>

    <!--
    <php>
        <server name="KERNEL_DIR" value="/path/to/your/app/" />
    </php>
    -->

    <filter>
        <whitelist>
            <directory>../src</directory>
            <exclude>
                <directory>../src/*/*Bundle/Resources</directory>
                <directory>../src/*/*Bundle/Tests</directory>
                <directory>../src/*/Bundle/*Bundle/Resources</directory>
                <directory>../src/*/Bundle/*Bundle/Tests</directory>
            </exclude>
        </whitelist>
    </filter>

</phpunit>

起動時の初期設定

bootstrapに指定しているapp/bootstrap.php.cacheが実行されます。この中で、まずファイルを読み込んでいます。

namespace { require_once __DIR__.'/autoload.php'; }

読み込んでいるファイルはオートロード用のファイルで、グローバル名前空間に対して読み込んでいます。

また、このファイルには色々なクラスを1ファイルにまとめているようです。ほとんどが、バンドルに存在するものを引き抜いているような感じです。それぞれに合った名前空間を定義しています。

テスト対象

testsuitesに指定しているsrcディレクトリ以下のバンドルが対象です。

カバレッジ対象

filterに指定しているwhitelistが対象です。excludeに指定していると対象外になります。

php変数の指定

phpに指定している要素がphpの$_系変数になります。xmlの中では、server変数KERNEL_DIRキーの設定がコメントアウトされています。

テストの実行

phpunitコマンドを実行するだけです。コマンドプロンプトからは実行できましたが、MakeGoodでは実行できませんでした。後藤さんのgistや、同じことで困っている海外の人に対する久保さんの回答をまとめようとしていたら、PHPメンタ―ズとしてまとめていたようです(Stagehand_TestRunnerおよびMakeGoodによるSymfonyの機能テストの実行)。

Symfony2では、server変数KERNEL_DIRキーの値に設定されたディレクトリからKernelを実行するため、必要になるみたいです。起動時の初期設定で説明したbootstrap.php.cacheのオートロード後に設定するのがベストなようです。