by shigemk2

当面は技術的なことしか書かない

TDDのプロセスとコツについて

TDDのプロセスとは、

  1. 小さなテストを追加する
  2. すべてのテストを実行し失敗する
  3. 変更を行う
  4. テストを実行し、成功する
  5. 重複を取り除くために、リファクタリングを行う

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;
}

こういう風にすると、各々のテストがどんなテストなのか
分かりやすいと思う。
テストは小さく。コードの重複を防ぐ。

基本的にコードのコピペはやってはいけないことだが、
テストは数十数百に及ぶことがあるので、必要最低限の部分を修正すれば
あとはコピペでよいと思われる。というか致し方ない。

まあたしかに、レビューにあるとおり日本語がちょくちょく酷いと思った。