2つの理由:
- それは遅いです(そしてユニットテストは速い必要があります)
- それはあなたの制御を超えた余分な障害点を追加します(DB接続が失敗したときにテストは本当に失敗しますか?)
代わりに、作成者が提案しているように、SQLiteなどのインメモリデータベースを使用してDALをテストする必要があります。これにより、上記の問題が解消されます。
ただし、このアプローチには欠点もあります。1つのデータベースダイアレクトからSQLiteへのSQLの移植で問題が発生する可能性があります。これは当然、DALのMySQL固有の部分をテストできないことを意味します。いつものように、それは両刃の剣です-ユニットテストの速度と分離は得られますが、信頼性は失われます(このように呼ぶことができれば)-SQLiteに合格した場合、MySQLで動作することを100%確信できますか?
DAL / DAOテストのコアを統合テストフェーズに任せるのはそれほど悪い考えではないかもしれません。統合テストフェーズでは、使用する実際のDBエンジンに対してそれらをテストし、単体テスト用に小さなものを残します。たとえば、マッピング(つまり、ORMを使用する場合)。
編集:高速は決して厳密な要件ではありません-それはちょうど良い一般的なアドバイスです。TDDを実行する場合、開発者は単体テストを頻繁に実行します(このように考えてください。ローカルリポジトリへのすべてのコミット/すべての重要なコード変更には、単体テストを実行することによるコードベースの整合性チェックが必要です)-おそらくすべてではありませんが、確かに一部です。このプロセスを迅速に行う必要があります。
さて、遅いテストは通常次のように終了します。
- 「男、これはとても遅いです...」
- 「たぶん、そのうちのいくつかを実行することができます...後で残りを実行します」
- この時点で、後で来ることはありません。
- 「ねえ、私の最後のコミットは何も壊さなかったし、テストもまったく実行しなかった!」
- 「どうしてやっぱり走るの?」
実行されていないテストを作成すると、テストを作成する目的がほとんど失われます。
このことは私と一緒に働いている友人に起こりました。彼のチームはテストスイートを+/- 20分実行し(DALテストは不十分で、IoCコンテナーはテストに関与していました)、開発者はいくつかのテストを実行し始め、すぐに「現在のビルドブレーカー」の電子メールが日常的になりました。彼らはかなり大きなスイートを持っていましたが、テストを破ることはそれほど悪くはありませんでした。
全体的に、あなたのアプローチは正しいようです-私はテストをSQLiteに移しません。私が提案したように、統合テストスイートでデータベースレイヤーをテストします(通常の単体テストスイートとは別に実行できるようにします)。