PHP5.3.3入れたメモと超便利なStagehand_Testrunnerについて

最近になってDIコンテナについて社内勉強会をしようと思い立ち参考になる資料をググってたところ、Symfonyデベロッパである Fabien Potencier さんのスライド
Dependency Injection with PHP 5.3 を発見し、そのまま皆でスライドを読み進めていく等しました。

この資料はSymfony2に新しく加わるDIのコンポーネントである「Dependency Injection」の実装を参考に、PHP5.3系でのDIコンテナの実装とそのメリット等が説明されています。
クロージャの使い方等も解説してあって、PHP5.3でのOOPの学習にもなってかなり勉強になりました。


というわけで、PHP5.3を本格的に使い出したい…とモチベーションも高まったところで、最近リリースされたばかりの5.3.3をインストールしてみる事にしたので、備忘録として残します。
ついでにTDD環境も構築しようと思い、PHPUnitと、テストランナーであるStagehand_Testrunnerもインストールする事に。


PHP5.3.3

phpproのエントリー を見ると、「後方非互換の変更」があるとの事。

後方非互換な変更として、名前空間に属するクラスにおいてクラス名と同名のメソッドが定義されている場合、5.3.2まではコンストラクタとして扱われていましたが、5.3.3では通常のメソッドと同様に扱われるようになります。

という事で、PHP4から移行する場合には注意が必要ですね。
(PHP4システムのメンテナの皆様、お疲れ様です。。)


では以下作業ログ。まっさらなUbuntu10.04に入れました。(configureオプションは適宜)

% apt-get update
% apt-get install build-essential

% cd /usr/lib
% ln -s libxml2.so.2 libxml2.so

% apt-get install libxml2-dev
% apt-get install apache2-prefork-dev
% apt-get install libcurl4-openssl-dev
% apt-get install libpng12-dev

% cd /usr/local/lib
% wget http://jp2.php.net/get/php-5.3.3.tar.gz/from/jp.php.net/mirror
% tar zxvf php-5.3.3.tar.gz
% cd ./php-5.3.3
% ./configure --prefix=/usr/local/lib/php --with-apxs2=/usr/bin/apxs2 --enable-pcntl --enable-mbstring --enable-mbregex --enable-zend-multibyte --with-mysql --with-gd --with-curl --with-openssl --with-pear=/usr/local/lib/php
% make
% make install

PHPUnit3.4.15

次にPHPUnit。公式リファレンスは以下。
PHPUnit Manual

Pearコマンドからインストールできます。
現在最新版の3.5系がリリースされていますが今のところベータ版で、Pearコマンドでインストールされるのは3.4系になります。

% apt-get install php-pear
% pear channel-discover pear.phpunit.de
% pear channel-discover pear.symfony-project.com
% pear install phpunit/PHPUnit

Stagehand_Testrunner2.12.0

次にStagehand_Testrunner。
これはPHPフレームワークの一つである、Piece Framework のプロダクトの一環としてリリースされているライブラリで、
PHPUnit, PHPT, SimpleTest, PHPSpec といった各種テスティングフレームワークをより便利に利用できるようにしてくれるツールです。
id:heavenshell さんにTwitterで教えてもらいました。感謝)


プロジェクトホームは以下。
Stagehand_Testrunner

詳細は開発元である @iteman さんのエントリー
PHP で快適なテスト駆動開発を - Stagehand_TestRunner の特徴と使い方を知る
も参考に。


Pearコマンドからインストールできます。
依存しているライブラリが多いのですが、以下のようにインストールしていけばOKでした。

% pear channel-discover pear.piece-framework.com
% pear install piece/stagehand_accesscontrol-beta
% pear install piece/stagehand_legacyerror-0.3.1
% pear install piece/stagehand_directoryscanner
% pear install piece/stagehand_alterationmonitor
% pear install piece/stagehand_clicontroller-beta
% pear install piece/stagehand_testrunner

# 以下はオプション。任意で。
% pear install Console_Color
% pear install Net_Growl-beta

# 適宜パス通す
% vi /etc/php5/cli/php.ini
> include_path = ".:/usr/share/php:/usr/share/php/src/"


これで、各種機能が使えます。
詳しくはユーザーガイドを見ていただくと良いかと思います。

# 指定したディレクトリ配下のテストを全て実行
% phpunitrunner -R DIRECTORY

# テストの実行結果に色付けできる (Console_Color 必要)
% phpunitrunner -c DIRECTORY_OR_FILE

# Growlへテスト結果を通知する (Net_Growl 必要)
% phpunitrunner -g DIRECTORY_OR_FILE

Growlは現在動いていないようで、チケット192に登録されてました。次のバージョンに期待。


他にも色々できるんですが、自分が一番欲しかった機能が、ディレクトリの監視。

% phpunitrunner -a DIRECTORY

で、指定ディレクトリを監視。
ディレクトリ内のファイルを更新したり、新規ファイルを作成したりすると、テストが自動で走るというものです。
これを使えばファイル編集のたびに phpunit hogehoge... とタイプする手間がはぶけます。


で、使ってみたんですがエラーが出てどうにも使えない、という事態に。

% phpunitrunner -a DIRECTORY
で監視開始し、ファイルに変更を加えると…

ERROR: The directory or file [ -R ] is not found
というエラーメッセージが出て動かない

ファイル構成が悪いのかなあと思い、色々と変更してみたり、オプションを変えて試したりしたが動かない。
困ってTwitterでつぶやいていたところ @heavenshell さんが捕捉してくれて、開発者の @iteman さんに報告してくれました。

その後、一連のやりとりは @iteman さんが Togetter にまとめてくださいました。


最終的に僕の環境では以下のコマンドで正常に動きました。

% php /usr/bin/phpunitrunner -a DIRECTORY

この件はチケット196が切られており、次回リリース分では改修される予定のようです。

とても便利なツールだと思いますので、TDDされてる方は利用されてみてはいかがでしょうか!


最後になりますが @heavenshellさん、@itemanさん、今回は色々とお付き合い頂きありがとうございました!