チュートリアル : データベース単体テストの作成と実行
このチュートリアルでは、簡単な Transact-SQL (T-SQL) スクリプトをテストするデータベース単体テストを作成します。 データベース単体テストを作成する前に、テストするデータベースのデータベース プロジェクトを用意する必要があります (既存のものを使用するか、新規に作成します)。 また、データベースには、テストで有意義な結果を返すデータが含まれていることが必要です。
このチュートリアルの最初の手順で、データベース プロジェクトを作成し、Northwind データベースのスキーマをインポートします。 プロジェクトの作成後、Orders テーブルの列にデータを生成するためのデータ生成計画を作成します。 次に、テストを含めるためのプロジェクトを作成し、テストを記述します。テストを実行し、スクリプトが期待どおりに動作するかどうかを確認します。
前提条件
このチュートリアルを完了するには、Northwind データベースがインストール済みのデータベース サーバーに接続できる必要があります。
データベース プロジェクトを作成するには
[ファイル] メニューの [新規作成] をポイントし、[プロジェクト] をクリックします。
[新しいプロジェクト] ダイアログ ボックスが表示されます。
[プロジェクトの種類] の [データベース プロジェクト] ノードをクリックします。
[テンプレート] ボックスの一覧の [SQL Server 2000 ウィザード] をクリックします。
[名前] に「TestNorthwind」と入力します。
[ソリューション] の一覧で、[ソリューションの作成] が強調表示されていない場合は、クリックします。
[ソリューションのディレクトリを作成] チェック ボックスがオンでない場合は、オンにします。
[ソース管理に追加] チェック ボックスがまだオフになっていない場合はオフにし、[OK] をクリックします。
新規データベース プロジェクト ウィザードが表示されます。 次に、ウィザードを使用してデータベース プロジェクトを構成し、初期データベース スキーマをインポートします。
プロジェクトを構成し、データセット スキーマをインポートするには
[ようこそ] ページを読んで、[次へ] をクリックします。
Northwind データベースには、1 つのスキーマしか含まれていないので、[オブジェクトの種類別] をクリックします。
重要 : プロジェクトの作成後は、プロジェクトの編成を変更できません。
[次へ] をクリックします。
[データベース オプションの設定] ページの [データベース プロジェクト内で作成するオブジェクトに使用する、既定のスキーマを指定してください] で、既定値 (「dbo」) をそのまま使用します。
[次へ] をクリックします。
メモ : これらのオプションは、プロジェクトの作成後に変更できます。 詳細については、「方法 : データベース プロジェクトのデータベース プロパティを構成する」を参照してください。
[データベース スキーマのインポート] ページの [既存のスキーマのインポート] チェック ボックスをオンにします。
[ソース データベース接続] で、Northwind データベースを持つサーバーおよびデータベースに対応する接続をクリックします。 接続がまだ存在しない場合は、[新しい接続] をクリックして作成します。 接続を指定しない場合、データベース プロジェクトは作成されますが、スキーマはインポートされません。
メモ : データベース プロジェクトにまだデータベース オブジェクトがない場合は、データベース スキーマを後からインポートできます。 詳細については、「方法 : データベース オブジェクトおよび設定をインポートする」を参照してください。
既定のインポート オプションを受け入れ、[次へ] をクリックします。
[ビルドと配置の構成] ページの [ターゲット接続] の [編集] をクリックし、分離開発環境を作成するデータベース サーバーへの接続を指定します。
データベースの新しいローカル インスタンスを作成するには、[接続プロパティ] ダイアログ ボックスの [サーバー名] に「(local)」と入力し、[Windows 認証を使用する] をクリックします。 [OK] をクリックします。
[ターゲット データベース名] がまだ指定されていない場合は、「TestNorthwind」と入力します。
[既定の配置照合順序] の [サーバーの照合順序を使用] をクリックします。
この手順により、ターゲット データベースがデータベース プロジェクト照合順序を使用するようになります。
[データ損失が発生する場合に増分配置をブロック] チェック ボックスをオフにします。
分離開発環境には生成されたテスト データのみが格納されるため、データ損失が生じても問題ありません。
[完了] をクリックして、データベース プロジェクトを作成し、データベースをインポートします。
作成されたプロジェクトを確認するには
ソリューション エクスプローラで TestNorthwind ノードを展開し、スキーマ オブジェクトの子ノードを展開します。
階層内で [スキーマ オブジェクト] ノードの下にあるサブノードを調べます。
ソリューション エクスプローラには、オブジェクトのインポート元のデータベースのスキーマ内にある、オブジェクトを定義するファイルが表示されます。
[表示] メニューの [データベース スキーマ ビュー] をクリックします。
スキーマ ビューで、TestNorthwind ノードを展開します。
階層内で TestNorthwind ノードの下にあるサブノードを調べます。
スキーマ ビューには、ソリューション エクスプローラに表示されるファイルで定義されているオブジェクトが表示されます。
ソリューション エクスプローラで TestNorthwind プロジェクトをクリックします。
[ビルド] メニューの [ソリューションのビルド] をクリックします。
ソリューション エクスプローラで、TestNorthwind プロジェクト ノードを右クリックし、[プロパティ] をクリックします。
[配置] タブをクリックします。
[配置動作] の [配置スクリプト (sql) を作成してデータベースに配置します] をクリックします。
[ファイル] メニューの [すべてを保存] をクリックします。
[ビルド] メニューの [TestNorthwind の配置] をクリックします。
メモ : 各開発者は、データベースの自分のコピーをホストするデータベース サーバーへの接続文字列を指定します。
次に、データ生成計画を指定して、隔離された開発用データベースに現実的なテスト データを設定します。
データ生成計画を作成するには
ソリューション エクスプローラで TestNorthwind ノードを展開し、Data Generation Plans フォルダをクリックします。
[プロジェクト] メニューの [新しい項目の追加] をクリックします。
[新しい項目の追加] ダイアログ ボックスが表示されます。
[カテゴリ] ボックスの一覧で、[データ生成計画] をクリックします。
[テンプレート] ボックスの一覧で、[データ生成計画] をクリックします。
[名前] に「TestNW.dgen」と入力し、[追加] をクリックします。
TestNW という名前のデータ生成計画がデータベース プロジェクトに追加され、エディタで開かれます。 データベース スキーマが、データ生成計画内にインポートされます。
次にこの計画を修正して、より現実的なテスト データを生成します。
Orders テーブルのデータ生成計画を定義するには
データ生成計画の dbo.Orders をクリックします。
データ生成計画ウィンドウの列の詳細ペインに、Orders テーブルの列、列のデータ型、各列に関連付けられた既定のジェネレータ、およびジェネレータの結果が表示されます。
列の詳細ペインの [ShipCity] をクリックし、"ジェネレータ" フィールドを [データ バインド ジェネレータ] に設定します。
この手順は、この列にクエリの結果を代入することを示しています。
[表示] メニューの [プロパティ ウィンドウ] をクリックします。
[プロパティ] ウィンドウで、[ジェネレータ] セクションに移動します。 [接続情報] プロパティで、前の手順でデータベース スキーマをインポートしたデータベースに対応する接続をクリックします。
この手順により、この列用のデータを生成するクエリを実行するために使用するデータベース接続が指定されます。
[プロパティ] ウィンドウの [ジェネレータ] セクションの [クエリ] プロパティで、クエリ文字列を「SELECT * FROM Orders」に設定します。
メモ : シード値は、変更しないでください。 この値は、Northwind データベースから、後でこのチュートリアルで使用する特定のデータを生成するために必要です。
列の詳細ペインの ShipCity の "ジェネレータ出力" フィールドで、[ShipCity] をクリックします。
この手順により、結果セット内の、この列に関連付ける列が選択されます。
データ生成計画を保存します。
次の手順では、このデータを使用するデータベース単体テストを作成します。
データベース単体テストの作成
データベース単体テストを作成するには
Visual Studio で、[テスト] メニューを開き、[新しいテスト] をクリックします。
[新しいテストの追加] ダイアログ ボックスが表示されます。
[データベース単体テスト] をクリックします。
[テスト名] に「SampleUnitTest」と入力します。
[テスト プロジェクトに追加] の下の [新しい Visual C# テスト プロジェクトの作成] をクリックし、[OK] をクリックします。
[新しいテスト プロジェクト] ダイアログ ボックスが表示されます。
新規テスト プロジェクトを既定の名前のままにし、[作成] をクリックします。
新しいテスト プロジェクトが既存の TestNorthwind ソリューションに追加されます。 プロジェクトには、SampleUnitTest.cs という名前のファイルが含まれ、データベース単体テスト用の新しいテスト クラスのコードが含まれます。 テスト クラスの名前は SampleUnitTest で、DatabaseTest1 という名前の新しい単体テスト メソッドが既定で含まれます。 このテスト メソッドの名前をそのままにすることも、わかりやすい名前に変更することもできます。また、絞り込んだテスト結果を返すようにカスタマイズすることもできます。 詳細については、「方法 : 編集するデータベース単体テストを開く」を参照してください。
[プロジェクト 'TestProject' の構成] ダイアログ ボックスが表示されます。
[データベース接続] の下の最初のドロップダウン リストで TestNorthwind データベースをクリックします。 名前が、<Server>TestNorthwind.dbo の形式で表示されます。 この名前が表示されたらクリックし、手順 9. に進んでください。
TestNorthwind データベースが表示されない場合は、[新しい接続] をクリックします。
[接続のプロパティ] ダイアログ ボックスが表示されます。
[接続プロパティ] ダイアログ ボックスで、TestNorthwind データベースが置かれているサーバーの名前を指定し、使用する認証の種類をクリックします。 [データベース名の選択または入力] の下で、「TestNorthwind」と入力して [OK] をクリックし、[接続プロパティ] ダイアログ ボックスを閉じます。
メモ : データベースへの接続を確立すると、[データベース接続] の下の [プロジェクト 'TestProject' の構成] ダイアログ ボックスにデータベース名が表示されます。
[プロジェクト 'TestProject' の構成] ダイアログ ボックスの [セカンダリ データ接続を使用して単体テストを検証] チェック ボックスをオンにします。 手順 6. から手順 8. で指定したものと同じ接続を指定します。
メモ : これで両方の接続文字列に同じ値が割り当てられました。 ほとんどの場合、検証には、実行より高いレベルのアクセス許可を持つ接続文字列を使用します。 詳細については、「接続文字列とアクセス許可の概要」を参照してください。
[単体テストの実行前にテスト データを生成] チェック ボックスをオンにします。
ドロップダウン リストの TestNW データ生成計画をクリックし、[OK] をクリックします。 単体テストの実行時に、このデータ生成計画が TestNorthwind データベースに適用されます。
メモ : このダイアログ ボックスを使用して、スキーマ配置を構成することもできます。 詳細については、「方法 : データベース単体テストの実行を構成する」を参照してください。
[プロジェクト 'TestProject' の構成] ダイアログ ボックスが閉じると、データベース単体テスト デザイナが表示されます。
追加したテスト条件ごとに、ソース コード ファイルに C# コードまたは Visual Basic コードが作成されます。
ソリューション エクスプローラでテスト プロジェクトを右クリックし、[ビルド] をクリックして、ビルドします。
データベース単体テスト デザイナのナビゲーション バーで、[テストの追加] (+) をクリックして、別の単体テストを追加します。
[データベース テストの名前を指定] ダイアログ ボックスが表示されます。
テスト メソッドを既定の名前のままにし、[OK] をクリックします。 これで、別の単体テストが既存のプロジェクトに追加されます。 この単体テストは、前に作成した SampleUnitTest 内の新しいテスト メソッドとして作成されます。
これで、実際のテスト ロジックを作成する準備が整いました。
データベース単体テストを作成するには
データベース単体テスト デザイナのナビゲーション バーで DatabaseTest1 をクリックし、隣のドロップダウン リストに [テスト] が表示されていることを確認します。 これで、DatabaseTest1 単体テストのテスト アクション用のテスト スクリプトを作成できるようになります。
T-SQL エディタで、次の T-SQL ステートメントを追加します。
SELECT * from Orders where ShipCity = 'Seattle'
テスト条件ペインで、種類が [結果不確定] のテスト条件をクリックし、[テスト条件を削除します] (x) をクリックして削除します。
テスト条件ペインのボックスの一覧で、[行数] をクリックし、[テスト条件を追加します] (+) をクリックして行数テスト条件を追加します。
[プロパティ] ウィンドウで、Row Count プロパティを 1 に設定します。
[ファイル] メニューの [すべてを保存] をクリックします。
これで、テストを実行する準備が整いました。
データベース単体テストを実行するには
[テスト] メニューの [ウィンドウ] をポイントし、[テスト ビュー] をクリックします。
[テスト ビュー] ウィンドウにテストが表示されます。 このチュートリアルの前の手順で、DatabaseTest1 という名前のテストを作成し、T-SQL ステートメントとテスト条件を追加しました。 DatabaseTest2 という名前のテストは空です。
[DatabaseTest1] を右クリックし、[選択範囲の実行] をクリックします。
Visual Studio Team System Database Edition は指定した特権コンテキストを使用してデータベースに接続し、データ生成計画を適用します。 次に、Database Edition は、実行コンテキストに切り替えてから、テストで T-SQL スクリプトを実行します。 この後、Database Edition は T-SQL スクリプトの結果を、テスト条件に指定された内容と照合して評価し、合格か不合格かを [テスト結果] ウィンドウに表示します。
[テスト結果] ウィンドウの結果を確認します。
テストに合格するのは、SELECT ステートメントを実行して 1 行が返される場合です。
メモ : データ生成計画中の [Orders][ShipCity] に対するシード値、または生成する行数を変更すると、このテストは不合格になる場合があります。 シード値に "5" を使用して Northwind から 50 行を生成すると、返される結果の 1 つに、ShipCity フィールドの値が "Seattle" のものが含まれることがあります。
次の手順
一般的なプロジェクトでは、追加の単体テストを定義して、重要なデータベース オブジェクトがすべて正常に動作することを確認します。 一連のテストが完了したら、チームで共有できるようにバージョン管理に入れられたテスト結果を調べます。
ベースラインの構築後、データベース オブジェクトの作成や変更を行い、変更内容が既存の動作を妨げていないかを確認する関連テストを作成できます。