テスト駆動開発とは
テスト駆動開発(Test-Driven Development、TDD)とは、まずテストを書いて、実装しながら、開発する手法です。しかし、TDDはテスト技法ではありません。
皮肉なことに、TDDはテスト技法ではない。TDDは分析技法であり、設計技法であり、実際には開発のすべてのアクティビティを構造化する技法なのだ。
p278
付録C:テスト駆動開発の現在
まず、付録C「テスト駆動開発の現在」を読んでください。付録Cは和田卓人氏による原稿で、TDD/BDDの歴史や、言葉の意味について解説しています。
Ruby on Railsの作者 David Heinmeier Hanssonの「TDDは死んだ。テスティングよ栄えよ(日本語訳)」については、
彼が批判したのは、教条主義化し、自己目的化したTDD/BDD原理主義者たちに対してでした
p301
第1部、第2部
第1部は、多国通貨を処理するJavaクラスを開発します。第2部は、PythonのxUnitを自作します。
第1部、第2部ともに説明とサンプルコードがあるので、写経をおすすめします。本を読み進めながら、サンプルコードを実際にコンピュータに入力して動かしてください。
小さいステップを繰り返す
1. 小さいテストを1つ書く。
2. すべてのテストを実行し、1つ失敗することを確認する。
3. 小さい変更を行う。
4. 再びテストを実行し、すべて成功することを確認する。
5. リファクタリングを行い、重複を除去する。
p8
小さいテストとは、一般に言われているよりはるかに小さいテストです。
@Test
public void testMultiplication() {
Dollar five = new Dollar(5);
five.times(2);
assertEquals(10, five.amout);
}
Code language: JavaScript (javascript)
どれくらい小さいステップで3,4を繰り返すのでしょうか。まずからっぽのDollarクラスをつくって、コンパイルします。
class Dollar {
}
Code language: JavaScript (javascript)
次に4回、修正とテストを繰り返して、次のコードに。
class Dollar {
int amount = 10;
Dollar(int amount) {
}
void times(int multiplier) {
}
}
Code language: JavaScript (javascript)
さらに2回、修正とテストを繰り返して、次のコードに。
class Dollar {
int amount;
Dollar(int amount) {
}
void times(int multiplier) {
this.amount = 5 * 2;
}
}
Code language: JavaScript (javascript)
さらに4回、修正とテストを繰り返して、次のコードに。
class Dollar {
int amount;
Dollar(int amount) {
this.amount = amount;
}
void times(int multiplier) {
this.amount *= multiplier;
}
}
Code language: JavaScript (javascript)
はやくテストを通すために、空実装や仮実装、値のベタ書きします。動くコードを共通化し、ベタ書きの値を変数に置き換えていきます。
おそらく、数分ごとに、コンパイル、テストをするようなリズムです。
TDDのデメリット
TDDをやっていると。テストコードとプロダクトコードの行数は、同じくらいになる。つまりこれまでの2倍コードを書けるようになるか、半分のコード量で同じだけの機能を書けるようになるかしないと、TDDのメリットを得られないといことだ。
p12
TDDにおけるデザインパターンの利用
パターン | テスト | リファクタリング |
Command | ○ | |
Value Object | ○ | |
Null Object | ○ | |
Template Method | ○ | |
Pluggable Object | ○ | |
Pluggable Selector | ○ | |
Factory Method | ○ | ○ |
Imposter | ○ | ○ |
Composite | ○ | ○ |
Collecting Parameter | ○ | ○ |