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

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

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

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

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

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

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

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

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

前提条件

このチュートリアルを完了するには、Visual Studio Team System Database Edition または Visual Studio Team System がインストールされている必要があります。

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

まず、クラス ライブラリを作成します。

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

    [参照の追加] ダイアログ ボックスが開きます。 詳細については、「[参照の追加] ダイアログ ボックス」を参照してください。

  3. [.NET] タブをクリックします。

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

    Dd193287.alert_note(ja-jp,VS.90).gifヒント :

    複数のコンポーネントを選択するには、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 System.Linq;
    using System.Text;
    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;
     
    namespace ColumnCountCondition
    {
        public class ResultSetColumnCountCondition
    
  4. TestCondition からクラスを派生させます。

        public class ResultSetColumnCountCondition : TestCondition
    
  5. DatabaseSchemaProviderCompatibilityAttribute 属性を追加します。 詳細については、「カスタム データ ジェネレータで独自のテスト データを生成する」および「DspCompatibilityCategory」を参照してください。

    [DatabaseSchemaProviderCompatibility(DspCompatibilityCategory.Any)]
        [DatabaseSchemaProviderCompatibility(DspCompatibilityCategory.None)]
        [DisplayName("ResultSet Column Count")]
        public class ResultSetColumnCountCondition : TestCondition
    
  6. DisplayName 属性を追加します。

    [DatabaseSchemaProviderCompatibility(DspCompatibilityCategory.Any)]
        [DatabaseSchemaProviderCompatibility(DspCompatibilityCategory.None)]
        [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 メソッドをオーバーライドします。 このメソッドには、データベースおよび ExecutionResult への接続を表す IDbConnection に対する引数が含まれています。 このメソッドは、DataException を使用してエラー処理を行います。

            //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));
            }
     
    
  10. String をオーバーライドする次のメソッドを追加します。

            //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. 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
        }
    }
    

次に、プロジェクトをビルドします。

プロジェクトをビルドするには

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

次に、バージョン、カルチャ、PublicKeyToken などプロジェクトで生成されたアセンブリ情報を収集します。

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

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

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

    Dd193287.alert_note(ja-jp,VS.90).gifメモ :

    既定では、コンパイル済みの .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 ディレクトリにコピーします。 Database Edition が起動すると、<Microsoft Visual Studio 9.0>\VSTSDB\Extensions ディレクトリとそのサブディレクトリ内の拡張機能が識別され、セッションで使用できるよう登録されます。

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

  1. <Microsoft Visual Studio 9.0>\VSTSDB\Extensions\ ディレクトリに CustomConditions という名前の新しいフォルダを作成します。

  2. ColumnCountCondition.dll アセンブリ ファイルを、My Documents\Visual Studio 2008\Projects\CustomConditions\CustomConditions\bin\Debug\ ディレクトリから、前の手順で作成した <Microsoft Visual Studio 9.0>\VSTSDB\Extensions\CustomConditions ディレクトリにコピーします。

  3. ColumnCountCondition.Extensions.xml ファイルを、My Documents\Visual Studio 2008\Projects\CustomConditions\CustomConditions\ ディレクトリから、前の手順で作成した <Microsoft Visual Studio 9.0>\VSTSDB\Extensions\ CustomConditions ディレクトリにコピーします。

    Dd193287.alert_note(ja-jp,VS.90).gifヒント :

    拡張機能アセンブリは、<Microsoft Visual Studio 9.0>\VSTSDB\Extensions ディレクトリにフォルダを作成して格納することをお勧めします。 これにより、もともと製品に用意されていた拡張機能と、自分の作成した拡張機能を識別できます。 また、フォルダを使用すると、拡張機能を詳細なカテゴリに分類することもできます。

次に、Visual Studio の新しいセッションを開始して、SQL Server プロジェクトを作成します。

新しい Visual Studio のセッションを開始して SQL Server プロジェクトを作成するには

  1. Database Edition の 2 つのセッションを開始します。

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

  3. [新しいプロジェクト] ダイアログ ボックスで、[プロジェクトの種類] の [データベース プロジェクト] をクリックし、[SQL Server 2008] をクリックします。

  4. [テンプレート] の [SQL Server 2008 データベース プロジェクト] を選択します。

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

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

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

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

    Dd193287.alert_note(ja-jp,VS.90).gifメモ :

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

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

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

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

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

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

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

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

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

    Dd193287.alert_note(ja-jp,VS.90).gifメモ :

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

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

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

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

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

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

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

  3. [テスト条件] ドロップダウンをクリックして、[ResultSet の列数] を選択します。

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

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

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

参照

処理手順

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

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

概念

データベース単体テストの作成および定義

その他の技術情報

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