チュートリアル: カスタム テスト条件を使用してストアド プロシージャの結果を検証する

更新 : 2010 年 12 月

この拡張機能のチュートリアルでは、テスト条件を作成し、データベース単体テストを作成してその動作を検証します。 このプロセスには、テスト条件用のクラス ライブラリ プロジェクトを作成し、その署名と登録を行う処理が含まれます。 既存のテスト条件を更新する場合は、「方法: カスタム テスト条件を以前のリリースからアップグレードする」を参照してください。

このチュートリアルでは、次の作業について説明します。

  1. テスト条件を作成する方法。

  2. 厳密な名前でアセンブリに署名する方法。

  3. 必要な参照をプロジェクトに追加する方法。

  4. 拡張機能をビルドする方法。

  5. 新しい拡張機能を登録する方法。

  6. 新しい拡張機能をテストする方法。

必須コンポーネント

このチュートリアルを完了するには、Visual Studio Premium または Visual Studio Ultimate をインストールする必要があります。

カスタム テスト条件の作成

最初に、クラス ライブラリを作成します。

クラス ライブラリを作成するには

  1. [ファイル] メニューの [新規作成] をポイントし、[プロジェクト] をクリックします。

  2. [新しいプロジェクト] ダイアログ ボックスで、[プロジェクトの種類][Visual C#] をクリックします。

  3. [テンプレート][クラス ライブラリ] を選択します。

  4. [名前] ボックスに「ColumnCountCondition」と入力し、[OK] をクリックします。

次に、プロジェクトに署名します。

プロジェクトに署名するには

  1. [プロジェクト] メニューの [ColumnCountCondition のプロパティ] をクリックします。

  2. [署名] タブの [アセンブリの署名] チェック ボックスをオンにします。

  3. [厳密な名前のキー ファイルを選択してください] ボックスの一覧の [<新規作成...>] をクリックします。

    [厳密な名前キーの作成] ダイアログ ボックスが表示されます。

  4. [キー ファイル] ボックスに「SampleKey」と入力します。

  5. パスワードとパスワードの確認を入力し、[OK] をクリックします。

    ソリューションをビルドすると、このキー ファイルを使ってアセンブリが署名されます。

  6. [ファイル] メニューの [すべてを保存] をクリックします。

  7. [ビルド] メニューの [ソリューションのビルド] をクリックします。

次に、必要な参照をプロジェクトに追加します。

適切な参照をプロジェクトに追加するには

  1. ソリューション エクスプローラーで、ColumnCountCondition プロジェクトを選択します。

  2. [プロジェクト] メニューの [参照の追加] をクリックします。

    [参照の追加] ダイアログ ボックスが表示されます。

  3. [.NET] タブを選択します。

  4. [コンポーネント名] 列で、次のコンポーネントを探します。

    ヒント

    複数のコンポーネントを選択するには、Ctrl キーを押しながらコンポーネントをクリックします。

  5. 必要なすべてのコンポーネントを選択したら、[OK] をクリックします。

    ソリューション エクスプローラーで、選択された参照がプロジェクトの [参照設定] ノードに表示されます。

ResultSetColumnCountCondition クラスの作成

次に、Class1 の名前を ResultSetColumnCountCondition に変更し、TestCondition から派生させます。 ResultSetColumnCountCondition クラスは、ResultSet に返された列数が予期したとおりであることを検証する、簡単なテスト条件です。 このテスト条件を使用して、ストアド プロシージャのコントラクトが正しいことを確認できます。

テスト条件クラスを作成するには

  1. ソリューション エクスプローラーで、Class1.cs を右クリックし、[名前の変更] をクリックして、「ResultSetColumnCountCondition.cs」と入力します。

  2. [はい] をクリックして、Class1 への参照の名前をすべて変更することを確認します。

  3. 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
    
  4. TestCondition からクラスを派生させます。

        public class ResultSetColumnCountCondition : TestCondition
    
  5. DatabaseSchemaProviderCompatibilityAttribute 属性を追加します。 詳細については、「カスタム データ ジェネレーターを使用した特殊なテスト データの生成」を参照してください。

    [DatabaseSchemaProviderCompatibility(typeof(DatabaseSchemaProvider))]
       [DatabaseSchemaProviderCompatibility(null)]
        [DisplayName("ResultSet Column Count")]
        public class ResultSetColumnCountCondition : TestCondition
    

    テスト条件には、次の目的で両方の互換性属性が含まれています。

    • DatabaseSchemaProvider から継承するデータベース スキーマ プロバイダーが存在するときに条件を読み込む。 これにより、データベース単体テスト デザイナーがデータベース スキーマ プロバイダー コンテキストを使用する状況に対処できます。 テスト条件を SQL Server に固有の条件にする場合は、SqlDatabaseSchemaProvider を指定できます。

    • データベース スキーマ プロバイダーが存在しないときにテスト条件を読み込む。 これは、データベース単体テストでデータベース スキーマ プロバイダーを使用しない拡張機能が読み込まれる場合に行われます。

  6. DisplayName 属性を追加します。

        [DatabaseSchemaProviderCompatibility(typeof(DatabaseSchemaProvider))]
            [DatabaseSchemaProviderCompatibility(null)]
        [DisplayName("ResultSet Column Count")]
        public class ResultSetColumnCountCondition : TestCondition
    
  7. メンバー変数を作成します。

        {
            private int _resultSet;
            private int _count;
            private int _batch;
     
    
  8. コンストラクターを作成します。

            public ResultSetColumnCountCondition()
            {
                _resultSet = 1;
                _count = 0;
                _batch = 1;
            }
     
    
  9. 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));
            }
     
    
  10. 次のメソッドを追加して、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);
            }
     
    
  11. CategoryAttributeDisplayNameAttribute、および 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 が含まれます。

