JUnit 実践入門 体系的に学ぶユニットテストの技法 第16章 テスト駆動開発 テストファーストで設計する

第16章 テスト駆動開発 テストファーストで設計する

16.1 テスト駆動開発 Test Driven Development とは

  • TDD は、ユニットテストをプロダクションコードよりも先に記述することを原則とした開発手法のこと。
  • TDD は、ゴールを少し先に設定し、それを短期間でクリアすることを繰り返し、最終的なゴールを目指す。
    • 一気に飛躍した結果を求めない。

16.2 テスト駆動開発のサイクル

  1. 設計する
  2. テストコードを書く
    • レッド: テスト失敗
  3. プロダクションコードを書く
    • グリーン: テスト成功
  4. リファクタリングする
    • グリーン: テスト成功

このサイクルを、レッド - グリーン - リファクタリングと呼ぶ。

設計する

  • 何をテストしたらよいかわかるまで、設計する。
  • 主にインターフェイスの観点から設計を行う
    • 仔細に至る部分は、作ってみなければわからない事が多く、はじめから完璧に洗い出すことは難しいため。

テストコードを書く

  • 動作するドキュメントとしてのテストコードを書く。ただし、1サイクルで作成するテストケースは、原則一つ

プロダクションコードを書く

  1. コンパイルエラーの除去
  2. テストコード実行 -> レッド(エラー) (未実装のため)
  3. グリーンになるよう、手を加える
    • 脇目をふらず、ただグリーンにすることを目的に!
    • 例外処理等はここでは実装せず、次のサイクルでユニットテストを作成した後に実装する

リファクタリングを行う

次のサイクルを始める

  • ここまでのサイクルをリズムよく、早く回すことが、TDD では重要。
    • 1サイクルが短いほど、ミスした時の手戻りが少ないから。
  • 目安としては 10 から 15 分を目安に。
  • どれだけサイクルを回せばよいかについては、コストとの相談。

16.3 Calculator クラスのテスト駆動開発

実装しつつ、前述の事項を確認する。

テストファースト

コンパイルエラーの解決

仮実装

リファクタリング

三角測量

16.4 テスト駆動開発の目的

テスト駆動開発の目的は、プログラマの不安を軽減すること。

ステップバイステップ

  • テスト駆動開発の基本は、「小さく」「1つずつ」
    • 自分を過信してたくさんのことを一気にやろうとするべからず

自分が最初のユーザ

  • テスト対象となるクラス、メソッドを使って自分が最初にテストコードを書く
    • 使いにくいことに、早い段階で気づけるチャンスが有る

動作するきれいなコード

  • TDD では、はじめにテストケースを作成し、動作するプロダクションコードはなにはともあれ、まず作成する。
  • はじめはきれいなコードではないが、リファクタリングにより、美しいコードとすることを目指す。
    • 完璧な設計をはじめから行うことはできないか、あるいは非常にコストがかかる、との知見から来ている。

素早いフィードバック

  • TDD と CI をプロダクション組み合わせることで、素早いフィードバックが保証される。

メンテナンスされたドキュメント

  • テストケースは、テスト対象メソッドの具体的な仕様と、ユースケースを示している。
  • TDD が正しく回っていれば、仕様書やドキュメントが万一おざなりにされるような状況であっても、テストコードという形でのメンテナンスされたドキュメントは保証される。