0

データベースに対してドメイン サービスをテストするために、他の人がどのようなアプローチをとるのか疑問に思っていました。ドメイン サービス自体をテストするために、ドメイン サービスで使用できる一連のモック リポジトリが既にあります。これらのモック リポジトリの構築の一部は、サンプルの集計と関連するエンティティを構築し、それ以外の場合はモデル内で使用されるのと同じビジネス ルールに対してそれらを検証することです。これは、インターフェイスが変更された場合に、エンティティ自体の潜在的な影響ポイントを検出するための優れた簡単な手段も提供します。

SQL ベースのリポジトリのライブ テストで見られる主な問題は、データベースの一貫性です。たとえば、テストが実行されると、「作成」の側面はすでに実行されています。データベースが元の状態ではなくなるため、それらを再度実行すると、明らかに障害が発生します。この種のテスト専用に使用されるミラーリングされたデータベースを作成することを検討していました。構造、プログラマビリティ、制約などを含む最小限のものになります。また、特定の確立されたテスト用に最小限のデータセットを提供します。私の考えでは、テストの実行を開始する前に、ベース データを使用してデータベースを「元の」状態にリセットするために呼び出すことができるストアド プロシージャを作成できます。

これは、機能が最初に検証された後、開発者のマシンではそれほど重要ではありませんが、ナイトリー ビルドの一部としてこれらのテストを実行することの重要性について詳しく調べています。これにより、テストが失敗した場合に、ターゲットの展開環境 (特にこの場合、テスト チームが使用する環境) を汚さないようにビルドを保留することができます。

必ずしもプラットフォームが重要だとは思いませんが、実装に固有の懸念がある場合に備えて、私の環境は次のようになります。

Windows 7 (開発) / Windows Server 2008 R2 (サーバー) Visual Studio 2008 Team Edition (C#) Microsoft SQL Server 2008 Standard (開発/サーバー)

チーム ビルドを使用してビルドを実行していますが、それはおそらく質問の範囲内の要因ではありません。

4

5 に答える 5

2

たとえば、テストが実行されると、「作成」の側面はすでに実行されています。データベースが元の状態ではなくなるため、それらを再度実行すると、明らかに障害が発生します。

単体テストをトランザクション対応にすることができるかもしれません。テストを実行してロールバックすると、データベースは変更されません。

Spring には、これを簡単に実行できるトランザクション ユニット テスト クラスがあります。必要なのはトランザクションマネージャーだけです。

于 2009-09-12T22:23:55.167 に答える
1

SQL Server Express (私は 2005 で実行しましたが、2008 では試していません) を使用して、ファイルとして保存される「テスト デッキ」データベースをセットアップできます。これらはソース管理にチェックインでき、テスト ヘルパー クラスは (a) それらを一時フォルダーにコピーし、(b) それらを書き込み可能にし、(c) それらに接続することができます。元の状態に戻すには、一時コピーを削除して ac を繰り返します。

これは大きな苦痛です。(duffymo が提案したように) トランザクションでやり遂げることができれば、私はそれで行きます。トランザクションの問題点は、ネストされたトランザクションと分散されたトランザクションです。コード内のトランザクションに注意してください。

于 2009-09-12T22:35:31.883 に答える
1

データベースにヒットしているリポジトリの単体テストを実際に実行している場合は、単体テストを行っていません。これは役に立つテストかもしれませんが、単体テストではありません。それが統合テストです。それを行い、それを統合テストと呼びたい場合、それはまったく問題ありません。ただし、リポジトリで優れた設計原則に従っている場合は、単体テストでデータベースをテストする必要はありません。

簡単に言えば、リポジトリ単体テストは、リポジトリへの入力に基づいてデータベースで発生する広範な影響をテストすることではありません。リポジトリへの入力が、そのような一連の値を持つコラボレーターへの呼び出しになることを確認することです。

ご覧のとおり、リポジトリは、残りのコードと同様に、Single Reposibility Principle に従う必要があります。基本的に、あなたのレポジトリには 1 つだけのリポジトリがあり、それはドメイン モデル API の懸念を基礎となるデータ アクセス テクノロジ レイヤー (通常は ADO.Net ですが、Entity Framework や L2S など) に仲介することです。ADO.Net 呼び出しの例を使用すると、リポジトリはデータ レイヤーのファクトリになるという責任を負うべきではなく、代わりに ADO.Net データ インターフェイス (具体的には IDbConnection/IDbCommand/IDbParameter) からの共同作業者に依存する必要があります。等)。コンストラクターのパラメーターとして IDbConnection を取得し、それを呼び出すだけです。これは、インターフェイスに対してリポジトリの単体テストを記述し、モック (または偽物やスタブなど、必要なもの) を提供し、必要なメソッド、順番に、期待される入力が行われます。この正確なトピックに関する私の MS ブログをチェックしてください ->http://blogs.msdn.com/b/schlepticons/archive/2010/07/20/unit-testing-repositories-a-rebuttal.aspx

これが、将来のテストと設計で間違いを犯すのを防ぐのに役立つことを願っています.

ところで:データベースを単体テストしたい場合は、できます。Visual Studio データベース テストを使用するだけです。その組み込みの INTO vs は、VS2005 から使用されています。これは新しいことではありません。ただし、注意が必要です。これらは完全に個別の単体テストである必要があります。

于 2010-07-22T19:31:10.900 に答える