うさぎ組

ソフトウェア開発、チームによる製品開発、アジャイル、ソフトウェアテスト

C# /F# の自動テスト毎にローカルDBを作成削除して環境依存なテストを減らす

背景

.NETにはH2DBなんてすばらしいソリューションは存在しません。悲しいです。そこでmdfで頑張る方法をなんとか見つけました。もっといい方法あったら教えてください。

概要

自動テスト実行ごとにmdfファイルを生成してそこに接続するようにすることで、SQLServerExpressが入っている環境であれば接続文字列などを気にせずにまた、データの競合を気にせずに自動テストを実行できるようにします。 mdf作成のためにSSEUtil.exeというMSが配布しているexeを使用します。リポジトリに入れるか、実行するマシンには必ずpathが通っているという状況にすればokです。

大まかな手順

以下ではmdfファイルの名前をDataBaseNameとします。好きなものに置き換えてください。

  1. SSEUtil.exeを入手する

    1. Download SQL Server Express Utility from Official Microsoft Download CenterからSSEUtil.exeをダウンロードして、テストを実行するリポジトリにいれるなりテストを実行するマシンのパスに通すなりしてください。
    2. リポジトリにいれるのが楽ですけど、一番いいのは社内のツールインストールリポジトリにあって、ビルドツールが毎回ダウンロードしてくるとかですかね。
  2. SSEUtil.exeからmdfを生成するバッチファイルやUtilityを作成する

    1. SSEUtil.exeからmdfをつくるには"SSEUtil -create DataBaseName.mdf"とします。テストコード内で実行するならUtility的なクラスとかモジュールに定義しましょう。ProcessStartInfoとかですね。このモジュールにテーブル生成やマスタデータ投入の処理も作っておきます。

    2. ビルドツールから実行するならバッチファイルやPowerShellから呼び出せばいいと思います。

  3. アプリケーションに接続文字列を指定する

    1. アプリケーションからSSEUtil.exeで作成したmdfに接続する際の接続文字列は"Data Source=.\SQLEXPRESS;AttachDbFilename=|DataDirectory|\DataBaseName.mdf;Integrated Security=True;User Instance=True;"です。NUnitやSpecFlowを実行するプロジェクトのApp.configに書いたり、WebアプリケーションならWeb.configに書いたりすると思います。
  4. 任意のタイミングでmdfファイルを生成、テーブルを作成、マスタデータを投入する

    1. テストを実行する前に1回だけ生成するようにしてもいいですし、テストクラス単位で生成するようにしてもいいと思います。基本的にはUtilityなモジュールのmdf生成、テーブル作成、マスタデータ投入などを呼び出します。僕はSpecFlowのフィーチャ単位でBeforeで実行するようにしています。
  5. 任意のタイミングでmdfファイル、log.mdfファイルを削除する

    1. 前回のテスト実行で残っているDataBaseName.mdfおよびDataBaseName_log.mdfを削除します。僕は上の手順にあるmdf生成の直前に行うようにしています。