2011-10-19 1 views
3

可能性の重複:
Unit testing on code that uses the Databaseユニットテストデータベースのコード

私はユニットテストを開始し、私のデータベースへの実際の変更を行っているユニットテストの方法にどのように疑問に思って。最良の方法は、それらをトランザクションに入れてロールバックすることですか、これにはよりよいアプローチがありますか?

+0

参照してくださいます。http:/ /stackoverflow.com/questions/2472928/unit-test-insert-update-delete –

+0

似たような質問に私の答えをチェックしてくださいhttp://stackoverflow.com/questions/7786750/unit-testing-database-methods/7803108# 7803108 – Chaitanya

答えて

3

あなたは適切なテストカバレッジをしたい場合は、2種類の試験が必要です。すべての実際のデータへのアクセスをモック

  • ユニット・テストを。これらのテストはacuallyデータベースへの書き込みが、(それは他の依存関係に呼び出すメソッドなど)したクラスの振る舞い

  • システムがいることを確認(または統合テストを)テストをテストしません。データベースにアクセスして変更することができます。あなたのモデルオブジェクトのそれぞれに対して単純な単純なCRUDテスト(作成/読み込み/更新/削除)、実際のメソッドのより複雑なシステムテスト、およびテストするのに興味深い、または有益であるとみなされるすべての2つのタイプのテストを考えました。ここでの良い方法は、各テストを空の(または「テストの準備ができている」)データベースから開始し、その作業を行い、次にデータベースの状態をチェックすることです。これを達成するには、トランザクション/ロールバックが良い方法です。

0

一般的なアプローチは、データベース操作を模擬する方法です。そのため、ユニットテストは、利用可能なデータベースや特定の状態に依存しません。それはまた、あなたのデータ層を模倣するのに必要な分離を容易にする設計を意味するとも述べています。ユニットテストとそれをうまくやり遂げる方法は、巨大な話題です。 MockフレームワークのためのgoogleyとDependency Injectionを最初に見てみましょう。

0

実際のデータベースに対してテストしたい場合、これは統合テストと単体テストになります。テストでトランザクションをラップすると、データベースを一貫した状態に保つことができます。 これを基本クラスで行い、TestInitialize関数とTestCleanup関数を使用して、これが常に発生することを確認しました。

しかし、実際のデータベースをテストすると、パフォーマンス上の問題が発生します。だから、最初からあなたのデータベースアクセスコードをメモリ上で動くものと交換できることを確認してください。私はどのデータベースアクセスコードをターゲットにしているのではなく、UnitOfWorkRepositoryのようなデザインパターンは、データベースコードを分離し、メモリ内のソリューションに置き換えるのに役立ちます。

0

O/Rマッパーを開発していない場合は、データベースコードをテストする必要はありません。あなたはADO.NETメソッドをテストしたくありません。代わりに、ADO.NETメソッドが適切な値で呼び出されていることを確認する必要があります。

Googleでリポジトリパターンを検索します。 CRUDメソッドとのインターフェイスIRepositoryの実装を作成し、これをテスト/模擬します。

+0

私は同意しません。 ADO.NETはうまくいくかもしれませんが、あなたが使っている方法はうまくいかないかもしれません。メソッドが実際にデータベースに書き込んで期待することを実行できることを確認することが重要です。 – Guillaume

+0

はい、しかし、統合テストを行っているときは、単体テストのためにリポジトリを嘲笑してもかまいません。 –

+1

はい - 適切な単体テストのためには、「十分」以上の場合、リポジトリをスタブまたはモックする必要があります。私は、機能的な範囲を完全にカバーするには、単体テストとシステムテストの両方が必要であると言っていました。 – Guillaume

2

ユニットテストでは、データアクセスコードをモックまたはスタブする必要があります。ほとんどの場合、リポジトリインターフェイスがあり、データをメモリに保存する具体的なリポジトリを作成してスタブするか、動的なモックフレームワークを使用してモックできます。

システムまたは統合テストでは、各テストの前に安定した状態を維持するために、各テスト方法の前にデータベース全体を再作成する必要があります。

1

データアクセスコードをテストしたい場合は、モックとシステム/統合テスト戦略について考えてみてください。

しかし、SQLオブジェクト(たとえばsprocs、ビュー、テーブルなどの制約)をユニットテストする場合は、そこに多数のデータベースユニットテストフレームワークがあります。書かれている)。

いくつかは、私はこれに近づく方法の例で記事の数を書かれている、SQL内でテストを実施し、あなたのコード内の他の人と

MbUnitの/ NUnitのなどを使用する - それかもしれないhttp://dbtestunit.wordpress.com/

その他のリソースを参照してください。有用であること:

http://www.simple-talk.com/sql/t-sql-programming/close-those-loopholes---testing-stored-procedures--/

http://tsqlt.org/articles/