TDDのプロセスとは、
- 小さなテストを追加する
- すべてのテストを実行し失敗する
- 変更を行う
- テストを実行し、成功する
- 重複を取り除くために、リファクタリングを行う
TDDとは「グリーン」「レッド」「リファクタリング」を延々と繰り返す作業といえる。
それと重要なのは、テストとコードの重複を取り除くこと。
たとえば、Simpletestでこんな感じのテストをやったとしよう
<?php ... function testHoge() { $data = array( 'id' => 9999, 'name' => 'Physalis', 'pilot' => 'Anabel', 'weapon' => 'atomic bomb', ); $result = $this->Hoge->fuga($data); $this->assertTrue($result); } function testHoge_false_when_id_is_not_numeric() { $data = array( 'id' => 'hoge', 'name' => 'Physalis', 'pilot' => 'Anabel', 'weapon' => 'atomic bomb', ); $result = $this->Hoge->fuga($data); $this->assertFalse($result); } function testHoge_false_when_name_is_not_string() { $data = array( 'id' => 9999, 'name' => 9999, 'pilot' => 'Anabel', 'weapon' => 'atomic bomb', ); $result = $this->Hoge->fuga($data); $this->assertFalse($result); }
連想配列を引数として、各要素の型が違うときの挙動をテストしたい場合、
このような書き方だと、重複だらけでコードも見づらい。
重複を減らすために、もっとスマートな方法をもってきたらいいんじゃないだろうか。
<?php ... function testHoge() { $data = $this->getHogeArray(); $result = $this->Hoge->fuga($data); $this->assertTrue($result); } function testHoge_false_when_id_is_not_numeric() { $data = $this->getHogeArray(); $data['id'] = 'hoge'; $result = $this->Hoge->fuga($data); $this->assertFalse($result); } function testHoge_false_when_name_is_not_string() { $data = $this->getHogeArray(); $data['name'] = 9999; $result = $this->Hoge->fuga($data); $this->assertFalse($result); } private function getHogeArray() { $data = array( 'id' => 9999, 'name' => 'Physalis', 'pilot' => 'Anabel', 'weapon' => 'atomic bomb', ); return $data; }
こういう風にすると、各々のテストがどんなテストなのか
分かりやすいと思う。
テストは小さく。コードの重複を防ぐ。
基本的にコードのコピペはやってはいけないことだが、
テストは数十数百に及ぶことがあるので、必要最低限の部分を修正すれば
あとはコピペでよいと思われる。というか致し方ない。
まあたしかに、レビューにあるとおり日本語がちょくちょく酷いと思った。