http://trac.piece-framework.com/sh-testrunner/wiki/ja/Start
http://trac.piece-framework.com/sh-testrunner/wiki/ja/ReleaseNotes/2.0.0
Piece FrameworkのプロダクトStagehand_TestrunnerがVersion2.0.0になり,PHPSpecが使えるようになったそうです.PHPSpecをまともに使ったこと無いので,まとめてインストールしてみます.環境はテスト版debian(lenny)で,pearはインストール済み,root権限が必要なものはsudoで実行します.
PHPSpecのインストール
% sudo pear channel-discover pear.phpspec.org [sudo] password for tenkoma: Adding Channel "pear.phpspec.org" succeeded Discovery of channel "pear.phpspec.org" succeeded % sudo pear install phpspec/PHPSpec-beta downloading PHPSpec-0.2.3.tgz ... Starting to download PHPSpec-0.2.3.tgz (259,936 bytes) .....................................................done: 259,936 bytes downloading Console_Color-1.0.2.tgz ... Starting to download Console_Color-1.0.2.tgz (4,727 bytes) ...done: 4,727 bytes install ok: channel://pear.php.net/Console_Color-1.0.2 install ok: channel://pear.phpspec.org/PHPSpec-0.2.3
コマンドが実行できるか?
% phpspec No specs to execute!%
よし
PHPSpec用スペックを書く
次にスペックの為のクラスを書きます.スペックと仮実装はともに~/learn_phpspecディレクトリに保存することにします.
複数のスペック&仮実装の組み合わせを作っておいた方が,作業が楽になることが実感できると思ったので,2つサンプルを作ることにしました.
ひとつは,http://www.m-takagi.org/docs/php/phpspec/getting.started.htmlの例をそのまま,書きました.
仮実装クラスBowlingは,Bowling.phpと名前をつけて,DescribeNewBowlingGame.phpの最初で,
include_once('Bowling.php');
と読み込みます.
% phpspec DescribeNewBowlingGame.php . Finished in 0.00954985618591 seconds 1 examples, 0 failures
このように出力されれば,スペックを満たした実装がされていることが確認できたようです.(スペックも仮実装もスカスカですけどスペックのテストはパスしました)
もうひとつはテスト駆動開発入門で見たような,銀行の残高っぽいものを表現するクラスを仮実装しました.
DescribeNewAmount.php(スペック)
<?php include_once('Account.php'); class DescribeNewAmount extends PHPSpec_Context { private $_account = null; public function before() { $this->_account = new Account; } public function itShouldAmount10ForAccountAdd10() { $this->_account->add(10); $this->spec($this->_account->amount)->should->equal(10); } }
Account.php(仮実装)
<?php class Account { public $amount = 10; public function add() { } }
phpspec
% phpspec DescribeNewAmount.php . Finished in 0.00672078132629 seconds 1 examples, 0 failures
ok.
これで,~/learn_phpspecディレクトリの中身は以下の4つのスクリプトが在るはずです.
% ls -l 合計 16 -rw-r--r-- 1 tenkoma tenkoma 90 2008-02-04 10:24 Account.php -rw-r--r-- 1 tenkoma tenkoma 88 2008-02-04 09:53 Bowling.php -rw-r--r-- 1 tenkoma tenkoma 366 2008-02-04 10:25 DescribeNewAmount.php -rw-r--r-- 1 tenkoma tenkoma 417 2008-02-04 09:54 DescribeNewBowlingGame.php
Stagehand_TestRunnerのインストール
Stagehand_TestRunnerのインストールについて,すこし検索してもなかなか簡易な方法が見つかりませんでした.そうなるとSourceForge.netからDLしてインストール場所を決めて〜ってやらないといけないのかも,と思いましたが,第3回 Piece Frameworkのインストールと動作確認:Piece Frameworkによるブログアプリケーションの作成|gihyo.jp … 技術評論社などを見ると,PEARチャンネルが提供されているとのこと.それなら,PEARでいけるかも,と試してみました.
% sudo pear channel-discover pear.piece-framework.com Adding Channel "pear.piece-framework.com" succeeded Discovery of channel "pear.piece-framework.com" succeeded % sudo pear install piece/Stagehand_TestRunner downloading Stagehand_TestRunner-2.0.0.tgz ... Starting to download Stagehand_TestRunner-2.0.0.tgz (13,047 bytes) .....done: 13,047 bytes install ok: channel://pear.piece-framework.com/Stagehand_TestRunner-2.0.0 % sudo pear list -c pear.piece-framework.com INSTALLED PACKAGES, CHANNEL PEAR.PIECE-FRAMEWORK.COM: ===================================================== PACKAGE VERSION STATE Stagehand_TestRunner 2.0.0 stable
include_pathの設定
http://trac.piece-framework.com/sh-testrunner/wiki/ja/ReleaseNotes/2.0.0によると,include_pathを設定する,と書かれています.
コマンドライン版のphp.iniに追記します.
元々のinclude_pathの値が定義されている所がわからなかったので,調べます.
% php -r "echo get_include_path();" .:/usr/share/php:/usr/share/pear
これをふまえて/etc/php5/cli/php.iniの487行目に以下の行を追加しました.
include_path = ".:/usr/share/php:/usr/share/pear:/usr/share/php/src"
やっと,まとめてテストを試してみるよ!
http://trac.piece-framework.com/sh-testrunner/wiki/ja/ReleaseNotes/2.0.0によると,specrunnerコマンドを使えばいいらしい.
% specrunner Finished in 1.00135803223E-5 seconds 0 examples, 0 failures
んー,コマンドは実行されましたが,スペックは読み込まれず,テストされていないようです…
スペックの規則
Stagehand/TestRunner/ にある Common.php と PHPSpec.php を眺めたところ,おそらく,特定のパターンに従っていないファイル,クラスは読み込まれない模様.その規則は,
- スペックのファイル名は,Spec.phpで終わること
- スペックのクラスは,
- 親クラスが,PHPSpec_Contextクラスでなければならない
- クラス名が,Describeで始まるか(頭文字は小文字でも可),Specで終わる(頭文字は小文字可)のどちらかを満たす
ということのようです.
先ほど作成したサンプルではファイル名がSpec.phpで終わっていないのでこれを修正.
% mv DescribeNewAmount.php DescribeNewAmountSpec.php % mv DescribeNewBowlingGame.php DescribeNewBowlingGameSpec.php
もういちどやってみます.
% specrunner Loading [ DescribeNewBowlingGameSpec.php ] ... Succeeded. => Added [ DescribeNewBowlingGame ] Loading [ DescribeNewAmountSpec.php ] ... Succeeded. => Added [ DescribeNewAmount ] .. Finished in 0.00546598434448 seconds new bowling game - should score0 for gutter game new amount - should amount10 for account add10 2 examples, 0 failures
できました!
スペックを記述して,specrunnerコマンドを実行するだけで,特定のディレクトリにあるスペックがすべてテストされます.