コードベースのどこかに、リモートDBに接続する実際のアクションを実行するコード行があります。このコード行は、10回に9回、言語と環境に固有のランタイムライブラリによって提供される「組み込み」メソッドの呼び出しです。そのため、「自分の」コードではないため、テストする必要はありません。単体テストの目的で、このメソッド呼び出しが正しく実行されることを信頼できます。ユニットテストスイートでまだテストできること、またテストすべきことは、接続文字列が正しいことを確認する、SQLステートメントまたはストアドプロシージャ名。
これは、単体テストがランタイムの「サンドボックス」を離れて外部状態に依存しないという制限の背後にある目的の1つです。実際には非常に実用的です。ユニットテストの目的は、コードことを確認することですあなたが書いた(またはTDDで、書き込みしようとしているが)あなたはそれが思ったように動作します。データベース操作を実行するために使用しているライブラリなど、記述しなかったコードは、記述していないという非常に簡単な理由により、単体テストのスコープの一部であってはなりません。
あなたには、統合テストスイート、これらの制限が緩和されています。今、あなたはできるデータベースに触れる設計テスト、あなたが書いたコードがあなたがしなかったコードでうまく動作することを確認します。ただし、ユニットテストスイートは実行速度が速いほど効果的であるため(これらの2つのテストスイートは分離されたままである必要があります(したがって、開発者がコードについて行ったすべてのアサーションがまだ保持されていることをすばやく確認できます))外部リソースへの依存関係が追加されるため、桁違いに遅くなります。ビルドボットが完全な統合スイートを数時間ごとに実行し、外部リソースをロックするテストを実行できるようにして、開発者がこれらの同じテストをローカルで実行してお互いの足指を踏まないようにします。そして、ビルドが壊れた場合、何をしますか?ビルドボットがビルドを失敗しないようにすることは、本来あるべきことよりもはるかに重要です。
さて、これをどれだけ厳密に守ることができるかは、データベースへの接続とクエリの正確な戦略に依存します。ADO.NETのSqlConnectionオブジェクトやSqlStatementオブジェクトなど、「ベアボーン」データアクセスフレームワークを使用する必要がある多くの場合、ユーザーが開発したメソッド全体は、組み込みのメソッド呼び出しと、そのため、この状況でできる最善の方法は、機能全体をモックし、統合テストスイートを信頼することです。また、テストの目的で特定のコード行を置き換えることができるようにクラスを設計する意欲にも依存します(Tobiが提案するTemplate Methodパターンは、「部分的なモック」を許可するため、良い方法です)
データ永続性モデルがデータレイヤーのコード(トリガー、ストアドプロシージャなど)に依存している場合、データレイヤー内に存在するか、またはクロスするテストを開発する以外に、自分で書いているコードを実行する方法は他にありませんアプリケーションランタイムとDBMSの境界。純粋主義者は、この理由で、ORMのようなものを支持してこのパターンを避けるべきだと言うでしょう。私はそこまで行かないと思います。言語統合クエリや、コンパイラがチェックする他のドメイン依存の永続化操作の時代でも、ストアドプロシージャを介して公開された操作のみにデータベースをロックダウンする価値があります。もちろん、そのようなストアドプロシージャは自動化を使用して検証する必要がありますテスト。しかし、このようなテストではありませんユニットテスト。それらは統合です テスト。
この区別に問題がある場合、それは通常、完全な「コードカバレッジ」、つまり「ユニットテストカバレッジ」に置かれている重要性に基づいています。コードのすべての行が単体テストでカバーされるようにします。その顔には高貴な目標がありますが、私はホグウォッシュと言います。その考え方は、このような実行assertionlessのテストを書く限り、この特定のケースを超えて伸びアンチパターン、に適していますがない運動あなたのコード。これらの種類のエンドランは、カバレッジ数だけのために、最小カバレッジを緩和するよりも有害です。コードベースのすべての行が何らかの自動化されたテストによって実行されることを保証したい場合、それは簡単です。コードカバレッジメトリックを計算するときは、統合テストを含めます。さらに一歩進んで、これらの論争のある「Itino」テスト(「名前の統合のみ」)を分離し、ユニットテストスイートとこのサブカテゴリの統合テスト(まだかなり高速に実行されるはずです)を分離することもできますほぼ完全なカバレッジに近い。