Zend Framework PHPUnit

いままで、テストにはSimpleTestを使っていました。
CakePHPethnaだとSimpleTestを使っていると思います。
ethna
http://ethna.jp/ethna-document-dev_guide-misc-unittest.html
CakePHP
http://bakery.cakephp.org/articles/view/testing-models-with-cakephp-1-2-test-suite

Zend FrameworkではPHPUnitです。特に大きな違いはないので意識してなかったのですが、Zend Serverを入れたついでに一通り確認したいと思います。xamppだと、PHPUnitはデフォルトでインストールされていますが、。Zend Serverの場合は自前でやる必要があります。
http://framework.zend.com/wiki/display/ZFDEV/Testing+Standards
Zend Studioで作成されるtestプロジェクトには、アプリケーション用のテストも付随してきます。

やってみる

Windows Vista + Zend Serverでpearを有効にする手順は
http://d.hatena.ne.jp/noopable/20090307/1236448509
で書きましたので、その続きから。(*1
まず、pear upgrade PEARとして、アップグレードしときます。

PHPUnitをインストールする

http://www.phpunit.de/manual/3.0/ja/installation.html
ここにわかりやすく書いてあります。*2

xdebugをインストールする

xdebugを入れておくと、code-coverage reports をHTMLで受け取ることができる。code-coverage自体はZend StudioとZend Debuggerで育成できるのだが、一応一通りは試しておきたい。
さて、pecl install xdebugすると、

ERROR: Did not understand the completion status returned from msdev.exe.

といって叱られました。http://pecl.php.net/bugs/bug.php?id=13099ここに、それらしきレポートが上がっていますが、解決策は出ていないっぽい。msdev.exeはVSでインストールできるようなので、自前でインストールしてもいいんだけど、XPのマシンに乗っていて今のマシン用のライセンスがないのでやめておきました。
代わりに、http://xdebug.org/download.phpここからバイナリを持ってきて、強制的にセットしてみます。
C:\Program Files\Zend\ZendServer\lib\phpextここに、php_xdebug-2.0.4-5.2.8-nts.dllをセット。次に、php.iniにextensionとして指定します。

[XDebug]
;; Only Zend OR (!) XDebug
;zend_extension="php_xdebug-2.0.4-5.2.8-nts.dll"
;zend_extension_ts="php_xdebug-2.0.4-5.2.8-nts.dll"
;zend_extension_debug="php_xdebug-2.0.4-5.2.8-nts.dll"
extension = php_xdebug-2.0.4-5.2.8-nts.dll
;xdebug.remote_enable=true
xdebug.remote_host=127.0.0.1
xdebug.remote_port=9000
xdebug.remote_handler=dbgp
;xdebug.profiler_enable=1
xdebug.profiler_output_dir="C:\Program Files\Zend\ZendServer\tmp\xdebug"

zend_extensionとしてロードしようとすると、ロードできませんでした。なぜか、通常のextensionとしてロードさせると、xdebugとして認識します。ただ、XDEBUG NOT LOADED AS ZEND EXTENSION という警告を残すので違うのかもしれない。
Zend Serverはnon thread safeでdebug buildされていないので、zend_extension = にして、フルパスで指定するのが無難だと思うんですが、だめでした。

これで、ログを見てわかったのですが、Zend Serverの管理ツールはZend Frameworkで出来ています。
 *nixサーバー上であれば、おそらくpearxdebugをインストールできるので、この辺の処理は自動的に通過すると思う。

Zend Framework付属のフレームワークテストを実行する

phpunit --report D:\tmp AllTests.php

これで実行するわけですが、あれれれ。。やっぱりxdebugを検討しないとだめですが、xamppでは普通に実行できたんですが。。

The Xdebug extension is not loaded.

xdebugの指定によっては、メッセージは出ずハングアップしてFastCGIが停止するので、だめっぽいです。
この件、xamppに戻せば問題ないので、Zend StudioデバッグしたいときはZend Server、テストを実行したいときはxamppという残念な構成にせざるを得ないのかもしれない。

再度確認。

情報をあさっていたところ、devzoneに情報発見

You should not load any other Zend extensions while working with xdebug, because they would probably use the same internal mechanisms in the Zend engine, which usually calls for trouble. Not all Zend extensions work together with xdebug. Since you will probably use xdebug on a development system rather than a live system, this is no serious limitation. The most important rule is to not mix xdebug with other PHP debugger extensions.

http://devzone.zend.com/article/2930-Debugging-PHP-applications-with-xdebug

他のZend Extensionとxdebugを一緒にするなということみたいですね。
紆余曲折しましたが、これで納得。
Zend ServerではZend ExtensionはExtensionManagerで一括で管理されるので、xdebugを使いたいときはphp.iniで

; zend_extension="C:\Program Files\Zend\ZendServer\lib\ZendExtensionManager.dll"

この行をコメントアウトする。交代でXdebugを有効にする。この手順を踏むと、自慢のZend ServerのGUIは使えなくなるので、自前でphp.iniを編集する。

[XDebug]
zend_extension="C:\Program Files\Zend\ZendServer\bin\php_xdebug-2.0.4-5.2.8-nts.dll"

とりあえず、フルパスで。これでxdebugがロードされたことが確認できる。

C:\Windows\System32>php -v
PHP 5.2.8 (cli) (built: Feb 4 2009 17:55:55)
Copyright (c) 1997-2008 The PHP Group
Zend Engine v2.2.0, Copyright (c) 1998-2008 Zend Technologies
with Xdebug v2.0.4, Copyright (c) 2002-2008, by Derick Rethans

実際に、profileをとることができ、wincachegrindで確認まで問題なく処理できた。

ということで、Zend Serverでxdebugを使うときは、Zend Extensionを根こそぎOFFにすること。

*1:例によってコマンドプロンプトは右クリックから「管理者として実行」から。Program Filesにインストールした場合

*2:パーソナルファイアウォールについてはOFFにした方がいいかもしれない。