テスト駆動開発入門読了

テスト駆動開発入門

テスト駆動開発入門

SeasarConference2009Whiteでの和田さんのプレゼンに触発されて写経してみた。
以下メモ。

  • 「レッド→グリーン→リファクタリング」を素早くやる為のEclipseショートカットキー
    • 「cmd+F7」ビュー切り替え
    • 「cmd+F6」エディタ切り替え
    • 「alt+cmd+x t」ビューがPackageExplorerの状態でテストRun
仮実装
定数やnullを返しテストケースを早くグリーンにする。本物のコードを得るまで定数を変数で徐々に置き換える。
明白な実装
実際の実装を記述
三角測量
booleanを返す場合assertTrueとassertFalseでテスト、加算の場合assertEquals(plus(1, 2), 3)、assertEquals(plus(3, 4), 7)でテスト。
  • バリューオブジェクト(パターン)
    • インスタンス変数はコンストラクタで設定された後は変化しない
      • 新しいオブジェクトを返さなければならない
      • equals()を実装すべき(等価性)
      • マップのキーとして使用する場合hashcode()を実装する
  • グリーンにする為にはコピペという大罪も許されるが、その一般化がTODOリストに追記され、それに線を引くまでは帰宅はダメ
  • レッドバーの場合はテストコードを作成しない方がいいが、モデルコードはテスト無しに変更できない。保守的に進める場合はグリーンになるようレッドの原因を取り除く。定時を過ぎそうな場合はテストコードを作成してもよし

作業の粒度がイマイチはっきりしない。慣れるしかないんだろうが。

fixture
テスト基盤。テストの為のインスタンス変数等の環境(setUp(),tearDown())。
独立したテスト
1つのテストが失敗したら1つ、2つのテストが失敗したら2つの問題が欲しい

クラッシュテストダミー

@Test(expected=IOException.class)
public void fileSystemError() {
    File f = new File("foo") {
        public boolean createNewFile() throws IOException {
            throw IOException;
        }
    };
    saveAs(f);
}
  • 仮実装のメリット
    • 心理的効果(グリーンで安心)
    • スコープ制御(目の前の問題に集中)
  • シングルトン
    • そんなこと考えてる暇があったら設計を考えろ
  • メソッドの移動(リファクタリング)
    • メソッド内で別のオブジェクトに複数のメッセージが送信されている。
解放/閉鎖原則
オブジェクトは使用に解放され、修正から閉鎖されるべきである。
  • TDDは分析および設計技法である。

要するに実践あるのみね