Freigeben über


Gewusst wie: Erstellen von Testbedingungen für den Datenbankkomponententest-Designer

Dieses Thema gilt für folgende Anwendungsbereiche:

Visual Studio Ultimate

Visual Studio Premium

Visual Studio 2010 Professional 

Visual Studio Express

Thema ist vorhanden Thema ist vorhanden Thema ist nicht vorhanden Thema ist nicht vorhanden

Sie können die erweiterbare TestCondition zum Erstellen neuer Testbedingungen verwenden. Beispielsweise können Sie eine neue Testbedingung erstellen, mit der die Anzahl der Spalten oder die Werte in einem Resultset überprüft werden.

Im folgenden Verfahren wird das Erstellen einer Testbedingung erläutert, die im Datenbankkomponententest-Designer angezeigt wird.

So erstellen Sie eine Testbedingung

  1. Erstellen Sie in Visual Studio ein Klassenbibliotheksprojekt.

  2. Klicken Sie im Menü Projekt auf Verweis hinzufügen.

  3. Klicken Sie auf die Registerkarte .NET.

  4. Wählen Sie in der Liste Komponentenname Microsoft.Data.Schema.UnitTesting und Microsoft.Data.Schema aus, und klicken Sie dann auf OK.

  5. Leiten Sie die Klasse von der TestCondition-Klasse ab.

  6. Signieren Sie die Assembly mit einem starkem Namen. Weitere Informationen finden Sie unter Gewusst wie: Signieren einer Assembly mit einem starken Namen.

  7. Erstellen Sie die Klassenbibliothek.

  8. Sie können die neue Testbedingung erst verwenden, wenn Sie die signierte Assembly in das Verzeichnis "%Programme%\Microsoft Visual Studio 10.0\VSTSDB\Extensions\CustomExtensions" kopiert haben, wobei CustomExtensions den Namen des Ordners darstellt, den Sie oder Ihr Computeradministrator für die XML-Dateien der Funktionserweiterung erstellt haben.

  9. Registrieren Sie die Testbedingung. Weitere Informationen finden Sie unter Gewusst wie: Registrieren und Verwalten von Funktionserweiterungen.

Beispiel

In diesem Beispiel erstellen Sie eine einfache Testbedingung, mit der überprüft wird, ob die Anzahl der im Resultset zurückgegebenen Spalten dem erwarteten Wert entspricht. Mit dieser einfachen Testbedingung können Sie sicherstellen, dass der Vertrag für eine gespeicherte Prozedur fehlerfrei ist.

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

Die Klasse für die benutzerdefinierte Testbedingung erbt von der TestCondition-Basisklasse. Aufgrund der zusätzlichen Eigenschaften in der benutzerdefinierten Testbedingung können Benutzer die Bedingung nach erfolgter Registrierung im Eigenschaftenfenster konfigurieren.

In diesem Beispiel fügen Sie zwei Eigenschaften hinzu. Benutzer der benutzerdefinierten Testbedingung können mit der ResultSet-Eigenschaft angeben, für welches Resultset die Spaltenanzahl überprüft werden soll. Anschließend können Benutzer mit der Count-Eigenschaft die erwartete Spaltenanzahl angeben.

Drei Attribute werden für jede Eigenschaft hinzugefügt:

  • Der Kategoriename, der die Organisation der Eigenschaften unterstützt.

  • Der Anzeigename der Eigenschaft.

  • Eine Beschreibung der Eigenschaft.

Es wird eine grundlegende Validierung der Eigenschaften ausgeführt, um sicherzustellen, dass der Wert der ResultSet-Eigenschaft nicht kleiner als 1 und der Wert der Count-Eigenschaft nicht größer als 0 (null) ist.

Die Assert-Methode führt die primäre Aufgabe der Testbedingung aus. Sie überschreiben die Assert-Methode, um zu überprüfen, ob die erwartete Bedingung erfüllt ist. Diese Methode stellt zwei Parameter bereit:

  • Der erste Parameter ist die Datenbankverbindung, die verwendet wird, um die Testbedingung zu überprüfen.

  • Der zweite und wichtigere Parameter ist das Ergebnisarray, das ein einzelnes Arrayelement für jeden ausgeführten Batch zurückgibt.

Für jedes Testskript wird nur ein einzelner Batch unterstützt. Deshalb wird mit den Testbedingungen stets das erste Arrayelement untersucht. Das Arrayelement enthält ein DataSet, das die für das Testskript zurückgegebenen Resultsets enthält. In diesem Beispiel überprüft der Code, ob die Datentabelle im DataSet die entsprechende Anzahl von Spalten enthält. Weitere Informationen finden Sie unter DataSet.

Sie müssen festlegen, dass die Klassenbibliothek, die Ihre Testbedingung enthält, signiert wird. Diese Einstellung können Sie in den Projekteigenschaften auf der Registerkarte Signierung vornehmen.

Siehe auch

Aufgaben

Gewusst wie: Registrieren und Verwalten von Funktionserweiterungen

Exemplarische Vorgehensweise: Verwenden einer benutzerdefinierten Testbedingung zum Überprüfen der Ergebnisse einer gespeicherten Prozedur

Konzepte

Definieren benutzerdefinierter Bedingungen für Datenbankkomponententests