コメントだけでは捉えきれなかったので、質問へのコメントに回答を添えて…
各テストの間にデータベースをセットアップして解体することは、確かにパフォーマンスにとって非常にコストがかかる可能性があります。そして、それをどのように行うかは、データベース自体に完全に依存します. (MS SQL、MySQL、PostgreSQL など) 同じコードを使用しながら、完全にメモリ内のデータベースをスワップ アウトすることができれば、テストごとにセットアップと破棄を行うのが最も高速です。
たとえば、MS SQL のインスタンスに対してテストを実行する必要があるプロジェクトがありました。セットアップとティアダウンにより、テストが大幅に遅くなりましたが、テスト カバレッジを拡大する価値があると判断しました。(統合テストはチェックイン時ではなく夜間に実行したため、大したことではありませんでした。) データベースを完全に更新するために、次のコードを使用しました (C# です。申し訳ありません)。
var procInfo = new ProcessStartInfo
{
Arguments = string.Format(@"/Action:Publish /SourceFile:{0} /p:CreateNewDatabase=True /TargetConnectionString:""{1}""", ConfigurationManager.AppSettings["SQLPackageFile"], ConfigurationManager.ConnectionStrings["ConnectionString"].ConnectionString),
CreateNoWindow = true,
ErrorDialog = false,
FileName = ConfigurationManager.AppSettings["SQLPackageExecutable"],
RedirectStandardOutput = true,
UseShellExecute = false
};
var proc = new Process
{
StartInfo = procInfo
};
proc.Start();
次に、テストの構成では、次の 3 つの値がありました。
- データベースの接続文字列。
- セットアップ/破棄を行うための MS SQL のコマンドライン実行可能ファイル。
- 実行可能ファイルがセットアップに使用した SQL パッケージ ファイル。
したがって、各テストの前にこれを実行して、ソース管理からの SQL パッケージに基づいてデータベースを既知の初期状態に完全に更新します。繰り返しますが、これは非常に遅かったですが、うまくいきました。あなたのために働くより速い解決策があるかもしれません。(おそらく、データベースを削除して再作成する代わりに、テーブルを切り捨てて再作成するか、テーブルを削除して再作成するなどです。いじって、ニーズに合ったものを見つけてください。)
さらに、SQL の依存関係以外を汚染することなく、これがドメイン モデルに適合することを確認したかったのです。データ アクセスに使用していたモデルは、リポジトリ パターンでした。基本的に、私たちの中央ドメイン コードには、ドメイン モデル (DB テーブルやその他の依存関係とは結合されていません) と、それらのモデルのリポジトリ インターフェイスがありました。次に、データ アクセス プロジェクトがこれらのインターフェイスを実装し、ドメイン モデルとデータベース テーブル/列の間で内部的にマッピングしました。
(同じインターフェースに対して、他に 2 つのリポジトリ実装プロジェクトがありました。1 つは、ドメイン ユニット テストに使用されるインメモリ実装でした。これは、リポジトリに送信されるモデルの静的リストを保持するだけでした。もう 1 つは、XML ファイルごとに使用する実装でした。 SQL インスタンスを使用せずにソフトウェアを実行するためのデータの永続性 (アプリケーションの任意のインスタンスで使用されるものは、依存性注入コンテナーの構成設定によって決定されます)。
そこで、 というドメインに別のインターフェイスを追加しましたDataResetter
。次に、各データ アクセスの実装 (SQL、インメモリ、XML) がそのインターフェイスを実装しました。SQL は上記のコードと構成値を使用し、インメモリは静的リストをクリアし、XML は XML ファイルを削除しました。
これにより、テストでドメイン機能をテストのセットアップとティアダウンに使用できるようになり、依存性注入コンテナーが使用する実装を決定できるようになりました。そうすれば、テストは特定の実装と結合されませんでした。これに対する追加の利点は、ユニットと統合の目的で同じテストを使用できることでした。それらの違いは、構成設定にすぎません。
(最初に完全なドメインがメモリ内のモック実装で動作することをテストし、次に、1 つの依存関係の実装でドメインを再度テストし、別の依存関係の実装で再度テストするなど。最終的には、同じ一連のテストを毎晩 12 回、12 回実行することになりました。システム全体のさまざまな依存関係の実装. 一度に 1 つの依存関係. これにより、テストの任意の実行で新しい変数が 1 つしかないため、何かが壊れたときに簡単に確認できました。)