web-dev-qa-db-ja.com

単体テスト中にデータベースを作成して削除してもよいですか

EntityFramework 6コードファーストアプローチとSQL Server 2014 Expressを使用しています。ただし、DBMSは将来変更される可能性があります。

この設定により、データベースを簡単に作成し、単体テスト用のダミーデータを追加できます。現在、単体テストごとに1つのデータベースを作成しており、単体テストの終了後にそれを削除しています。

データベースの作成/削除がファイルの作成/削除のような軽い操作であるかどうかはわかりません...それで、そのアプローチには欠点がありますか?

1
JanDotNet

最初に注意する点は、テストの一部としてDBを作成および削除する場合、それらは単体テストではないということです。それらは統合テストとしてよりよく説明されています。

重大な問題はさておき、重要な問題は、各テストで異なるDBが作成されるので、テストを並行して実行できるかどうかです。または、同時に実行されている2つのテストが互いに干渉する可能性があります(たとえば、一方のDBが他方のテストの途中でドロップされるなど)。

それらを並行して実行できない場合、各テストに独自のセットアップとティアダウンを実行させる時間の投資に対して十分な利益が得られません。これをテストスーツのセットアップとティアダウン機能に移動した場合、テスト間の新しい競合の問題は発生せず、個々のテストの速度が向上します。

それらを並行して実行できる場合、それは選択に帰着します。各テストで独自のDBを作成および破棄することは簡単ですが、速度は遅くなります。したがって、2つの間で選択してください。

7
David Arno

遅くなりますが、これが大きな欠点です。 12のテストがあればそれは問題ではないかもしれませんが、何百ものテストがある場合、それは実際の問題であるかもしれません。

3
JacquesB

データベースの作成/削除がファイルの作成/削除のような軽量な操作かどうかはわかりません...

確かにそうではありません。ファイルの作成/削除(ローカルでもリモートでも)は通常はるか速くなります。

単体テストの実行速度がここでの問題だと思います(そして、それはあなたが心配しないほど十分速いかもしれません)。通常は、テストを繰り返し実行するのに十分な速さで、開発/デプロイメントのボトルネックにならないようにする必要があります。これらのデータベースを十分迅速に方向転換させることができれば、それは問題ではありません。ただし、このようなケースを追加し続ける場合は、スケーラビリティが問題になるので、(たとえば)テストごとにデータベースを初期化することを検討しますsuiteまたは同様。

1
Brian Agnew