Zend Frameworkでのユニットテスト
Zend Frameworkでのユニットテスト
Zend Frameworkでユニットテストを始める方法、詰まりZend_Testコンポーネントの使い方です。 確認した環境は
- Ubuntu 10.04 Desktop 64bit
- Apache 2.2
- PHP 5.3.2
- Zend Framwork 1.10.0
です。
取り敢えずZend Frameworkをインストールしたならzfコマンドが使える筈なので、好きなディレクトリーで
zf create project MyApp
として、プロジェクト用のディレクトリーを作りましょう。
そんで、Apacheの設定をして、MyApp/publicが公開ディレクトリーになるようにしてください。
localhostにアクセスしてこんな画面が表示されるようにしたところからスタートです。
PHPUnitのインストール
PHPUnitをインストールしてください。公式サイトに方法が載っていますし、UbuntuならSynaptic(つまりapt)からインストールできます。
PHPUnitのブートストラップの設定
プロジェクトディレクトリーに、testsがあって、その中にphpunit.xmlというファイルがある筈です。これを開いて次のように書き込んでください。
<phpunit bootstrap="test_helper.php" colors="true"> </phpunit>
test_helper.phpはこれから作るファイルなので、任意の名前でOKです。colors="true"は、テスト結果に色を着けてくれるオプションです。
その他色々なオプションやら要素やらを書き加えられます。PHPUnitのサイトのドキュメントを参照してください。
これで、testsディレクトリーからphpunitコマンドを実行する時に、test_helper.phpを読み込むようになります。詰まりここでテストの初期化の処理を書けばいいわけです。ファイルを作ってこうします。
<?php // Define path to application directory defined('APPLICATION_PATH') || define('APPLICATION_PATH', realpath(dirname(__FILE__) . '/../application')); // Define application environment defined('APPLICATION_ENV') || define('APPLICATION_ENV', (getenv('APPLICATION_ENV') ? getenv('APPLICATION_ENV') : 'development')); define('APPLICATION_TEST_BOOTSTRAP_PATH', realpath(dirname(__FILE___) . '/application/bootstrap.php')); define('LIBRARY_TEST_BOOTSTRAP_PATH', realpath(dirname(__FILE___) . '/library/bootstrap.php')); set_include_path( APPLICATION_PATH . '/../library' . PATH_SEPARATOR . APPLICATION_PATH . '/controllers' . PATH_SEPARATOR . APPLICATION_PATH . '/models' . PATH_SEPARATOR . get_include_path() ); require_once 'Zend/Loader/Autoloader.php'; $autoloader = Zend_Loader_Autoloader::getInstance(); $autoloader->setFallbackAutoloader(TRUE);
前半はpublic/index.phpにあったのをそのまま持って来ています。
Zend_Test_PHPUnitのブートストラップの設定
tests/application/bootstrap.phpに、アプリケーションのテストの初期化設定を書きます(他にライブラリーの初期化設定を書くファイルとしてtests/library/bootstrap.phpがあります)。
<?php $this->bootstrap = new Zend_Application( APPLICATION_ENV, APPLICATION_PATH . '/configs/application.ini' ); $this->bootstrap(); $this->_frontController = $this->bootstrap->getBootstrap()->getResource('frontcontroller');
テストを書く
これで、テストを書く準備ができました。試しにtests/applicadtion/IndexControllerTest.phpをこういう風に作ってみてください。
<?php require_once dirname(__FILE__) . '/../test_helper.php'; class IndexControllerTest extends Zend_Test_PHPUnit_ControllerTestCase { public $bootstrap = APPLICATION_TEST_BOOTSTRAP_PATH; public function testIndex() { $this->dispatch('/'); $this->assertQuery('div#welcome'); $this->assertQuery('div.welcome'); } }
テストケースクラスのbootstrapプロパティに、フルパスでさっき書いたbootstrap.phpファイルの場所を入れるのがポイントです。
そして、phpunitコマンドを実行します。
cd ~/MyApp/tests phpunit application/IndexControllerTest
こんな感じで結果が出る筈です(赤色が着くと思います)。
PHPUnit 3.4.5 by Sebastian Bergmann. F Time: 1 second, Memory: 11.50Mb There was 1 failure: 1) IndexControllerTest::testIndex Failed asserting node DENOTED BY div.welcome EXISTS /usr/share/php/Zend/Test/PHPUnit/Constraint/DomQuery.php:256 /usr/share/php/Zend/Test/PHPUnit/ControllerTestCase.php:291 /home/user/MyApp/tests/application/IndexControllerTest.php:13 FAILURES! Tests: 1, Assertions: 2, Failures: 1.
二つのアサーションのうち、一つが失敗していることを意味します。div.welcomeがある筈だけど無いよ、って言われています。div#welcomeは、ある筈で実際あったので何も言われていません。
あとは、Zend_Testのドキュメントを見ながらテストを書いていけばオッケーです。
Keyword(s):
References: