[PHP] limeでTDDを体験する
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.
ほ~勉強になった。
やっぱ体験は重要ですな。
プチ楽しかったです。
みなさんもぜひ。
カテゴリ:
PHP