[PHP] limeでTDDを体験する

PerlのTest::Moreに相当するものが、PHPではlime.phpというやつである。

Kwappa開発室-TDDを体験する という記事で、PHPUnitを使ってTDD体験という話が大変面白かった。
私も体験してみようと思ったが、limeしか使えないのでlimeでTDD体験をしてみた。

準備

lime.phpを入手して、WEBサーバ上の任意のディレクトリに以下のように配置する。
  • lime.php
  • Stack.class.php (空ファイル)
  • TestStack.php (空ファイル)
これから「スタック」という機能を持つクラスを作ります。
仕様はリンク先を参考のこと。

なお、私は諸事情により、コマンドラインではなくブラウザ上で実行しました。

Stack.class.php
クラスを定義する。
<?php

class Stack {

}

?>
TestStack.php
他の2つのクラスを読み込む。
<?php

require_once("lime.php");
require_once("Stack.class.php");

$stack = new Stack();
$t = new lime_test();

?>

TDDをする

まずテストをかく。
TestStack.php
<?php

require_once("lime.php");
require_once("Stack.class.php");

$stack = new Stack();
$t = new lime_test();

echo("<pre>");  // 出力を整形する

$t->diag('Stack Test');  // テストの宣言
$t->ok($stack->isEmpty(), 'isEmpty');  // これが1個目のテスト

echo("</pre>");

?>

そして、失敗するように実装をかく。
Stack.class.php
<?php

class Stack {
    public function isEmpty()
    {
        return false;
    }

}

?>

StackTest.phpを実行すると、見事に失敗する。

以下略
(リンク先のブログ記事をご参照くだされ)

最終的に書いたコード

最終的にはこのようなコードになりました。
テストコード
TestStack.php
<?php
require_once("lime.php");
require_once("Stack.class.php");
echo(1);

$stack = new Stack();
$t = new lime_test();

echo("<pre>");
$t->diag('Stack Test');

try{
    $stack->pop();
    $t->fail('Exception not thrown when void pop');
}catch(OutOfRangeException $e){
}

try{
    $stack->top();
    $t->fail('Exception not thrown when void top');
}catch(OutOfRangeException $e){
}

$t->ok($stack->isEmpty(), 'isEmpty');

$stack->push(1);
$t->ok(!$stack->isEmpty(), 'NOT isEmpty');

$t->is($stack->top(),1,'top');
$t->is($stack->size(),1,'size');
$stack->push(2);
$t->is($stack->size(),2,'size');
$t->is($stack->top(),2,'top');

$stack->push(0);
$t->is($stack->top(),0,'top');
$stack->pop();

$stack->pop();
$t->is($stack->top(),1,'top');
$stack->pop();
$t->is($stack->size(),0,'pop');

$t->ok($stack->isEmpty(), 'isEmpty');

try{
    $stack->pop();
    $t->fail('Exception not thrown when void pop');
}catch(OutOfRangeException $e){
}

try{
    $stack->top();
    $t->fail('Exception not thrown when void top');
}catch(OutOfRangeException $e){
}

echo("</pre>");

?>
テスト対象のクラスコード
Stack.class.php
<?php

class Stack {

    protected $value = array();
    protected $size = 0;

    public function isEmpty()
    {
        return $this->size == 0;
    }
    
    public function push($x)
    {
        $this->value[$this->size ++ ] = $x;
    }
    
    public function top()
    {
        $this->emptyCheck();
        return $this->value[$this->size - 1];
    }

    public function size()
    {
        //return 0;
        return $this->size;
    }
    
    public function pop()
    {
        $this->emptyCheck();
        $this->size--;
    }
    
    private function emptyCheck()
    {
        if($this->isEmpty()){
            throw new OutOfRangeException();
        }
    
    }
}

?>
テスト結果
# Stack Test
ok 1 - isEmpty
ok 2 - NOT isEmpty
ok 3 - top
ok 4 - size
ok 5 - size
ok 6 - top
ok 7 - top
ok 8 - top
ok 9 - pop
ok 10 - isEmpty
1..10
 Looks like everything went fine.

ほ~勉強になった。
やっぱ体験は重要ですな。

プチ楽しかったです。
みなさんもぜひ。
カテゴリ: