大変お待たせしました。遅ればせながら本年もよろしくお願いします。さっそく,
筆者はテスト駆動開発に興味を持ってはいたのですが,
- 複雑なものも扱えるのか
- 生産性が本当に上がるのか
- 部分をテストしても全体のテストのかわりにはならないのでは?
- テスト可能にすると,
ソースが読みにくくなるのでは? - 最初に構造をしっかり設計しないと,
あとから変更できないのでは?
特に最後の
そこで,
わざと設計なしでプログラムを書く
使用するのは
さて,
- エラー発生時の行番号表示
- 前方参照をきれいに実装できる
「前方参照」
また,
- テストに失敗した場合でも,
次のテストメソッドを実行する (Exceptionを使用しないバージョン) - クラスでない,
普通の関数もテスト可能 - オブジェクトのメンバを少ない記述でテストできる機能
(php5のマジックメソッドを使用)
オブジェクトのテストだけ,
$obj =& new class1();
assertisa("class1", $obj)
->var1_eq(1)
->method1_eqf(2);
var1_
紙面の都合上,
行番号のためのクラスを作る
さっそくですが,
おさらいになりますが,
リスト1
class inputbuffer {
function test1() {
$obj =& new inputbuffer();
assertisa("inputbuffer", $obj)
->iseof_eqf(1);
}
}
空のinputbufferを作り,
リスト2
class inputbuffer {
function iseof() {
return 1;
}
function test1() {
$obj =& new inputbuffer();
assertisa("inputbuffer", $obj)
->iseof_eqf(1);
}
}
しかし,
以下のように,
リスト3
class inputline {
var $line = "";
function inputline($line = "") {
$this->line = $line;
}
function gets() {
return $this->line;
}
function test1() {
$obj =& new inputline("test"); /* (1) */
assertisa("inputline", $obj)
->gets_eqf("test");
$obj =& new inputline("test2"); /* (2) */
assertisa("inputline", $obj)
->gets_eqf("test2");
}
}
(1)で,
リスト4
class inputline {
var $line = "";
var $locate = "";
function inputline($line = "", $locate = "(unknown)") {
$this->line = $line;
$this->locate = $locate;
}
function gets() {
return $this->line;
}
function getlocate() {
return $this->locate;
}
function test1() {
$obj =& new inputline("test");
assertisa("inputline", $obj)
->gets_eqf("test");
$obj =& new inputline("test2");
assertisa("inputline", $obj)
->gets_eqf("test2");
$obj =& new inputline("test3", "line#1"); /* (3) */
assertisa("inputline", $obj)
->gets_eqf("test3")
->getlocate_eqf("line#1");
$obj =& new inputline("Hello TDD", "line#2"); /* (4) */
assertisa("inputline", $obj)
->gets_eqf("Hello TDD")
->getlocate_eqf("line#2");
$obj =& new inputline("test"); /* (5) */
assertisa("inputline", $obj)
->gets_eqf("test")
->getlocate_eqf("(unknown)");
}
}
(3)で行番号の情報をテストします。今回は,