「オブジェクト指向設計実践ガイド」 第9章 費用対効果の高いテストを設計する

第9章 費用対効果の高いテストを設計する

変更可能なコードを書くのに必要な3つのスキル

  1. オブジェクト指向設計の理解
  2. リファクタリングのスキル
  3. テスト設計のスキル

リファクタリングとはコードの機能を変更せずに内部構造を変えること

テストの意図

テストを行う目的は、コストの削減である。テストに伴って、次のような利益が得られる。

  • バグ発見 早期にバグを発見できる
  • テストが仕様書代わりとなる 紙の仕様書をメンテナンスし続ける必要がない
  • 設計の決定を遅らせる テストがあることにより安心してリファクタリングできる
  • 抽象を支える 全体の振る舞いを記述できる
  • 設計の欠陥の発見 テストが書きづらいコードはコンテキストを要求しすぎている

より少ないテスト

テストはなるべく少ない方が良い。テストの数を安全に減らすためには、テストを何のために書くのか考える必要がある。

まず、オブジェクト指向におけるテストとは、オブジェクトが他のオブジェクトからメッセージを受け取った際に「期待される動作」をするかどうかのテストである。ということは、パブリックインターフェースに関するテストのみ書くべきである。(プライベートなメソッドに対するテストは不要!)

テストすべきなのは

  • 受信メッセージ(オブジェクトがメッセージを受取ったら期待するメッセージを返すこと)
  • 送信コマンドメッセージ(副作用を持つメッセージは送られた回数、使われた引数を検証する必要がある)

のみである。

受信メッセージのテスト

  • 使われていないインターフェースは削除する
  • パブリックインターフェースの仕様を保証する
  • 依存するオブジェクトはテストダブル・スタブを活用し、テスト対象ではないオブジェクトの影響をなくす (これを実現するには依存性の注入ができていないと!)

プライベートメソッドのテスト

送信メッセージのテスト

  • 副作用のある送信メッセージが正しく送られるか、モックに対してメッセージを送らせてテストする

ダックタイプのテスト

  • 暗黙的に存在するタイプはテスト内で明示する

継承のテスト

  • リスコフの置換原則が守られているかテストする
  • 抽象クラスのテストにはテストスタブ用のサブクラスを活用する