単体テストが作成できたら、念のためにテストを実行して成功することを確認しておきたいところですが、今回はこのまま実行するとエラーとなります。テストプロジェクトで接続文字列が定義されていないからです。
そこで、テストプロジェクトにアプリケーション構成ファイルを追加し、接続文字列を定義します。ソリューションエクスプローラーでテストプロジェクト(付属サンプルではTestProject1)を選択し、コンテキストメニューから[追加]-[新しい項目]を選択します。表示されたダイアログでは、インストールされたテンプレートから[Visual C# アイテム]を選択し、中央のリストから[アプリケーション構成ファイル]を選択し、[追加]ボタンをクリックします。
アプリケーション構成ファイルの編集画面がVisual Studioの中央に表示されるので、接続文字列をリスト3のように定義してください。
<?xml version="1.0" encoding="utf-8" ?>
<configuration>
<connectionStrings>
<add name="Express"
connectionString="Data Source=.\SQLEXPRESS;AttachDbFilename=|DataDirectory|\pubs.mdf;Integrated Security=True;User Instance=True"
providerName="System.Data.SqlClient" />
</connectionStrings>
</configuration>
接続先となるデータベースを用意します。ソリューションエクスプローラーでテストプロジェクトを選択し、コンテキストメニューから[追加]-[新しいフォルダー]を選択します。テストプロジェクト上にフォルダが1つ作成されるので、名前を「DB」としておきます。フォルダが作成できたら、テストを始める前に準備しておいたサンプルデータベースのフォルダから「PUBS.MDF」および「PUBS_LOG.LDF」ファイルをコピーし、今作成した「DB」フォルダに貼り付けます。この一連の作業後、テストプロジェクトは図1のようになっています。
最後に、テストの設定ファイルを編集します。ソリューションエクスプローラーで「Solution Items」フォルダにある「Local.testsettings」ファイルをダブルクリックして開きます。左側の項目から[配置]を選択し、右側にある[配置を有効にする]にチェックを入れてください。次に[ディレクトリの追加]で[TestProject1\DB]を選択します。パスを正しく選択できれば、図2のように項目が追加されています。
図2の状態から右下の[適用]ボタンをクリックし、[閉じる]ボタンで設定完了です。リスト2で作成したInsertAuthorsTestを実行して、テストが成功することを確認してください。
補足や注意事項
SQL Server Express Editionを利用して、データベース操作を伴うテストを実行するところまでを見てきましたが、何点か補足と注意事項を確認しておきましょう。
リスト2のテストを何回か実行してみてください。何度実行してもテスト結果は成功となります。テスト対象メソッドがデータの追加を行っているauthorsテーブルは、pub_id列が主キーに設定されており、InsertAurhorsメソッドが固定されたpub_idの値を何回も挿入しているのに、何度テストを行っても成功するという事態になっています。これは決しておかしいわけではありません。SQL Server Express Editionに用意されたファイルアタッチデータベースとユーザーインスタンスという機能を利用してテストを行っているため、このような動作が可能となっています。
リスト3で定義した接続文字列をよく見てみると確認できます。通常、SQL Serverへの接続では、接続先サーバ名の設定(Data Source)、接続先データベース名の設定(Initial Catalog)、ユーザー資格情報の設定(Integrated Security)を行って接続しますが、リスト3ではInitial Catalogの定義がありません。代わりにAttachDbFilenameというものが使われています。これがファイルアタッチデータベース機能を利用する際の設定で、アタッチしたいデータベースファイル(mdfファイル)へのパスを記述します。パス文字列の中身を見ると「|DataDirectory|」という特殊な形式がありますが、これはVisual Studioに用意されたパス解決機能で、アプリケーションやテストの実行時に実行ディレクトリに置き換わるようになっています。今回の場合はテストを行うディレクトリに置き換わるようになります。また、接続文字列の末尾にUser InstanceをTrueで定義し、ユーザーインスタンス機能を利用するように設定しています。
さらに、配置の設定を行ったことで、テストプロジェクト内に格納した「PUBS.MDF」および「PUBS_LOG.LDF」ファイルがテストのたびにテストを行うディレクトリにコピーされます。これら一連の設定の組み合わせにより、テストのたびに新しいpubsデータベースを利用してテストを行うことができるため、リスト2のテストを何回実行しても問題なくテストが実行できるようになっています。
今回のテストの肝となるファイルアタッチデータベース機能自体は、SQL Server Express Edition以外にも用意されていますが、ユーザーインスタンスはExpress Editionのみの機能です。テストを繰り返し実行するには両方の機能が必要なため、残念ながらSQL Server Express Edition以外を利用して同様の設定を行ってもうまく動作させることができません。
Oracle Databaseなどを含め他のデータベースを利用して同様のテストを実行したい場合には、『Visual Studio単体テストの前準備と後始末』(CodeZine)で紹介したテスト前バッチ、テスト後バッチを利用する方法を使い、データベースの初期化、後片付けを行うスクリプトを動作させてください。