アセンブリ情報を収集するには

  1. [表示] メニューの [その他のウィンドウ] をポイントし、[コマンド ウィンドウ] をクリックして、[コマンド] ウィンドウを開きます。

  2. [コマンド] ウィンドウに、次のコードを入力します。 FilePath をコンパイル済みの .dll ファイルのパスとファイル名に置き換えます。 パスとファイル名は引用符で囲みます。

    注意

    既定では、コンパイル済みの .dll ファイルのパスは YourSolutionPath\bin\Debug または YourSolutionPath\bin\Release です。

    ? System.Reflection.Assembly.LoadFrom(@"FilePath").FullName
    
  3. Enter キーを押します。 行は次のようになり、PublicKeyToken に固有の値が表示されます。

    "ColumnCountCondition, Version=1.0.0.0, Culture=neutral, PublicKeyToken=nnnnnnnnnnnnnnnn"
    

    このアセンブリ情報を記録またはコピーして、次の手順で使用します。

次に、前の手順で収集したアセンブリ情報を使用して XML ファイルを作成します。

XML ファイルを作成するには

  1. ソリューション エクスプローラーで、ColumnCountCondition プロジェクトを選択します。

  2. [プロジェクト] メニューの [新しい項目の追加] をクリックします。

  3. [テンプレート] ペインで、[XML ファイル] という項目を見つけて選択します。

  4. [名前] ボックスに「ColumnCountCondition.Extensions.xml」と入力し、[追加] をクリックします。

    ソリューション エクスプローラーで、プロジェクトに ColumnCountCondition.Extensions.xml ファイルが追加されます。

  5. 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>
    
  6. [ファイル] メニューの [保存] をクリックします。

次に、アセンブリ情報と XML ファイルを Extensions ディレクトリにコピーします。 Visual Studio の起動時に、%Program Files%\Microsoft Visual Studio 10.0\VSTSDB\Extensions ディレクトリとそのサブディレクトリ内の拡張機能が識別され、セッションで使用できるように登録されます。

