Поделиться через


Практическое руководство. Создание условий теста для конструктора модульных тестов базы данных

Этот раздел применим к:

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, а затем нажмите кнопку ОК.

  5. Создайте класс, производный от класса TestCondition.

  6. Подпишите сборку строгим именем. Дополнительные сведения см. в разделе Практическое руководство. Подписание сборки строгим именем.

  7. Построение библиотеки классов.

  8. Перед использованием нового условия теста необходимо скопировать подписанную сборку в папку %Program Files%\Microsoft Visual Studio 10.0\VSTSDB\Extensions\CustomExtensions, где CustomExtensions — это имя папки, которую обычный пользователь или пользователь с правами администратора создал для хранения XML-файлов расширения функций.

  9. Зарегистрируйте условие теста. Дополнительные сведения см. в разделе Практическое руководство. Регистрация и управление расширениями функций.

Пример

В этом примере создается простое условие теста, проверяющее, соответствует ли количество возвращенных в результирующем наборе столбцов ожидаемому значению. Это условие теста можно использовать для проверки соблюдения контракта хранимой процедуры.

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. Пользовательское условие теста обладает дополнительными свойствами, поэтому после регистрации условия пользователи могут настраивать его в окне Свойства.

В этом примере добавляются два свойства. Пользователи пользовательского условия теста могут использовать свойство ResultSet для указания результирующего набора, для которого должно проверяться количество столбцов. Ожидаемое количество столбцов задается с помощью свойства Count.

Для каждого свойства добавляется три атрибута, а именно:

  • имя категории, помогающее упорядочить свойства;

  • отображаемое имя свойства;

  • описание свойства.

Поскольку значение свойства ResultSet должно быть больше единицы, а значение свойства Count должно быть больше нуля, для этих свойств выполняется базовая проверка.

Метод Assert выполняет главную задачу условия теста. Чтобы метод Assert выполнял проверку соответствия ожидаемому условию, его необходимо переопределить. Этот метод имеет два параметра.

  • Первый параметр — это подключение к базе данных, используемое для проверки условия теста.

  • Второй и более важный параметр — результирующий массив, возвращающий один элемент массива для каждого выполненного пакета.

Для каждого скрипта теста поддерживается только один пакет. Поэтому условия теста всегда будут проверять первый элемент массива. Этот элемент массива содержит объект DataSet, который в свою очередь содержит возвращенные результирующие наборы для скрипта теста. В этом примере код удостоверяется, что таблица данных в объекте DataSet содержит соответствующее количество столбцов. Дополнительные сведения см. в разделе DataSet.

Необходимо задать библиотеку классов, содержащую подписываемое условие теста, что можно сделать в свойствах проекта на вкладке Подписи.

См. также

Задачи

Практическое руководство. Регистрация и управление расширениями функций

Пошаговое руководство. Использование пользовательского условия теста для проверки результатов хранимой процедуры

Основные понятия

Определение пользовательских условий для модульных тестов базы данных