somemo's diary

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

【symfony】テストツールlime

symfony1系を使うことはもうなさそうですが、仕事で使っているフレームワークが1系なので試してみました。

lime

symfony独自のテストツールです。新しいバージョンであれば、lib/vendorディレクトリにあるでしょう。PHPUnitと違って、クラスベースではなくファイルにphpでずらっと書いていくとことが違います。

準備

なんと1.0.8で試しています・・・。そのため、標準でtestディレクトリがないので作成していきます。sf_rootで下記を実行します。

mkdir test
cd test
mkdir bootstrap
mkdir functional
mkdir unit

test用のディレクトリを作成しました。テスト準備をするためのbootstrapファイル、機能・単体テストコードを格納するディレクトリです。

limeだけでテスト

symfonyコマンドを使わずにテストします。作成したディレクトリとは何も関係ありません。

<?php
require_once '/usr/local/lib/php/symfony/vendor/lime/lime.php';

$test = new lime_test(1, new lime_output_color());
$test->ok(true, 1 === 1);

テスト用にlimeのオブジェクトを生成します。その際に、テストする数と、出力に色をつけるためのクラスを渡しています。上記の内容を保存し実行してみます。実行方法と、出力は以下の通りです。

php test.php
1..1
ok 1 - 1
 Looks like everything went fine.

単純にphpを実行するだけです。「ok 1」と一番しの行が緑で表示されます。1はもちろん1なので、無事に成功しました。メソッドの内容が分かりやすいのも特徴です。

単体テスト

symfonyコマンドを使って単体テストをします。下記ファイルをbootstrapディレクトリにコピーしておきます。

cp /usr/local/lib/php/data/symfony/skeleton/project/test/bootstrap/unit.php test/bootstrap

bootstrapの中身は以下の通りです。

$_test_dir = realpath(dirname(__FILE__).'/..');
define('SF_ROOT_DIR', realpath($_test_dir.'/..'));

// symfony directories
include(SF_ROOT_DIR.DIRECTORY_SEPARATOR.'config'.DIRECTORY_SEPARATOR.'config.php');

require_once($sf_symfony_lib_dir.'/vendor/lime/lime.php');

rootディレクトリの設定後config/config.phpを読み込み、symfonyライブラリのディレクトリからlimeを探し出しているだけです。それでは、単体テストコードを作成します。test/unitに testTest.php を作成しました。

<?php

include_once(dirname(__FILE__).'/../bootstrap/unit.php');

$test = new lime_test(1, new lime_output_color());
$test->ok(true, 1 === 1);

bootstrapを読み込んでいる以外は、一番最初と変わりません。以下のコマンドで実行します。Testの前までのファイル名を指定する決まりになっています。

symfony unit-test test

機能テスト

symfonyコマンドを使って機能テストをします。ただし、今回は中身のないテストで、実行できるところまでを試します。下記ファイルをbootstrapディレクトリにコピーしておきます。

cp /usr/local/lib/php/data/symfony/skeleton/project/test/functional/unit.php test/bootstrap

bootstrapの中身は以下の通りです。

<?php

// guess current application
if (!isset($app))
{
  $traces = debug_backtrace();
  $caller = $traces[0];
  $app = array_pop(explode(DIRECTORY_SEPARATOR, dirname($caller['file'])));
}

// define symfony constant
define('SF_ROOT_DIR',    realpath(dirname(__FILE__).'/../..'));
define('SF_APP',         $app);
define('SF_ENVIRONMENT', 'test');
define('SF_DEBUG',       true);

// initialize symfony
require_once(SF_ROOT_DIR.DIRECTORY_SEPARATOR.'apps'.DIRECTORY_SEPARATOR.SF_APP.DIRECTORY_SEPARATOR.'config'.DIRECTORY_SEPARATOR.'config.php');

// remove all cache
sfToolkit::clearDirectory(sfConfig::get('sf_cache_dir'));

どのアプリケーションを試すかを設定します。その後、index.phpやfrontend_dev.phpと同様に環境の設定をしています。test環境用の設定になります。機能テストは疑似的にアクセスをしてその結果が正しいことを試すので、アプリケーションの設定を読み込みます。最後に、キャッシュを削除しています。

機能テストコードの作成前に test/functionalに アプリケーション別のディレクトリを作成します。作成したディレクトリに、testActionTest.php を作成しました。テストコードは以下の通りです。

include(dirname(__FILE__).'/../../bootstrap/functional.php');

// create a new test browser
$browser = new sfTestBrowser();
$browser->initialize();

bootstrapを読み込み、テスト用のsymfony独自の内部ブラウザを作成します。初期化後、テストしたい内容を書いていきます。実行は以下の通りです。こちらも単体と同様、Testの前までのファイル名を指定します。加えて、アプリケーション名を指定します。

symfony test-functional frontend testActions

なにもテストしていないので、出力はありません。これでテスト環境が整いました。