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

拡張性のある TestCondition クラスを使用すると、新しいテスト条件を作成できます。 たとえば、結果テストの列数または値を検証する新しいテスト条件を作成できます。

次の手順は、データベース単体テスト デザイナに表示されるテスト条件を作成する方法について説明しています。

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

  1. Visual Studio で、クラス ライブラリ プロジェクトを作成します。

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

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

  4. [コンポーネント名] ボックスの一覧の [Microsoft.Data.Schema.UnitTesting] と [Microsoft.Data.Schema] をクリックし、[OK] をクリックします。

  5. TestCondition クラスから独自のクラスを派生させます。

  6. アセンブリに厳密な名前で署名します。 詳細については、「方法 : 厳密な名前でアセンブリに署名する」を参照してください。

  7. クラス ライブラリをビルドします。

  8. 新しいテスト条件を使用する前に、署名したアセンブリを [Program Files]\Microsoft Visual Studio 9.0\VSTSDB\Extensions\CustomExtensions フォルダにコピーする必要があります。ここで、CustomExtensions は、ユーザー自身またはコンピュータ管理者が機能拡張 XML ファイルを格納するために作成したフォルダの名前です。

  9. テスト条件を登録します。 詳細については、「方法 : 機能拡張を登録および管理する」を参照してください。

使用例

この例では、ResultSet に返される列の数が予期したとおりかどうかを確認する簡単なテスト条件を作成します。 この簡単なテスト条件を使用して、ストアド プロシージャのコントラクトが正しいことを確認できます。

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 TeamSystem.Data.Samples.DBUnitTesting
{
    [DatabaseSchemaProviderCompatibility(DspCompatibilityCategory.Any)]
    [DatabaseSchemaProviderCompatibility(DspCompatibilityCategory.None)]
    [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
    }
}

カスタム テスト条件のクラスは、基本 TestCondition クラスを継承します。 カスタム テスト条件のその他のプロパティを使用して、条件の登録後、[プロパティ] ウィンドウで条件を構成できます。

この例では、2 つのプロパティを追加します。 カスタム テスト条件を使用する場合、ResultSet プロパティを使用して、列数を確認する結果セットを指定できます。 その後、Count プロパティを使用して、列数の期待値を指定できます。

各プロパティには、次の 3 つの属性が追加されます。

  • カテゴリ名 (プロパティを整理するのに役立ちます)

  • プロパティの表示名

  • プロパティの説明

プロパティに対していくつかの基本的な検証が実行され、ResultSet プロパティの値が 1 未満でなく、Count プロパティの値が 0 より大きいことを確認します。

Assert メソッドにより、テスト条件の主要なタスクが実行されます。 Assert メソッドをオーバーライドして、予期した条件が満たされることを検証します。 このメソッドは、次の 2 つのパラメータを出力します。

  • 最初のパラメータは、テスト条件の検証に使用されるデータベース接続です。

  • 2 番目のさらに重要なパラメータは、結果配列です。実行されたバッチごとに 1 つの配列要素を返します。

各テスト スクリプトに対してサポートされるのは 1 つのバッチだけです。 したがって、テスト条件によって調査されるのは常に最初の配列要素です。 配列要素には 1 つの DataSet、つまり、テスト スクリプトに対して返された結果セットが含まれます。 この例では、コードを使用して、DataSet 内のデータ テーブルに適切な数の列が含まれることを確認します。 詳細については、「DataSet」を参照してください。

署名されたテスト条件を含むクラス ライブラリを設定する必要があります。この操作は、[署名] タブに表示されるプロジェクトのプロパティで行います。

参照

処理手順

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

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

概念

データベース単体テストのカスタム条件の定義