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

このトピックの内容は、次の製品に該当します。

Visual Studio Ultimate

Visual Studio Premium

Visual Studio 2010 Professional 

Visual Studio Express

トピック該当 トピック該当 トピック該当なし トピック該当なし

拡張可能な 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 10.0\VSTSDB\Extensions\CustomExtensions フォルダーにコピーする必要があります。CustomExtensions は、拡張機能の XML ファイルを格納するためにユーザーまたはコンピューターの管理者が作成したフォルダー名です。

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

使用例

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

using System;
using System.Collections.Generic;
using TestTools = Microsoft.VisualStudio.TestTools.UnitTesting;
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 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 つの DataSet、つまり、テスト スクリプトに対して返された結果セットが含まれます。 この例では、コードを使用して、DataSet 内のデータ テーブルに適切な数の列が含まれることを確認します。 詳細については、「DataSet」を参照してください。

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

参照

処理手順

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

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

概念

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