次の方法で共有


EF Core アプリケーションのテスト

テストは、ほぼすべてのアプリケーションの種類にとって重要な懸念事項です。これにより、アプリケーションが正しく動作することを確認し、その動作が将来低下するかどうかをすぐに確認できます。 テストはコードの設計方法に影響を与える可能性があるため、早期にテストを計画し、アプリケーションの進化に合わせて適切なカバレッジを確保することを強くお勧めします。 この入門セクションでは、EF Core を使用するアプリケーションのさまざまなテスト戦略の概要を簡単に説明します。

データベースの関与 (または関与しない)

EF Core アプリケーションのテストを記述する際に行う必要がある基本的な決定の 1 つは、アプリケーションと同様に、運用データベース システムにテストを含めるか、テストを テスト ダブルに対して実行するか (運用データベース システムを置き換える) かどうかです。 EF Core コンテキストでのテスト ダブルの 2 つの顕著な例は、 SQLite メモリ内モードメモリ内プロバイダーです

さまざまなアプローチの詳細な比較と分析については、「 テスト戦略の選択」を参照してください。 以下は、さまざまなオプションを使用して速度を上げるのに役立つ簡単なポイントバイポイントの概要です。

  • 開発者は、これが困難または低速であると考えるため、運用データベース システムに対するテストを頻繁に避けます。 これは、Microsoft のエクスペリエンスでは常に当てはまるとは限りません。このアプローチにチャンスを与えることをお勧めします。 運用データベース システムに対するテスト では、これを確実かつ効率的に行うための手法が提供されます。 データベースに対して少なくとも一部のテストを記述することは、通常、アプリケーションが実稼働データベースに対して実際に動作することを確認するために必要です。また、データベースを含まないテストは、テストできる内容に制限される可能性があります (以下を参照)。
  • インメモリ プロバイダーは、多くの重要な方法で実際のデータベースのように動作しません。 一部の機能は、まったくテストできません (トランザクション、生の SQL など)。一方、他の機能は運用データベースとは動作が異なる場合があります (クエリでの大文字と小文字の区別など)。 メモリ内は単純な制約付きクエリ シナリオでは機能しますが、非常に制限されており、使用しないことをお勧めします。
    • クエリの DbSet のモック作成は複雑で困難であり、メモリ内のアプローチと同じ欠点に苦しんでいます。これもお勧めしません。
  • SQLite はそれ自体が本格的なリレーショナル データベースであるため、SQLite インメモリ モードでは、実稼働リレーショナル データベースとの互換性が向上します。 ただし、SQLite と運用データベースの間には重要な違いがあり、一部の機能 (例えば EF.Functions 内のプロバイダー固有のメソッドなど) はまったくテストできません。
  • 運用データベース システムのすべての機能に対して信頼性の高いテスト ダブルを使用できるテスト アプローチでは、アプリケーションに リポジトリ レイヤー を導入できます。 これにより、EF Core をテストから完全に除外し、リポジトリを完全にモックすることができます。ただし、これにより、アプリケーションのアーキテクチャが大幅に変更され、実装とメンテナンスのコストが増加します。

詳細については、次を参照してください。

詳細については、「 テスト戦略の選択」を参照してください。 実装ガイドラインとコード サンプルについては、実稼働データベース システムに対するテストと、運用データベース システムを使用しないテストを参照してください