チュートリアル: カスタム テスト条件を使用してストアド プロシージャの結果を検証する
更新 : 2010 年 12 月
この拡張機能のチュートリアルでは、テスト条件を作成し、データベース単体テストを作成してその動作を検証します。 このプロセスには、テスト条件用のクラス ライブラリ プロジェクトを作成し、その署名と登録を行う処理が含まれます。 既存のテスト条件を更新する場合は、「方法: カスタム テスト条件を以前のリリースからアップグレードする」を参照してください。
このチュートリアルでは、次の作業について説明します。
テスト条件を作成する方法。
厳密な名前でアセンブリに署名する方法。
必要な参照をプロジェクトに追加する方法。
拡張機能をビルドする方法。
新しい拡張機能を登録する方法。
新しい拡張機能をテストする方法。
必須コンポーネント
このチュートリアルを完了するには、Visual Studio Premium または Visual Studio Ultimate をインストールする必要があります。
カスタム テスト条件の作成
最初に、クラス ライブラリを作成します。
クラス ライブラリを作成するには
[ファイル] メニューの [新規作成] をポイントし、[プロジェクト] をクリックします。
[新しいプロジェクト] ダイアログ ボックスで、[プロジェクトの種類] の [Visual C#] をクリックします。
[テンプレート] の [クラス ライブラリ] を選択します。
[名前] ボックスに「ColumnCountCondition」と入力し、[OK] をクリックします。
次に、プロジェクトに署名します。
プロジェクトに署名するには
[プロジェクト] メニューの [ColumnCountCondition のプロパティ] をクリックします。
[署名] タブの [アセンブリの署名] チェック ボックスをオンにします。
[厳密な名前のキー ファイルを選択してください] ボックスの一覧の [<新規作成...>] をクリックします。
[厳密な名前キーの作成] ダイアログ ボックスが表示されます。
[キー ファイル] ボックスに「SampleKey」と入力します。
パスワードとパスワードの確認を入力し、[OK] をクリックします。
ソリューションをビルドすると、このキー ファイルを使ってアセンブリが署名されます。
[ファイル] メニューの [すべてを保存] をクリックします。
[ビルド] メニューの [ソリューションのビルド] をクリックします。
次に、必要な参照をプロジェクトに追加します。
適切な参照をプロジェクトに追加するには
ソリューション エクスプローラーで、ColumnCountCondition プロジェクトを選択します。
[プロジェクト] メニューの [参照の追加] をクリックします。
[参照の追加] ダイアログ ボックスが表示されます。
[.NET] タブを選択します。
[コンポーネント名] 列で、次のコンポーネントを探します。
ヒント
複数のコンポーネントを選択するには、Ctrl キーを押しながらコンポーネントをクリックします。
必要なすべてのコンポーネントを選択したら、[OK] をクリックします。
ソリューション エクスプローラーで、選択された参照がプロジェクトの [参照設定] ノードに表示されます。
ResultSetColumnCountCondition クラスの作成
次に、Class1 の名前を ResultSetColumnCountCondition に変更し、TestCondition から派生させます。 ResultSetColumnCountCondition クラスは、ResultSet に返された列数が予期したとおりであることを検証する、簡単なテスト条件です。 このテスト条件を使用して、ストアド プロシージャのコントラクトが正しいことを確認できます。
テスト条件クラスを作成するには
ソリューション エクスプローラーで、Class1.cs を右クリックし、[名前の変更] をクリックして、「ResultSetColumnCountCondition.cs」と入力します。
[はい] をクリックして、Class1 への参照の名前をすべて変更することを確認します。
ResultSetColumnCountCondition.cs ファイルを開き、次の using ステートメントをファイルに追加します。
using System; using System.Collections.Generic; using Microsoft.Data.Schema.UnitTesting; using Microsoft.Data.Schema.UnitTesting.Conditions; using Microsoft.Data.Schema.Extensibility; using System.ComponentModel; using System.Data; using System.Data.Common; using Microsoft.Data.Schema; namespace ColumnCountCondition { public class ResultSetColumnCountCondition
TestCondition からクラスを派生させます。
public class ResultSetColumnCountCondition : TestCondition
DatabaseSchemaProviderCompatibilityAttribute 属性を追加します。 詳細については、「カスタム データ ジェネレーターを使用した特殊なテスト データの生成」を参照してください。
[DatabaseSchemaProviderCompatibility(typeof(DatabaseSchemaProvider))] [DatabaseSchemaProviderCompatibility(null)] [DisplayName("ResultSet Column Count")] public class ResultSetColumnCountCondition : TestCondition
テスト条件には、次の目的で両方の互換性属性が含まれています。
DatabaseSchemaProvider から継承するデータベース スキーマ プロバイダーが存在するときに条件を読み込む。 これにより、データベース単体テスト デザイナーがデータベース スキーマ プロバイダー コンテキストを使用する状況に対処できます。 テスト条件を SQL Server に固有の条件にする場合は、SqlDatabaseSchemaProvider を指定できます。
データベース スキーマ プロバイダーが存在しないときにテスト条件を読み込む。 これは、データベース単体テストでデータベース スキーマ プロバイダーを使用しない拡張機能が読み込まれる場合に行われます。
DisplayName 属性を追加します。
[DatabaseSchemaProviderCompatibility(typeof(DatabaseSchemaProvider))] [DatabaseSchemaProviderCompatibility(null)] [DisplayName("ResultSet Column Count")] public class ResultSetColumnCountCondition : TestCondition
メンバー変数を作成します。
{ private int _resultSet; private int _count; private int _batch;
コンストラクターを作成します。
public ResultSetColumnCountCondition() { _resultSet = 1; _count = 0; _batch = 1; }
Assert メソッドをオーバーライドします。 このメソッドには、データベースへの接続を表す IDbConnection の引数と、ExecutionResult の引数が含まれます。 このメソッドは、エラー処理に DataSchemaException を使用します。
//method you need to override //to perform the condition verification public override void Assert(DbConnection validationConnection, ExecutionResult[] results) { //call base for parameter validation base.Assert(validationConnection, results); //verify batch exists if (results.Length < _batch) throw new DataSchemaException(String.Format("Batch {0} does not exist", _batch)); ExecutionResult result = results[_batch - 1]; //verify resultset exists if (result.DataSet.Tables.Count < ResultSet) throw new DataSchemaException(String.Format("ResultSet {0} does not exist", ResultSet)); DataTable table = result.DataSet.Tables[ResultSet - 1]; //actual condition verification //verify resultset column count matches expected if (table.Columns.Count != Count) throw new DataSchemaException(String.Format( "ResultSet {0}: {1} columns did not match the {2} columns expected", ResultSet, table.Columns.Count, Count)); }
次のメソッドを追加して、ToString メソッドをオーバーライドします。
//this method is called to provide the string shown in the //test conditions panel grid describing what the condition tests public override string ToString() { return String.Format( "Condition fails if ResultSet {0} does not contain {1} columns", ResultSet, Count); }
CategoryAttribute、DisplayNameAttribute、および DescriptionAttribute の各属性を使用して、次のテスト条件のプロパティを追加します。
//below are the test condition properties //that are exposed to the user in the property browser #region Properties //property specifying the resultset for which //you want to check the column count [Category("Test Condition")] [DisplayName("ResultSet")] [Description("ResultSet Number")] public int ResultSet { get { return _resultSet; } set { //basic validation if (value < 1) throw new ArgumentException("ResultSet cannot be less than 1"); _resultSet = value; } } //property specifying //expected column count [Category("Test Condition")] [DisplayName("Count")] [Description("Column Count")] public int Count { get { return _count; } set { //basic validation if (value < 0) throw new ArgumentException("Count cannot be less than 0"); _count = value; } } #endregion } }
最終的なコードは次のようになります。
using System;
using System.Collections.Generic;
using Microsoft.Data.Schema.UnitTesting;
using Microsoft.Data.Schema.UnitTesting.Conditions;
using Microsoft.Data.Schema.Extensibility;
using System.ComponentModel;
using System.Data;
using System.Data.Common;
using Microsoft.Data.Schema;
namespace ColumnCountCondition
{
DatabaseSchemaProviderCompatibility(typeof(DatabaseSchemaProvider))]
[DatabaseSchemaProviderCompatibility(null)]
[DisplayName("ResultSet Column Count")]
public class ResultSetColumnCountCondition : TestCondition
{
private int _resultSet;
private int _count;
private int _batch;
public ResultSetColumnCountCondition()
{
_resultSet = 1;
_count = 0;
_batch = 1;
}
//method you need to override
//to perform the condition verification
public override void Assert(DbConnection validationConnection, ExecutionResult[] results)
{
//call base for parameter validation
base.Assert(validationConnection, results);
//verify batch exists
if (results.Length < _batch)
throw new DataException(String.Format("Batch {0} does not exist", _batch));
ExecutionResult result = results[_batch - 1];
//verify resultset exists
if (result.DataSet.Tables.Count < ResultSet)
throw new DataException(String.Format("ResultSet {0} does not exist", ResultSet));
DataTable table = result.DataSet.Tables[ResultSet - 1];
//actual condition verification
//verify resultset column count matches expected
if (table.Columns.Count != Count)
throw new DataException(String.Format(
"ResultSet {0}: {1} columns did not match the {2} columns expected",
ResultSet, table.Columns.Count, Count));
}
//this method is called to provide the string shown in the
//test conditions panel grid describing what the condition tests
public override string ToString()
{
return String.Format(
"Condition fails if ResultSet {0} does not contain {1} columns",
ResultSet, Count);
}
//below are the test condition properties
//that are exposed to the user in the property browser
#region Properties
//property specifying the resultset for which
//you want to check the column count
[Category("Test Condition")]
[DisplayName("ResultSet")]
[Description("ResultSet Number")]
public int ResultSet
{
get { return _resultSet; }
set
{
//basic validation
if (value < 1)
throw new ArgumentException("ResultSet cannot be less than 1");
_resultSet = value;
}
}
//property specifying
//expected column count
[Category("Test Condition")]
[DisplayName("Count")]
[Description("Column Count")]
public int Count
{
get { return _count; }
set
{
//basic validation
if (value < 0)
throw new ArgumentException("Count cannot be less than 0");
_count = value;
}
}
#endregion
}
}
次に、プロジェクトをビルドします。
プロジェクトをビルドするには
- [ビルド] メニューの [ソリューションのビルド] をクリックします。
次に、プロジェクトで生成されたアセンブリ情報を収集します。この情報には、バージョン、カルチャ、および PublicKeyToken が含まれます。
アセンブリ情報を収集するには
[表示] メニューの [その他のウィンドウ] をポイントし、[コマンド ウィンドウ] をクリックして、[コマンド] ウィンドウを開きます。
[コマンド] ウィンドウに、次のコードを入力します。 FilePath をコンパイル済みの .dll ファイルのパスとファイル名に置き換えます。 パスとファイル名は引用符で囲みます。
注意
既定では、コンパイル済みの .dll ファイルのパスは YourSolutionPath\bin\Debug または YourSolutionPath\bin\Release です。
? System.Reflection.Assembly.LoadFrom(@"FilePath").FullName
Enter キーを押します。 行は次のようになり、PublicKeyToken に固有の値が表示されます。
"ColumnCountCondition, Version=1.0.0.0, Culture=neutral, PublicKeyToken=nnnnnnnnnnnnnnnn"
このアセンブリ情報を記録またはコピーして、次の手順で使用します。
次に、前の手順で収集したアセンブリ情報を使用して XML ファイルを作成します。
XML ファイルを作成するには
ソリューション エクスプローラーで、ColumnCountCondition プロジェクトを選択します。
[プロジェクト] メニューの [新しい項目の追加] をクリックします。
[テンプレート] ペインで、[XML ファイル] という項目を見つけて選択します。
[名前] ボックスに「ColumnCountCondition.Extensions.xml」と入力し、[追加] をクリックします。
ソリューション エクスプローラーで、プロジェクトに ColumnCountCondition.Extensions.xml ファイルが追加されます。
ColumnCountCondition.Extensions.xml ファイルを開き、次の XML に一致するように更新します。 バージョン、カルチャ、および PublicKeyToken は、前の手順で取得した値に置き換えます。
<?xml version="1.0" encoding="utf-8"?> <extensions assembly="" version="1" xmlns="urn:Microsoft.Data.Schema.Extensions" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="urn:Microsoft.Data.Schema.Extensions Microsoft.Data.Schema.Extensions.xsd"> <extension type="ColumnCountCondition.ResultSetColumnCountCondition" assembly="ColumnCountCondition, Version=1.0.0.0, Culture=neutral, PublicKeyToken=nnnnnnnnnnnnnnnn" enabled="true"/> </extensions>
[ファイル] メニューの [保存] をクリックします。
次に、アセンブリ情報と XML ファイルを Extensions ディレクトリにコピーします。 Visual Studio の起動時に、%Program Files%\Microsoft Visual Studio 10.0\VSTSDB\Extensions ディレクトリとそのサブディレクトリ内の拡張機能が識別され、セッションで使用できるように登録されます。
アセンブリ情報と XML ファイルを Extensions ディレクトリにコピーするには
%Program Files%\Microsoft Visual Studio 10.0\VSTSDB\Extensions\ ディレクトリに、CustomConditions という新しい名前のフォルダーを作成します。
出力ディレクトリ (既定では My Documents\Visual Studio 2010\Projects\CustomConditions\CustomConditions\bin\Debug\) の ColumnCountCondition.dll アセンブリ ファイルを、作成した %Program Files%\Microsoft Visual Studio 10.0\VSTSDB\Extensions\CustomConditions ディレクトリにコピーします。
ColumnCountCondition.Extensions.xml ファイル (既定では My Documents\Visual Studio 2010\Projects\CustomConditions\CustomConditions\ ディレクトリ内) を、作成した %Program Files%\Microsoft Visual Studio 10.0\VSTSDB\Extensions\ CustomConditions ディレクトリにコピーします。
ヒント
拡張機能のアセンブリは、%Program Files%\Microsoft Visual Studio 10.0\VSTSDB\Extensions ディレクトリ内のフォルダーに配置することをお勧めします。 これにより、製品に付属していた拡張機能と、カスタマイズして作成した拡張機能を識別しやすくなります。 フォルダーの使用は、拡張機能をカテゴリ別に整理するためにも推奨されます。
次に、Visual Studio の新しいセッションを開始し、データベース プロジェクトを作成します。
Visual Studio の新しいセッションを開始し、データベース プロジェクトを作成するには
Visual Studio の別のセッションを開始します。
[ファイル] メニューの [新規作成] をポイントし、[プロジェクト] をクリックします。
[新しいプロジェクト] ダイアログ ボックスの [インストールされたテンプレート] の一覧で、[データベース] ノードを展開し、[SQL Server] をクリックします。
詳細ペインで、[SQL Server 2008 データベース プロジェクト] を選択します。
[名前] ボックスに「SampleConditionDB」と入力し、[OK] をクリックします。
次に、単体テストを作成します。
新しいテスト クラス内にデータベース単体テストを作成するには
[テスト] メニューの [新しいテスト] をクリックします。
注意
ソリューション エクスプローラーで、テスト プロジェクトを右クリックし、[追加] をポイントして、[新しいテスト] をクリックすることもできます。
[新しいテストの追加] ダイアログ ボックスが表示されます。
[テンプレート] ボックスの一覧の [データベース単体テスト] をクリックします。
[テスト名] に「SampleUnitTest」と入力します。
[テスト プロジェトに追加] の [新しい Visual C# テスト プロジェクトの作成] をクリックします。
[OK] をクリックします。
[新しいテスト プロジェクト] ダイアログ ボックスが表示されます。
プロジェクト名として「SampleUnitTest」と入力します。
このテスト プロジェクトでは、データベース接続を使用する構成を行わずに単体テストを作成します。[キャンセル] をクリックします。
注意
データベース接続を使用してデータベース単体テストを作成および構成する方法の詳細については、「方法 : 空のデータベース単体テストを作成する」を参照してください。
データベース単体テスト デザイナーに、空白のテストが表示されます。 テスト プロジェクトには、Visual C# ソース コード ファイルが追加されます。
[作成するにはここをクリックしてください] をクリックして、単体テストの作成を終了します。
最後に、SQL Server プロジェクトで新しい条件が表示されることを確認します。
新しい条件を表示するには
データベース単体テスト デザイナーで、[テスト条件] の [名前] 列にある inconclusiveCondition1 テストをクリックします。
[テスト条件を削除します] ツール バー ボタンをクリックして、inconclusiveCondition1 テストを削除します。
[テスト条件] ボックスをクリックし、[ResultSet Column Count] を選択します。
[テスト条件を追加します] ツール バー ボタンをクリックして、カスタム テスト条件を追加します。
[プロパティ] ウィンドウで、Count、Enabled、および ResultSet の各プロパティを構成します。
詳細については、「方法 : データベース単体テストにテスト条件を追加する」を参照してください。
参照
処理手順
方法: データベース単体テスト デザイナーのテスト条件を作成する
概念
その他の技術情報
履歴の変更
日付 |
履歴 |
理由 |
---|---|---|
2010 年 12 月 |
お客様からのフィードバックに基づいて、最終的なコードをわずかに修正 (属性) しました。 |
カスタマー フィードバック |