TDDの考え方は分かるが、いざ実際のコードに適用しようとすると戸惑ってしまう。
この理由は2つあると考える。(1)ユニットテストを導入していない場合テストを実行する環境を準備しなければならないこと、(2)TDDは(というかユニットテストは)ロジック部をテストすること。
1つ目のツールを使うことは必須ではないのだが楽をするというTDDのメリットを考えるとそれなりの課題となる。同じ開発環境を継続できるのなら環境準備に負荷は下げられるだろう。
2つ目は何をテストしたいのかに関わる。たいていのプログラムは(CLIであっても)ユーザーインタフェースを持っている。あるいはファイルアクセスやライブラリ関数など外部機能を利用する。こういうのはTDDに不向きで、関数やクラスに閉じた計算部分を対象にしなければうまくいかない。
Kent BeckのTest-Driven Development by Example の最初の例では、通貨単位の変換をして株価のレポートを表示するプログラムだが、TDDは通貨単位の変換部分に絞られている。
例えば一番最初は乗算のテストコードである。
public void testMultiplication() {
Dollar five = new Dollar(5);
five.times(2);
assertEquals(10, five.amount);
}
小さいプログラムだと、TDDが対象にするようなロジック部分はあまりない。これがTDDがうまく出来ない大きな理由だと思う。しかしこれはロジック部とビュー部をちゃんと分離できてないから、という話なのかもしれない。
-
- -
第14回 テスト厨,TDDの壁,DBやGUIのテスト
http://gihyo.jp/dev/serial/01/tdd/0014
実はテスト駆動開発ってしっくりこないんです
http://qiita.com/irxground/items/6c0de05fbb52fef6fbd1
TDDを行った時にぶつかった7つの壁
http://qiita.com/syou007/items/7d6fdf1b7b6245a07bce
Introduction to Test Driven Development (TDD)
http://agiledata.org/essays/tdd.html
Test-Driven Development By Example
http://www.eecs.yorku.ca/course_archive/2003-04/W/3311/sectionM/case_studies/money/KentBeck_TDD_byexample.pdf