アセンブリ情報と XML ファイルを Extensions ディレクトリにコピーするには

  1. %Program Files%\Microsoft Visual Studio 10.0\VSTSDB\Extensions\ ディレクトリに、CustomConditions という新しい名前のフォルダーを作成します。

  2. 出力ディレクトリ (既定では My Documents\Visual Studio 2010\Projects\CustomConditions\CustomConditions\bin\Debug\) の ColumnCountCondition.dll アセンブリ ファイルを、作成した %Program Files%\Microsoft Visual Studio 10.0\VSTSDB\Extensions\CustomConditions ディレクトリにコピーします。

  3. 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 の新しいセッションを開始し、データベース プロジェクトを作成するには

  1. Visual Studio の別のセッションを開始します。

  2. [ファイル] メニューの [新規作成] をポイントし、[プロジェクト] をクリックします。

  3. [新しいプロジェクト] ダイアログ ボックスの [インストールされたテンプレート] の一覧で、[データベース] ノードを展開し、[SQL Server] をクリックします。

  4. 詳細ペインで、[SQL Server 2008 データベース プロジェクト] を選択します。

  5. [名前] ボックスに「SampleConditionDB」と入力し、[OK] をクリックします。

次に、単体テストを作成します。

新しいテスト クラス内にデータベース単体テストを作成するには

  1. [テスト] メニューの [新しいテスト] をクリックします。

    注意

    ソリューション エクスプローラーで、テスト プロジェクトを右クリックし、[追加] をポイントして、[新しいテスト] をクリックすることもできます。

    [新しいテストの追加] ダイアログ ボックスが表示されます。

  2. [テンプレート] ボックスの一覧の [データベース単体テスト] をクリックします。

  3. [テスト名] に「SampleUnitTest」と入力します。

  4. [テスト プロジェトに追加][新しい Visual C# テスト プロジェクトの作成] をクリックします。

  5. [OK] をクリックします。

    [新しいテスト プロジェクト] ダイアログ ボックスが表示されます。

  6. プロジェクト名として「SampleUnitTest」と入力します。

  7. このテスト プロジェクトでは、データベース接続を使用する構成を行わずに単体テストを作成します。[キャンセル] をクリックします。

    注意

    データベース接続を使用してデータベース単体テストを作成および構成する方法の詳細については、「方法 : 空のデータベース単体テストを作成する」を参照してください。

    データベース単体テスト デザイナーに、空白のテストが表示されます。 テスト プロジェクトには、Visual C# ソース コード ファイルが追加されます。

  8. [作成するにはここをクリックしてください] をクリックして、単体テストの作成を終了します。

最後に、SQL Server プロジェクトで新しい条件が表示されることを確認します。

新しい条件を表示するには

  1. データベース単体テスト デザイナーで、[テスト条件][名前] 列にある inconclusiveCondition1 テストをクリックします。

  2. [テスト条件を削除します] ツール バー ボタンをクリックして、inconclusiveCondition1 テストを削除します。

  3. [テスト条件] ボックスをクリックし、[ResultSet Column Count] を選択します。

  4. [テスト条件を追加します] ツール バー ボタンをクリックして、カスタム テスト条件を追加します。

  5. [プロパティ] ウィンドウで、CountEnabled、および ResultSet の各プロパティを構成します。

    詳細については、「方法 : データベース単体テストにテスト条件を追加する」を参照してください。

参照

処理手順

方法: データベース単体テスト デザイナーのテスト条件を作成する

方法: 拡張機能を登録および管理する

概念

データベース単体テストの作成と定義

その他の技術情報

アセンブリおよびマニフェストへの署名の管理

履歴の変更

日付

履歴

理由

2010 年 12 月

お客様からのフィードバックに基づいて、最終的なコードをわずかに修正 (属性) しました。

カスタマー フィードバック