2010-11-18 2 views
3


私はDBと通信するC#アプリケーションを持っています。私はDBに依存するいくつかの関数をテストしたい。だから私はDBが各テストの実行の前に初期状態を持っていることを確認したい。私はNUnitを使ってアプリケーションをテストします。 DBの初期状態を復元するにはどのような手段がありますか?
ありがとうございました!ユニットテストデータベースに依存する動作C#

+3

単体テストは通常​​、あなたのコードを孤立してテストすることを意味します... DBを模倣するのはどうですか? –

+0

時々私はストアドプロシージャをテストする必要があるので、それを模擬する方法はありません。場合によっては、テストで多くのデータが必要になることがあります(任意ではありませんが、複雑に接続されています)。だから、dbで一度だけデータを準備し、それをいつも使うのは、偽のリポジトリよりもはるかに簡単です。 – StuffHappens

+2

NUnitはユニットテストのためのユニットテストと統合テストを混在させているようです。 – weismat

答えて

0

あなたのようなモックアッププログラム(プラグイン)を使用する必要があります。

5

データベースとの対話テストは行わないでください。このタイプのテストは、統合テストと呼ばれます。これには通常のテストツール(NUnit、MSTestなど)を使用できますが、統合テストを別のプロジェクトに分け、専用のテストデータベースを使用し、トランザクション内でこれらのテストを実行するのが最も良い方法です(たとえば、TransactionScopeを使用してください)。あなたはロールバックします。これにより、データが変更されず、テストの動作が予測可能になります。これは非常に重要です。

可能であれば、データベースなどの外部ソースをすべて偽装して(通常はより高速な)単体テストを実行できるようにアプリケーションを設計してください。しかし、これは簡単ではありません。特に、テスト容易性のために設計されていない既存のアプリケーションを扱う場合。このシナリオでは、統合テストを開始するのがよい方法を見つけました。

+1

これは最も実用的な答えです! – vinayan

1

他の人は言っているように、あなたはDBに依存してはならず、ユニットテストの構造です。 したがって、私はそれを使用するコンポーネント(別名DB抽象化レイヤー)からDBを隠し、ユニットテストのためにインメモリDBを実装するInterfaceを作成します。

このインメモリDBのテーブルは、各DBテーブルの単純なC#HashTableを使用して実装できます。

このセパレーションは、使用するコンポーネントから変更される可能性のあるDB(MySQLからOracleなどへの移動など)間でコード内に分離を作成するメリットもあります。

0

のテストでMbUnitに切り替えることを検討してください。それは非常に便利ですロールバックあなたのニーズに合わせて正確に属性。

MbUnitには、NUnitのテストクラスとメソッドのマーキングと同じ属性があります。したがって、使用するディレクティブを変更し、MbUnit dllを参照するだけで済みます。

関連する問題