プロローグ
読者の方で,
- 「いちばん重要な財産はコードであり,
万一コードを失ってしまったら, 元と同じ品質のコードをもう一度書くのはとても大変だ」
筆者も長年このように思っていました。では,
「いちばん重要な財産はテストであり,
今までとずいぶん違う考え方ですね。いろんな声が聞こえてきそうです。
- 「コメントはどうするんだ」
- 「テストが複雑すぎて保守できなくなったらどうするんだ」
ごもっともです。テスト駆動開発は万能ではありません。うまく適用できない場面もあり,
でも,
ブックレット作成プログラム
では最初に,
このテストで使うのは,
リスト1 テスト実行スクリプト
#! /usr/local/bin/php
<?php
function asserteq($expected, $found) {
if ($expected === $found) {
printf(".");
return;
}
printf("\nexpected: \"%s\"\nfound: \"%s\"\n----\ntest failed.\n", $expected, $found);
die();
}
require("target.php");
foreach (get_declared_classes() as $classname) {
foreach (get_class_methods($classname) as $methodname) {
if (!ereg("^test", $methodname))
continue;
$obj =& new $classname();
$obj->$methodname();
}
}
print"\ntest successed.\n";
?>
asserteq()というのは,
run.
一方,
- 最初のページ順は "a b c d e f g h"
- ブックレット順に並び替え
- ページ順が"h a b g f c d e"になっているかテスト
そうすると,
そして,
リスト2 テスト用オブジェクト
<?php
class dummy_pdfpage {
var $name = "";
function dummy_pdfpage($name = "none") {
$this->name = $name;
}
}
class dummy_pdf {
var $pages;
function dummy_pdf() {
$this->pages = array();
}
function &newPage() {
$page =& new dummy_pdfpage("@");
return $page;
}
function pagelist() {
$array = array();
foreach ($this->pages as $key => $dummy)
$array[] = $this->pages[$key]->name;
return implode(" ", $array);
}
}
?>
さっそくページの並べ替えのテストをしたいところですが,
では,
- pdfオブジェクトを生成。
- リストが""であることをテスト。
- 「a」
というページを追加。 - リストが"a"であることをテスト。
- 「b」
というページを追加。 - リストが"a b"であることをテスト。
- newPage()を呼び出して,
空のページを追加。 - リストが"a b @"であることをテスト。
- もう一度newPage()を呼び出して,
空のページを追加。 - リストが"a b @ @"であることをテスト。
これでうまくいけば,
リスト3 テストを行うメソッド
class dummy_pdf {
....
function test1() {
$pdf =& new dummy_pdf();
asserteq("", $pdf->pagelist());
$pdf->pages[] =& new dummy_pdfpage("a");
asserteq("a", $pdf->pagelist());
$pdf->pages[] =& new dummy_pdfpage("b");
asserteq("a b", $pdf->pagelist());
$pdf->pages[] =& $pdf->newPage();
asserteq("a b @", $pdf->pagelist());
$pdf->pages[] =& $pdf->newPage();
asserteq("a b @ @", $pdf->pagelist());
}
}
では,
$ php ..... test successed. $
asserteq()が呼ばれて成功すると