テストファーストで作成するsymfonyプラグイン

昨日はsymfony懇親会が開催されました。参加された皆様おつかれさまでした。
また、場所を提供してくださったディノさんありがとうございました。

さて、昨日の自己紹介時にsymfonyプラグイン作成が充実してきた的なことを言ったのですが、簡単にまとめておきます。

といっても、本家のブログで紹介されています。

The sfTaskExtraPlugin is a plugin maintained by the symfony core team. It adds a number of useful tasks to your symfony command line to help streamline your workflow.

なので、ここでは上記ブログのテスト部分の補足です。

まず、sfTaskExtraPluginはsymfonyプラグインを作るためのプラグインです。
インストールすることで

* generate:plugin (空のプラグインを作成)
* generate:plugin-module (モジュールを含む空のプラグインを作成)
* plugin:package (作成したファイルからプラグインを作成)

のコマンドが利用できるようになります。

ただし、空のプラグインを作成するといっても、標準ではテストディレクトリも作成してくれます。
それも中途半端なテストディレクトリではありません。

myPluginというプラグインを作ってみます。

$ ./symfony generate:plugin myPlugin

すると、以下のようなファイル群が作成されます。

plugins/myPlugin
|-- LICENSE
|-- README
|-- config
|   `-- myPluginConfiguration.class.php
|-- package.xml.tmpl
`-- test
    |-- bin
    |   `-- prove.php (全てのテストを実行するためのスクリプト)
    |-- bootstrap
    |   |-- functional.php(機能テストのときに読み込ませるファイル。test/fixtures以下を実行)
    |   `-- unit.php(単体テストのときに読み込ませるファイル)
    `-- fixtures
        `-- project(プラグインのテストのために用意されたsymfonyプロジェクトファイル群)
            |-- apps
            |   `-- frontend
            |       |-- config
            |       |   |-- app.yml
            |       |   |-- cache.yml
            |       |   |-- factories.yml
            |       |   |-- filters.yml
            |       |   |-- frontendConfiguration.class.php
            |       |   |-- routing.yml
            |       |   |-- security.yml
            |       |   |-- settings.yml
            |       |   `-- view.yml
            |       |-- i18n
            |       |-- lib
            |       |   `-- myUser.class.php
            |       |-- modules
            |       `-- templates
            |           `-- layout.php
            |-- cache
            |-- config
            |   |-- ProjectConfiguration.class.php
            |   |-- databases.yml
            |   |-- propel.ini
            |   |-- properties.ini
            |   |-- rsync_exclude.txt
            |   `-- schema.yml
            |-- data
            |   `-- fixtures
            |       `-- fixtures.yml
            |-- doc
            |-- lib
            |-- log
            |-- plugins
            |-- symfony
            |-- test
            |   |-- bootstrap
            |   |   |-- functional.php
            |   |   `-- unit.php
            |   |-- functional
            |   `-- unit
            `-- web
                |-- css
                |   `-- main.css
                |-- images
                |-- js
                |-- robots.txt
                `-- uploads
                    `-- assets

テストのためにこれでもかというぐらい用意してくれます。
(ただプロジェクトの雛形をコピーしているだけですが。)

とくに、機能テストを行うときに参照するプロジェクト、アプリケーション、モジュールもtest/fixturesディレクトリに作成することができ、なおかつコマンドから簡単に実行することができるのです。

テストを作成するのも簡単です。
test/unit, test/functionalディレクトリを作成し、そこにテストファイルをファイル名がTest.phpで終わるように作成するだけです。

そして、それぞれのbootstrapのファイルをincludeしておきます。

test/unit/sampleTest.phpの場合

<?php
include(dirname(__FILE__) . '/../bootstrap/unit.php');
$t = new lime_test(1, new lime_output_color());
$t->diag('check method');
....

また、汎用的になるようにsymfonyのlibディレクトリへのパスは$_SERVER['SYMFONY']で参照するようになっています。なのでLinux系であれば以下のように環境変数をセットしておく必要があります。

$ export SYMFONY=/path-to-symfony/lib

ローカル環境、テスト環境などでパスが異なる場合でもハードコーディングせずに済むというメリットがあります。

あとは、テストを実行するだけです。

$ php ./plugin/myPlugin/test/unit/sampleTest.php

全てのテストを実行する場合は

$ php ./plugin/myPlugin/test/bin/prove.php

このsfTaskExtraPluginの良いところはテストを自動生成するのではなく、テストするための環境を作ってくれるということです。

テストファーストで開発を行いたいけどテスト開発するための準備が面倒だと感じている方も多いのではないでしょうか?

そういう私のような人間にはぴったりなプラグインによる開発についてでした。

また、plugin:packageを叩いたときに、このテストディレクトリは含まれないようにパッケージされます。