最近、複雑なストアード・プロシージャーおよび関数を維持する必要がある多くの機会がありました。これらはすでに壊れており、通常はかなり微妙な方法で行われます。有効なパラメーターを指定してSPを呼び出すことはほとんどなく、単純に機能しませんでした。
私の解決策は、データベースを必要な初期条件に初期化した後、トランザクション内でストアドプロシージャを実行するフレームワークを進化させ、同じトランザクション内で期待される結果をテストすることでした。トランザクションはテストの最後にロールバックされました。
これは非常にうまくいきました。しかし、データベースとの統合を伴うため、これを「統合テスト」と呼ぶ人もいます。個々のコンポーネントとそれらのコンポーネントの個々のテストケースをテストし、データベースの初期状態を完全に制御したため、これを単体テストと呼びます。
しかし、どこに線を引くべきでしょうか?これは統合テストですか、それとも単体テストですか?この種のテストが悪い考えである実際的な理由はありますか?これが「唯一の」統合テストである場合、これらのストアドプロシージャに対して実際の「単体テスト」を行う方法についての提案はありますか?
更新、3年半後。私の現在のプロジェクトでは、SSDT単体テストの使用を開始しましたが、成功した可能性もありますが、より優れている場合もあります。SQL Server単体テストを使用したデータベースコードの確認を参照してください。これらは通常、SQL Server LocalDBのインスタンスにデータベースプロジェクトを展開するので、これにより、テストに影響を与えるデータベース環境に関する質問がなくなります。事前テスト中に、データベースに必要なデータを入力します。これにより、データベースの内容に関する質問が削除されます。実際、私はこれを行うためにMERGEステートメントを使用して、現在のテストに必要のないすべてのデータがテストの前にデータベースから削除、挿入、または更新されていることを確認しています。彼らには問題があります:
- 彼らは速くない
- テスト条件を再利用することはできません
- 事前テストを再利用することはできません(プロジェクト内のすべてのテストにそれらを共通にしない限り)
- ユーザーインターフェイスを改善できる
上記の問題の理由の1つは、まだそれらについて不満を述べていないことです。興味のある方はこの機能を試してみて、不満を言うことをお勧めします。これが改善の方法です。