背景のビット:
RavenDB に格納されている非正規化された一連のドキュメントから読み取る Web アプリケーションがあります。これらのドキュメントは、イベント ハンドラーによって作成および変更されます。本番環境では、アプリケーションは、c# API を介してリモート データベースに接続する標準のドキュメント ストアを使用します。
アプリケーションの単体テストを行うときは、インメモリ組み込みデータベースを使用するようにハンドラーを構成し、いくつかのイベントを作成し、予想されるドキュメントをクエリします。これは絶対にうまくいきます。
UI テストの作成:
テスターが SpecFlow と Selenium を使用して自動化された UI テストを作成できるようにしたいと考えています。(SQL を使用して) 他のアプリケーションにこれを実装する場合、機能ファイルの実行により、次の方法でテスト環境が準備されます。
- ローカルの SQLExpress インスタンスに新しいデータベースを作成する (慣例により、全員が自分のマシンで同じインスタンス名を持ちます)
- 新しいデータベースを使用するようにハンドラーを再構成し、イベントを発生させて目的の状態を作成します
- テスト中の Web アプリケーションを新しい一時的な場所にコピーし、新しいデータベースから読み取るように再構成します
- IIS Express で Web アプリケーションを開始します (ここでも、全員がこの規則に従います)。
- 機能を実行し、必要に応じてそれぞれの状態を非表示にして再構築します
- IIS を停止し、テスト対象のアプリケーションを削除して、データベースを削除します
今、私は Raven を使用して同じアプローチに従いたいと考えており、2 つのアプローチを検討しています。
1 つ目は、上記とまったく同じモデルに従うことです。ここで私が抱えている問題は、データベースをどのように/どこに保管するか、および後でそれらを整理する方法です。サーバーの実行可能ファイルは、セットアップとティアダウン中にプログラムで開始および停止でき、後でファイルを削除することでデータベースを削除できました。私はこれを試していませんが、理論的にはうまくいくはずです。
2 つ目は、同様のアプローチに従いますが、標準のドキュメント ストアを組み込みのドキュメント ストア (メモリ内で実行されない) に置き換えます。これを機能させるには、Web アプリケーションの IoC (xml で構成を使用する場合に可能) を変更して、IDocumentStore を EmbeddedDocumentStore に解決する必要があります。次に、前と同じようにハンドラーを使用して状態を構築し、IIS を開始する前にハンドラーのドキュメント ストアを破棄します (私が欠落していない限り、同じ組み込みデータベースを使用する 2 つのアプリケーションを同時に実行することはできないようです)。なにか)。
最初は 2 番目のアプローチの方が適しているように思えましたが、ハンドラーによって作成されたドキュメントが、Web アプリケーションがクエリを実行したときに返される結果と一致しないという奇妙な動作に遭遇しています。具体的には、一部の子コレクションはハンドラーによって設定されますが、Web アプリケーションによって実行されたクエリから返されると空になります。正直なところ、これが組み込みデータベースの使用を意図したシナリオであるとは思えないので、あまり驚きませんでした。さらに、あるアプリケーションから別のアプリケーションにジャンプするときに、管理スタジオを介して組み込みデータベースを表示するのは非常に困難です。
とにかく、その長い説明の後、他の人がこれらのアプローチについてどう思うか興味があり、より良い代替手段がある場合、私は見逃しています. さらに、私が気付いていない隠された RavenDB の宝石がたくさんあると確信しているので、その方向へのポインタも役に立ちます。