- FixtureBook とは
FixtureBook とは単体テストで使用するデータを .xlsx ファイルに記述できるようにするための仕組みです。
FixtureBook を使うと、.xlsx ファイル上に記述した以下のようなデータを単体テストで簡単に利用することができます。
- テスト前にDBテーブルに登録しておきたいデータ内容。
- テスト対象メソッドの引数等として利用するオブジェクトのプロパティ値。
- テスト対象メソッドを実行して取得できた結果と照合するための予想結果。
- テスト後のDBテーブルのあるべき状態を表すデータ。
Webアプリケーションのバックエンドロジック等、 データベースの入出力を中心としたクラスのテストに向いています。
テストコードが非常にシンプルになります。
FixtureBook.ExpectReturn((Employee parameter) => dao.GetEmployees(parameter));
この1行のコードで、
- データベースに必要なデータをセットアップし、
- parameter オブジェクトを作成し、
dao.GetEmployees(parameter)
を実行し、- その戻り値を予想結果と比較する
という処理が行えます。
- NuGet でインストールして、
- App.config に データベースへの接続設定をする
だけで使い始められます。
利用するのは FixtureBook
クラスだけです。
- 使い方
NuGet でインストールするのが簡単です。
FixtureBook の使い方はとてもシンプルです。
- テストで使用したいデータを FixtureBook (.xlsx ファイル) に記述する。
- FixtureBook を利用する単体テストを書く。
例えば、以下のような「従業員クラス (Employee)」
public class Employee
{
public int Id { get; set; }
public string Name { get; set; }
public int Age { get; set; }
public bool Retire { get; set; }
public DateTime LastUpdated { get; set; }
}
を利用するメソッド GetEmployees
public class EmployeeStore
{
/// <summary>
/// 従業員データの退職フラグを条件にしてデータベースから検索を行う
/// </summary>
/// <param name="parameter">退職フラグが設定された従業員データ</param>
/// <returns>検索条件に合致した従業員データ</returns>
public List<Employee> GetEmployees(Employee parameter)
{
using (MyAppDbContext context = new MyAppDbContext())
{
return (from employee in context.Employees
where employee.Retire == parameter.Retire
orderby employee.Id
select employee).ToList();
}
}
}
をテストしたい場合の例です。
次のようなシートのある .xlsx ファイルを作ります。
A.テストケース
のC列にテスト内容を一行で記述する。- テスト前にデータベース上に設定しておきたいデータを
B.テストデータクリア条件
とC.テストデータ
に記述する (C列にテーブル名、D列以降に列値を指定)。 D.パラメタ
には、メソッドの引数で渡すデータを記述する(C列にクラス名、D列以降にプロパティ値を指定)。E.取得データ
には、メソッドの戻り値として取得できるデータを予想して記述する(C列にクラス名、D列以降にプロパティ値を指定)。
作成した .xlsx ファイルは単体テストクラスのソースファイルと同じ名前にして(EmployeeStoreTest.cs ならば EmployeeStoreTest.xlsx とする)、 単体テストクラスのソースファイルと同じフォルダに保存します。
単体テストは以下のように記述します。
using XPFriend.Fixture;
を追加する。Excelシート名__テストケース記述
という名前でテストメソッドを作成する。- FixtureBook.ExpectReturn メソッドでテスト対象メソッドを呼び出して、予想結果のチェックを行う。
...
using XPFriend.Fixture;
...
[TestClass]
public class EmployeeStoreTest
{
[TestMethod]
public void GetEmployees__引数の退職フラグがtrueの場合データベーステーブルEmployees上の退職者のみが取得できる()
{
FixtureBook.ExpectReturn((Employee parameter) => new EmployeeStore().GetEmployees(parameter));
}
}
このテストを実行すると、以下の処理が行われます。
B.テストデータクリア条件
に記述された条件でデータベーステーブルからデータ行を削除した後にC.テストデータ
に記述されたデータがデータベーステーブルに追加される。D.パラメタ
に記述された内容で Employee クラスのインスタンスが作成され、引数(Employee parameter
)として渡される。- テスト対象処理
new EmployeeStore().GetEmployees(parameter)
が実行される。 GetEmployees
の戻り値がE.取得データ
に記述した内容と合致しているかどうかがチェックされる。
この例では、
ExpectReturn
を使いましたが、 戻り値をチェックしない場合にはExpect
、 例外発生をチェックしたい場合にはExpectThrown
が利用可能です。
Excelシート名とテストクラス名が同じ場合は、
Excelシート名__テストケース記述
というテストメソッド名の代わりにテストケース記述
というふうに Excel シート名を省略した形のメソッド名にすることもできます。
- API
FixtureBook の操作は以下のメソッドでできます。
Setup | B.テストデータクリア条件 に記述された条件でデータベースからデータ削除した後にC.テストデータ に記述されたデータをデータベースに追加する。 |
GetObject / GetList / GetArray | D.パラメタ に記述した内容で初期化されたオブジェクトを取得する。 |
Validate | 引数に指定されたオブジェクトがE.取得データ に記述した予想結果と同じかどうか検証する。 |
ValidateStorage | DB上のデータがF.更新後データ に記述した予想結果と同じかどうか検証する。 |
Expect | (1)Setup でデータのセットアップを行い, (2) GetXxx でパラメタオブジェクトを取得し、(3) 引数に指定された処理を実行し、(4) ValidateStorage でデータ状態の検証を行う。 |
ExpectReturn | (1)Setup でデータのセットアップを行い, (2) GetXxx でパラメタオブジェクトを取得し、(3) 引数に指定された処理を実行し、(4) Validate で実行した処理の戻り値を検証し、(5) ValidateStorage でデータ状態の検証を行う。 |
ExpectThrown | (1)Setup でデータのセットアップを行い, (2) GetXxx でパラメタオブジェクトを取得し、(3) 引数に指定された処理を実行し、(4) Validate で実行した処理中に発生した例外を検証し、(5) ValidateStorage でデータ状態の検証を行う。 |
ValidateParameterAt | Expect / ExpectReturn / ExpectThrown を実行した後の引数の値が「E.取得データ」に記述された値と同じになっているかどうかを検証する。例えば FixtureBook.Expect((Data data1, Data data2) => ...).ValidateParameterAt(0); とすると、data1 の値が「E.取得データ」で記述されたものと同じになっているかどうかを検証できる。 |
以下のように、クラスまたはメソッドに [FixtureBook]
属性を指定すると、
利用する .xlsx ファイルのパスを明示的に指定できます。
[TestClass]
[FixtureBook("Test/More/EmployeeStoreTest_02.xlsx")]
public class EmployeeStoreTest
[FixtureBook]
属性がクラスとメソッドの両方に付いている場合は、
メソッドで指定されたパスが優先的に利用されます。
「A.テストケース」記述の内容とメソッド名を同じにしたくない(または同じにできない)場合は、
以下のように [Fixture]
属性が利用できます。
[TestMethod]
[Fixture("GetEmployees", "引数の退職フラグがtrueの場合データベーステーブルEmployees上の退職者のみが取得できる")]
public void TestMethod1()
- 利用上の制約
FixtureBook には現在のところ以下の制約があります。
- Excelファイルは
.xlsx
形式のみ利用可能 (.xls
形式ファイルは利用できない)。 - 利用可能なデータベースは Oracle および SQLServer です。
- もっと詳しく!
FixtureBook について、もっと詳しく知りたいときは、以下のドキュメントも参照してみてください。