QA@IT

.NET で DB を使ったテストを行うのに良いライブラリ/フレームワークを教えて下さい。

11256 PV

django では簡単にDB初期化→データ投入→テストが行えますが、 .NET ではなかなかできません。
S2Unit.NET が現状では一番理想に近いですが、 EXCEL でデータを設定しないとダメなため、少し面倒です。
世の中の .NET 開発者はどのようにDB込みのテストをしているのでしょうか?

2012/05/29 追記
様々な方法の寄せ集めにはなりますが、自分の理想とする形はこんな感じです。
提示いただいた方法だと、これが実現できるよ、という形で回答いただけると助かります。

  1. テストに使用するDBは、開発時・本番時に使用するDBとは独立している。
    • テスト実行後に開発用DBの内容がテスト前と一致する。
    • djangoが実現しています。
    • S2Unit.NETはトランザクションを使用して一部実現しています。
  2. テスト開始時、DB内に任意の初期データを投入できる。
    • テスト前提条件を設定し、いつでもテストが同じ条件で開始できる。
    • djangoは可能ですが、初期データはJSON、XMLで定義するため、いまいちメンテナンスがしにくいです。
    • S2Unit.NETはEXCELのため、メンテナンスも比較的手軽です。
  3. テスト対象メソッド実行後、DB内のデータを有るべき姿と比較できる。
    • テスト事後条件を設定し、いつでもあるべきテスト結果が得られる。
    • djangoはコードで結果を比較します。
    • S2Unit.NETはEXCELのため、メンテナンスも比較的手軽です。

回答

ターゲットのDBサーバと、利用するミドルなどの状況により回答が変わってしまうのですが、 .NET なので SQL Server で書くと初期データを揃えるには create databaseに as snapshot オプションで既存のデータベースのスナップショットコピーを作れます。これによってテストデータの入ってるDBをスナップショットしてテストで利用して捨てる等ができます。

http://technet.microsoft.com/ja-jp/library/ms176061.aspx

1 はテストが操作するのはスナップショットになりますので、開発DBは変更されませんので満たされます。
2の任意のDB状態からのテスト開始はスナップショット元DBを複数用意すれば良いでしょうし、スキーマ定義のみのDBをスナップショットして任意データを投入してから実行する事で複数のスナップショット元DBを保持しないで済むようにできるかもしれません。

トランザクションを使う場合などはこっちの方が多分使い勝手がいいでしょう。
スナップショットを捨てる前に中身をselectしてみれば 3も実現できそうな気がします。

編集 履歴 (0)
  • 回答ありがとうございます。
    as snapshot オプションは初めて知りました。S2Unit.NETと組み合わせて、テスト開始時にスナップショット→truncate→[S2Unit.NET]ReadXlsWriteDbとやれば任意の初期データを用意することができそうです。
    -

DB接続部分をクラスにより抽象化して、NUnitでのテスト時にはSQLiteに接続しています。
セットアップ時にDBファイルを上書きすればいいのでらくちん。

編集 履歴 (0)
  • 回答ありがとうございます。自分も以前その方法でやってたことがありました。標準SQLのみ使い、型に互換性があればそれでもいけたと思います。ただ、細かい違いがネックになったことがあったような・・・ -

NUnitを使っています。
Setupでトランザクションを開始して、Teardownでロールバックするテストコードを書くことがあります。

編集 履歴 (0)
  • 回答ありがとうございます。
    S2Unit.NETもそうですが、テスト開始時にトランザクションを使ってしまうと、例外発生時などがテストできないんですよね・・・
    -

現状.NET Framework向けにDjangoやSlim3(Java/GAE)ほど洗練されたフリーなテストフレームワークは無いと思います。(エンティティ周りで)

私が今やっている方法は、NUnitを使用していますが、テストのセットアップでテスト対象のテーブルをTRUNCATEして、テーストデータを挿入するようにし、対象テスト実行、ティアダウンで変更したデータの後片付けをするようユニットテストに書いています。大変ですけど。

編集 履歴 (0)
  • 回答ありがとうございます。
    やはりそんな方法ですよね。私も以前は自前でそういう方式を使い、S2Unit.NETにたどり着きました。ただ、やはりdjangoなどの今時のフレームワークの手軽さには及ばない感じです。
    -

VIsual Studio Premium以上の機能になってしまうのですが、データジェネレータという機能があります。これで自動的にスキーマに従ったデータを作ってくれます。中身はスキーマの仕様を満たすそれなりのものです。データの内容はある程度正規表現で調整できます。
http://msdn.microsoft.com/ja-jp/library/dd193262.aspx
データベース単体機能テスト。
http://msdn.microsoft.com/ja-jp/library/dd193282.aspx

この機能が使えないProfessionalやExpressですと、ビルド時にすでにあるテスト用のSQL Serverのデータベースファイルをアタッチする、Professionalの単体機能テストだと、単体テストの起動時イベントにデータを登録するようなコードを追加することになると思います。

私がdjangoとS2Unit.NETをほとんど知らないので、外れているようでしたらすいません。

編集 履歴 (0)
  • 回答ありがとうございます。
    データジェネレータは初耳です。基本的にはVisual Studioを起動してテスト、という形になるのでしょうか。
    そうするとJenkinsなどのCIツールで自動実行は難しい気がしますね。
    -
ウォッチ

この質問への回答やコメントをメールでお知らせします。