テスト駆動開発 Kent Beck 2017

テスト駆動開発とは

テスト駆動開発(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
タイトルとURLをコピーしました