Test Data Builderパターンとは
Test Data Builderパターンとは、ユニットテストでテストデータを準備する方法のひとつです。TDDにおいてテストデータを用意する方法はいくつか存在しますが、Test Data Builderパターンを使うと、複雑なデータ生成をシンプルにしつつ、テストケース間の依存を防ぐことができます。
このパターンは書籍「Growing Object-Oriented Software, Guided by Tests(通称goos本)」の「Constructing Complex Test Data」の章にて書かれています。
Object Motherパターンとの相違
ユニットテストでデータを生成するパターンとしては、ObjectMotherパターンが有名です。ObjectMotherはファウラーのブログで紹介されている通り、テスト用データ(オブジェクト)の生成を担うファクトリークラスです。ObjectMotherを使うことで、テストで利用できるペルソナの定義を行えるため小規模なテストケースやシナリオテストでは有益です。しかし、テストケースがObjectMotherに依存してしまうため、後からObjectMotherの内容を変更すると、別のテストがエラーになる可能性があります。(オブジェクトやモックを簡単に利用できる反面、ObjectMother全体を理解しておく必要があります)
Test Data Builderパターンが有効なケース
Test Data Builderパターンは、セットアップするオブジェクトが多い場合やオブジェクト間の依存関係が複雑な場合に価値を発揮するといえるでしょう。
利用例
Test Data Builderパターンでは、クラスを生成するビルダークラスを用意します。例えばCustomerクラスを生成したい場合は、CustomerBuilderクラスを作成します。このBuilderクラスを利用して目的のクラスを取得します。例えば、
var customer = CustomerBuilder.Build();
のようにしてテストに必要なオブジェクトを取得します。CustomerBuilderでは一般的な初期値を設定しておきます。従来であれば、
var customer = new Customer();
customer.LastName = “田代”;
customer.FirstName = “ひろし”;
customer.Age = 25;
customer.Hoge = … etc
というようにテストコードに関係ない値をセットアップしていましたが、Builderを使用することでこれらの手間を省くことができます。また、ObjectMotherのようにテストメソッド同士の依存関係もありません。
テストコードによってBuilderの処理を変えたい場合は、CustomerBuilderクラスに処理を追加していきます。例えば、
var customer = CustomerBuilder.aLastName(“田代”).aAge(25).Build();
のようにメソッドチェーンで必要な値を変更できるようにします。
Builderクラスの実装方法については、以下のページ等にサンプルコードがあるので参考にしてください。
参考
http://wiki.c2.com/?TestDataBuilder
TestDataBuilder in C# 4gillesleblanc.wordpress.com