C# /F# の自動テスト毎にローカルDBを作成削除して環境依存なテストを減らす
背景
.NETにはH2DBなんてすばらしいソリューションは存在しません。悲しいです。そこでmdfで頑張る方法をなんとか見つけました。もっといい方法あったら教えてください。
概要
自動テスト実行ごとにmdfファイルを生成してそこに接続するようにすることで、SQLServerExpressが入っている環境であれば接続文字列などを気にせずにまた、データの競合を気にせずに自動テストを実行できるようにします。 mdf作成のためにSSEUtil.exeというMSが配布しているexeを使用します。リポジトリに入れるか、実行するマシンには必ずpathが通っているという状況にすればokです。
大まかな手順
以下ではmdfファイルの名前をDataBaseNameとします。好きなものに置き換えてください。
SSEUtil.exeを入手する
SSEUtil.exeからmdfを生成するバッチファイルやUtilityを作成する
SSEUtil.exeからmdfをつくるには"SSEUtil -create DataBaseName.mdf"とします。テストコード内で実行するならUtility的なクラスとかモジュールに定義しましょう。ProcessStartInfoとかですね。このモジュールにテーブル生成やマスタデータ投入の処理も作っておきます。
ビルドツールから実行するならバッチファイルやPowerShellから呼び出せばいいと思います。
アプリケーションに接続文字列を指定する
- アプリケーションからSSEUtil.exeで作成したmdfに接続する際の接続文字列は"Data Source=.\SQLEXPRESS;AttachDbFilename=|DataDirectory|\DataBaseName.mdf;Integrated Security=True;User Instance=True;"です。NUnitやSpecFlowを実行するプロジェクトのApp.configに書いたり、WebアプリケーションならWeb.configに書いたりすると思います。
任意のタイミングでmdfファイルを生成、テーブルを作成、マスタデータを投入する
- テストを実行する前に1回だけ生成するようにしてもいいですし、テストクラス単位で生成するようにしてもいいと思います。基本的にはUtilityなモジュールのmdf生成、テーブル作成、マスタデータ投入などを呼び出します。僕はSpecFlowのフィーチャ単位でBeforeで実行するようにしています。
任意のタイミングでmdfファイル、log.mdfファイルを削除する
- 前回のテスト実行で残っているDataBaseName.mdfおよびDataBaseName_log.mdfを削除します。僕は上の手順にあるmdf生成の直前に行うようにしています。