ObjectMother
http://martinfowler.com/bliki/ObjectMother.html
オブジェクトマザーとは、テストで使用するクラスである。これはテスト用のサンプルオブジェクトを作るのに役立つものだ。
それなりの規模のシステムでテストを書くとき、膨大なサンプルデータを用意する必要があるだろう。たとえば、従業員の疾病手当の計算をテストする場合だと、従業員が必要になる。これは単なるオブジェクトではなく、配偶者の有無、扶養家族の人数、勤務履歴、給与履歴などのデータが必要である。もしかすると、オブジェクトを大量に生成しなければならないかもしれない。こうしたデータは一般に「テストフィクスチャ」と呼ばれる。
まず、フィクスチャをxUnitテストのsetUpメソッドで作成して、複数のテストで再利用できるようにする。ここでよく面倒となるのは、同じようなデータが複数のテストクラスで必要になることだ。そういうときは、ファクトリーオブジェクトを用意して、元になるフィクスチャを返すようにする。たとえば、去年採用された従業員「John」、勤続10年の「Heather」といった具合だ。
オブジェクトマザーは、ファクトリーのキャッチーな名前である。今世紀初頭にThoughtWorksのプロジェクトでつけられたものだ。いい具合にキャッチーだ。
オブジェクトマザーが作った定型オブジェクトはチームに馴染んでいく。時にはユーザーとの打ち合わせの場に登場するほど馴染んでしまうこともある。これはペルソナの記述に似ているのではないだろうか——ただし、その対象は人ではないこともある。保険約款、供給契約など、テストフレームワークが必要なものならどんなデータでも構わない。似たようなデータを複数のテストで使用していると、サンプルに馴染んでいくものだ。
こうした定型オブジェクトがうまくいかないテストもある。しかし、たいていはsetUpにちょっと追加するだけでうまくいくだろう。「Johnを2ヶ月前から病欠にしよーぜー」といった具合だ。新しい定型オブジェクトをマザーに追加しなければならないこともあるが、できるだけ既存のオブジェクトを修正するようにしてほしい。既存の定型オブジェクトに似ていれば、テストの読み手はすぐに内容を理解することができるのだ。
オブジェクトマザーにも欠点はある。特に、そうした多くのテスト同士が密接に結びついていて、それがマザーの特定のデータに依存しているような場合だ。何らかの理由で定型データを変更したいと思ったら、トリッキーになってしまう。常に問題となることではあるのだが、クラスを変更したらテストの移行も必要になってくる。
Peter Schuh と Stephanie Punkeが、 XP Universeにおいて、 オブジェクトマザーに関する論文を書いている。