Zend_Testを利用するための準備
Zend_Testコンポーネントを利用するためには外部ライブラリであるPHPUnitをインストールする必要があります。最初に、PHPUnitをインストールする手順について説明します。
次に、MVC環境を構築した上で、テストを記述するための準備を行う手順についても説明します。なお、MVC環境の構築の方法については以前の記事『コマンドラインからのPHPアプリケーション管理 - Zend_Tool - 』(CodeZine)も参照ください。
PHPUnitの準備
ではさっそくPHPUnitをインストールしましょう。PHPUnitはPEARを利用してインストールします。
>pear channel-discover pear.phpunit.de ... >pear channel-discover components.ez.no ... >pear channel-discover pear.symfony-project.com ... >pear install phpunit/PHPUnit ...
最初の3つのコマンド「channel-discover」は追加するパッケージがある場所を指定しています。最初の行は今回インストールするPHPUnit本体の場所を、他の2行はPHPUnitが依存しているパッケージの場所を指定しています。そして、最後のinstallコマンドでPHPUnitをインストールするように指示しています。
なお、インストール直後のPHPの場合、PEARのバージョンの関係でいくつかのパッケージのインストールについてエラーが発生することがあります。エラーが発生した場合はコラムを参照してPEARのバージョンを上げてから、再度インストールに挑戦してください。
PHPUnitをインストールする際にPEARのバージョンの関係でエラーが発生する場合があります。例えばPHP5.3.5付属のgo-pear.batを利用してインストールされたPEARバージョン1.9.0はPHPUnitをインストールすることができません。
この場合、一部のパッケージのインストールには成功しており、エラーは先頭でのみ表示されているため、注意が必要です:
phpunit/PHPUnit requires PEAR Installer (version >= 1.9.1), installed version is 1.9.0 phpunit/PHPUnit can optionally use PHP extension "dbus" ...(中略) downloading Text_Template-1.1.0.tgz ... Starting to download Text_Template-1.1.0.tgz (2,783 bytes) ....done: 2,783 bytes ...(中略) install ok: channel://components.ez.no/ConsoleTools-1.6.1
PEARのバージョンの問題でPHPUnitのインストールに失敗する場合には次のようにPEARのアップグレードをする必要があります。
>pear upgrade
これで、PHPUnitをインストールできる最新(執筆時点ではバージョン1.9.1)のPEARにアップグレードできます。
MVC環境の準備
今回テストを記述する対象のシステムは、Zend FrameworkのMVC環境を利用したWebアプリケーションです。まずはzfコマンドでZend FrameworkのMVC環境を構築します。
>zf.bat create project codezine
▼
Creating project at C:/codezine Note: This command created a web project, for more information setting up your VHOST, please see docs/README
この作業でデフォルトのMVC環境のファイル構成が作成されますが、この中にtestsフォルダがあります。このtestsフォルダには、zfコマンドで作成された部品に対応するテストの雛形が自動的に設置されます。例えば、次のようにIndexコントローラを作成したとします。
>zf.bat create controller Index
▼
Creating a controller at C:\codezine/application/controllers/IndexController.php Creating an index action method in controller Index Creating a view script for the index action method at C:\codezine/application/views/scripts/index/index.phtml Creating a controller test file at C:\codezine/tests/application/controllers/IndexControllerTest.php Updating project profile 'C:\codezine/.zfproject.xml'
これを実行した後のtestsディレクトリ以下のファイル構成は次のようになります。
codezine │ (他のディレクトリは省略) └tests │ phpunit.xml テスト全体の設定 │ ├─application アプリケーションのテストを格納 │ │ bootstrap.php テスト環境の設定 │ │ │ └─controllers コントーラのテストを格納 │ │ (create controller で追加) │ │IndexControllerTest.php Indexコントローラのテスト │ │ (create controller で追加) │ └─library ライブラリのテストを格納 bootstrap.php テスト環境の設定 ※「controllers」ディレクトリと「IndexControllerTest.php」ファイルはリスト3で作成
ここで作成したファイルのうちphpunit.xmlにどのようなテストを行うかに関しての設定を、bootstrap.phpにテストを行う際のアプリケーション環境の設定を、IndexControllerTest.phpにIndexコントローラのためのテストを記述します。
なお、Zend_Testコンポーネントの出力は、デフォルトではErrorコントローラを利用します。今回はサンプルを単純にするため、環境の構築を担当するブートストラップオブジェクトは作成しないことにします。そのため、次のようにエラーコントローラのコードに修正を行います。
public function getLog() { $bootstrap = $this->getInvokeArg('bootstrap'); if (!$bootstrap->hasResource('Log')) { return false; } $log = $bootstrap->getResource('Log'); return $log; }
▼
public function getLog() { $bootstrap = $this->getInvokeArg('bootstrap'); if ($bootstrap == null) {//このif文を追加 return false; } if (!$bootstrap->hasResource('Log')) { return false; } $log = $bootstrap->getResource('Log'); return $log; }
このgetLogメソッドは、MVC環境にログを記録するオブジェクトが登録されている場合に、そのログ記録用のオブジェクトを返します。その際、環境構築を行うブートストラップオブジェクトからログのためのオブジェクトを取得するのですが、今回のテストで利用する環境ではブートストラップオブジェクトを構築しません。元のコードではブートストラップオブジェクトが存在する前提なので、if文を1つ加えてブートストラップオブジェクトがない場合の処理を追加しています。