JUnit 実践入門 体系的に学ぶユニットテストの技法 第16章 テスト駆動開発 テストファーストで設計する
第16章 テスト駆動開発 テストファーストで設計する
16.1 テスト駆動開発 Test Driven Development とは
- TDD は、ユニットテストをプロダクションコードよりも先に記述することを原則とした開発手法のこと。
- この原則はテストファーストと呼ばれ、XPのプラクティスの一つ。
- TDD は、ゴールを少し先に設定し、それを短期間でクリアすることを繰り返し、最終的なゴールを目指す。
- 一気に飛躍した結果を求めない。
16.2 テスト駆動開発のサイクル
- 設計する
- テストコードを書く
- レッド: テスト失敗
- プロダクションコードを書く
- グリーン: テスト成功
- リファクタリングする
- グリーン: テスト成功
このサイクルを、レッド - グリーン - リファクタリングと呼ぶ。
設計する
- 何をテストしたらよいかわかるまで、設計する。
- 主にインターフェイスの観点から設計を行う。
- 仔細に至る部分は、作ってみなければわからない事が多く、はじめから完璧に洗い出すことは難しいため。
テストコードを書く
- 動作するドキュメントとしてのテストコードを書く。ただし、1サイクルで作成するテストケースは、原則一つ。
プロダクションコードを書く
- コンパイルエラーの除去
- テストコード実行 -> レッド(エラー) (未実装のため)
- グリーンになるよう、手を加える
- 脇目をふらず、ただグリーンにすることを目的に!
- 例外処理等はここでは実装せず、次のサイクルでユニットテストを作成した後に実装する
リファクタリングを行う
- テストがグリーンを維持するよう、リファクタリングを実施。
- TDD ではリファクタリングが重要。
- ユニットテストケースがあるため、修正が挙動に影響を及ぼすかすぐに確認できる。
- 安心してリファクタリングに望める!
次のサイクルを始める
- ここまでのサイクルをリズムよく、早く回すことが、TDD では重要。
- 1サイクルが短いほど、ミスした時の手戻りが少ないから。
- 目安としては 10 から 15 分を目安に。
- どれだけサイクルを回せばよいかについては、コストとの相談。
16.3 Calculator クラスのテスト駆動開発
実装しつつ、前述の事項を確認する。
テストファースト
コンパイルエラーの解決
仮実装
リファクタリング
三角測量
16.4 テスト駆動開発の目的
ステップバイステップ
- テスト駆動開発の基本は、「小さく」「1つずつ」
- 自分を過信してたくさんのことを一気にやろうとするべからず
自分が最初のユーザ
- テスト対象となるクラス、メソッドを使って自分が最初にテストコードを書く
- 使いにくいことに、早い段階で気づけるチャンスが有る
動作するきれいなコード
- TDD では、はじめにテストケースを作成し、動作するプロダクションコードはなにはともあれ、まず作成する。
- はじめはきれいなコードではないが、リファクタリングにより、美しいコードとすることを目指す。
- 完璧な設計をはじめから行うことはできないか、あるいは非常にコストがかかる、との知見から来ている。
素早いフィードバック
- TDD と CI をプロダクション組み合わせることで、素早いフィードバックが保証される。
- 『プログラマの安心』の源泉。