それらの単体テストは正確に何をテストしますか?典型的なDALコードを検討することは、実際の作業をサードパーティのデータアクセスコード(ADO.NET、EntityFramework、NHibernate)に委任すること以上のことはめったにありません。
私はADO.NETをあまり使用していませんが、このNHibernateの例で十分だと思います。
public User GetUser(int id)
{
using (var session = sessionFactory.OpenSession())
{
return session.Get<User>(id);
}
}
もちろん、コードが正しく記述されていると仮定すると、すべての依存関係(sessionFactory
つまり)はインターフェイスを介して渡されるため、スタブ化が容易になるため、単体テストを記述できます(それを実現するには多くのものをモックする必要があります) 。
純粋主義者のアプローチは、そのような単体テストを作成することです。これは、コードが実際に想定どおりに機能することを証明するもう1つのデータポイントであるためです(呼び出しGet
)。ただし、このようなテストは、プロバイダーによって行われたデータベースアクセス全体をスタブ化する必要があるため、かなりコストがかかることに注意してください(sessionFactory
モックセッションを返すためにモックを作成し、その後、呼び出された呼び出しをチェックします)。
とにかく実際のデータベースとの統合テストを作成する必要があるため、これを行うのは難しい決定です(この場合は純粋主義的なアプローチに従うかどうか) 。そして、それらのテストは、あなたが書いた単体テストとまったく同じ領域をカバーしますが、実際の環境で動作します(スタブされたものではありません)。
私の経験では、単体テストDALは通常、それが提供するメリットの価値がありません。特に、単体テストのコストがかなり高く(データベース環境をスタブ化するためのコードの記述に費やす時間)、適切な統合テストスイートが存在する場合とは対照的です。
そして最後に、あらゆる種類のテストでインメモリデータベースを使用しないことをお勧めします。以下の理由により:
- 遅いです
- 制御が難しい可能性のあるいくつかの障害ポイントがあります(ORM構成、メモリ内データベースのセットアップ、無効なテストデータの可能性があります)
- 統合テストを行うという誤った感覚を与えます(そうではありませんが、インメモリデータベースは実際の本番データベースとはまったく異なる動作をする可能性があります)
まったく同じデータベースをメモリにロードできない限り、分離された単体テストのバックアップを使用して、適切な統合テスト(DALテストの優先順位)に固執します(それらを書き込む余裕がある場合のみ)。