オブジェクトマザー

2006年10月24日

オブジェクトマザーは、テストに使用されるクラスの一種で、テスト用に使用するサンプルオブジェクトの作成に役立ちます。

適度な規模のシステムでテストを記述する場合、多くのサンプルデータを作成する必要があります。従業員の病気休暇計算をテストしたい場合、従業員が必要です。しかし、これは単なる単純なオブジェクトではありません。従業員の婚姻状態、扶養家族の数、雇用と給与実績が必要になります。これは、作成する必要があるオブジェクトが多数になる可能性があります。このセットデータは一般的にテストフィクスチャと呼ばれます。

最初のステップは、xunitテストのセットアップメソッドでフィクスチャを作成することです。そうすることで、複数のテストで再利用できます。しかし、この場合の問題は、多くの場合、複数のテストクラスで類似したデータが必要になることです。この時点で、標準的なフィクスチャを返せるファクトリオブジェクトを持つことが理にかなっています。たとえば、「ジョン」は先週雇われたばかりの従業員です。「ヘザー」は10年間在籍している従業員です。

オブジェクトマザーはそのようなファクトリに対する単なるキャッチーな名前です。この名前は世紀の変わり目にThoughtworksプロジェクトで造語され、定着するのに十分にキャッチーです。

オブジェクトマザーが生成する定番のオブジェクトはチームに馴染みがあり、ユーザーとの議論にさえ侵入することがよくあります。このように、彼らはペルソナの概念に似ていますが、必ずしも人であるとは限りません。保険ポリシー、供給契約など、テストフレームワークに必要なデータが何でもかまいません。複数のテストで同様のデータを使用すると、使用している例に慣れることができます。

これらの定番のオブジェクトは、特定のテストに適しているだけでなく、追加のセットアップにより適切になることがよくあります。「ジョンを2か月前に有給休暇を取らせましょう。」場合によっては、マザーに新しい定番のオブジェクトを追加する必要があることもありますが、可能であれば既存のものを微調整してみてください。そうすることで、既存の定番のオブジェクトに親しんでいる場合、テストの読者はより早く理解できます。

通常、作成する必要があるオブジェクトは数種類あるため、異なるクラスごとに異なるマザーを作成すると便利です。例: CustomerMotherProductMotherなど。

オブジェクトマザーには欠点があります。特に、多くのテストがマザー内の正確なデータに依存するという強い結合があります。その結果、何らかの理由でその標準データを変更したい場合、それは難しいでしょう。クラスを変更すると、テストを移行する必要も生じますが、いずれにせよ問題は発生します。

続きを読む

Peter SchuhとStephanie Punkeが、XP Universeに関するオブジェクトマザーの論文を書いています。