1

アプリでエラーが発生しましたが、これはおそらくいくつかの統合テストでキャッチできたはずです。

私の質問は、これらのテストのセットアップと、テストを実行するコードのレイヤーに関連しています。

設定

多くの統合テストが必要であることを考えると、テストごとにテスト データベースを作成および削除したくありません。私の考えは次のとおりです。

  1. 私の開発データベースの隣にあるテストデータベースを持っています
  2. テストの前に、スキーマを正しく設定し、必要なデータを挿入するリセット スクリプトを実行します (テスト ケース固有ではありません)。
  3. このテスト データベースを実際のデータベースのように使用するだけです。

ただし、[セットアップ] ごとに Fluent NHib 構成を実行する必要があるのは非常に無駄に思えます。これだけは厳しいですか?ここでのオプションは何ですか?

私のセッションは現在 UoW パターンでラップされており、作成と破棄は begin_request と end_request (MVC Web アプリケーション) でそれぞれ実行されます。この問題を解決するためにテストでうまく動作するようにこれを変更する必要がありますか?

テスト

実際にいくつかのテストを書くことになると、どのようにすればよいですか?

可能な限り最高レベル (MVC コントローラー アクション) からテストするか、最低レベル (リポジトリ) からテストする必要があります。

最低でテストすると、すべてのデータを手動でハードコーディングする必要があります。これにより、コードの変更に対してテストが脆弱になり、実行時にコードで実際に何が起こるかを表すこともできなくなります。最高でテストする場合、すべての IoCC セットアップを実行して、依存関係が注入され、すべてが機能するようにする必要があります (これも [SetUp] ごとに繰り返しますか?)。

うーん!私は道に迷っています。誰かが私を正しい方向に向けてくれます!

ありがとう

4

2 に答える 2

2

セッション ファクトリの作成に関しては、テスト プロジェクトで _AssemblyCommon というクラスを作成し、そこからセッション ファクトリを静的として公開します。[SetupFixture] (NUnit) 属性でマークされたメソッドは、セッション ファクトリを構成します。

一般に、統合テストでは、リポジトリでの CRUD 操作をカバーする必要があります。これを行うには、オブジェクト (または集約ルート) ごとに 1 つのテスト メソッドを用意し、そのメソッド内で挿入、取得、更新、および削除をすべて実行します。また、定義したカスケード削除もテストします。これらの操作を 1 つの方法で行うと、データベースに痕跡が残りません。テストデータを残すいくつかの統合テストがありますが、それは問題ではありませんでした。

高レベルの操作は単体テストを行い、可能であればリポジトリをモック (私は Moq を使用) する必要があります。

于 2009-04-17T12:12:22.917 に答える
1

私の現在の MVC アプリでは、リポジトリとデータベース間の相互作用をテストするだけで十分であることがわかりました。何よりも、これは NHibernate マッピングの問題を解決するためです。その層より上にあるすべてのもの (すべてを言うと誇張しています) は、個別に単体テストされます。コントローラーからスタックを下ってデータベースまでの統合テストをいくつか行いました。これらは IoC コンテナー (StructureMap) を使用してコントローラーと依存関係を構築しましたが、これらのテストは実際には何も追加していないことがわかりました。維持するためのオーバーヘッドがあるため、今のところ「統合」テストからそれらを削除しました。それらを入れる理由が見つかるかもしれませんが、今のところまだ行っていません。

とにかく、私が使用するテストプロセスは次のように機能します。

データ アクセス レイヤー テスト アセンブリのビルド プロセスは、FluentNHibernate 構成の ExposeSchema() 呼び出しを介してテスト データベースを作成します。次に、ビルド プロセスは、いくつかの NHibernate リポジトリ レベルのコードを実行して、データベースに参照テーブルを設定します。

実行される各統合テストは、System.Transactions.TransactionScope using() ステートメントでラップされ、TransactionScope で Complete() が呼び出されることはないため、各テストを分離して実行し、結果を using() スコープ内でセットアップおよび検証できます。他のテスト データの状態を変更せずに ISession によって。例えば

  using (new TransactionScope())
  {
    var session = NHibernateTestSessionCreator.GetNHibernateSessionForIntegrationTesting();
    // This is an NHibernate ISession - setup any dependencies for the repository tests here

    var testRepository = new NHibernateGenericRepository<NewsItem>(NHibernateTestSessionCreator.GetNHibernateSessionForIntegrationTesting())
    // repository test code goes here - the repository is using a different ISession

    // Validate the results here directly with the ISession
  }

  // at this point the transaction is rolled back and we haven't changed the test data

これは、使用している UnitOfWork 実装を変更する必要がないことを意味します。トランザクションはより高いレベルでロールバックされます。

于 2009-04-17T12:59:31.023 に答える