読者です 読者をやめる 読者になる 読者になる

Engineer as a Lifestyle @tenkoma

tenkoma's testing blog

Stagehand_Testrunner 2.0.0 で PHPSpecを利用する

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コマンドを実行するだけで,特定のディレクトリにあるスペックがすべてテストされます.

specrunnerのオプション

  • -R サブディレクトリも再帰的に検索してスペックをテスト
  • -c テスト結果に色がつきます.

今日理解できたのはここまで.続く…?