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


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

В этом пошаговом руководстве, посвященном расширениям функций, описан процесс создания условия теста, функциональность которого будет проверена путем создания модульного теста базы данных. Процесс включает в себя создание проекта библиотеки классов для условия теста, подписывание и регистрацию. Если требуется обновить существующее условие теста, инструкции о том, как это сделать, см. в разделе Практическое руководство. Обновление пользовательского условия теста из предыдущего выпуска.

В данном пошаговом руководстве рассмотрены следующие задачи:

  1. создание условия теста;

  2. подписывание сборки строгим именем;

  3. добавление необходимых ссылок в проект;

  4. построение расширения функции;

  5. регистрация нового расширения функции;

  6. проверка нового расширения функции.

Обязательные компоненты

Для выполнения инструкций данного пошагового руководства потребуется установить Visual Studio Premium или Visual Studio Ultimate.

Создание пользовательского условия теста

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

Создание библиотеки классов

  1. В меню Файл последовательно выберите пункты Создать и Проект.

  2. В диалоговом окне Новый проект в области Типы проектов выберите Visual C#.

  3. В списке Шаблоны выберите Библиотека классов.

  4. В текстовом поле Имя введите ColumnCountCondition и нажмите кнопку ОК.

Следующий шаг — подписывание проекта.

Подписывание проекта

  1. В меню Проект выберите пункт Свойства ColumnCountCondition.

  2. На вкладке Подписи установите флажок Подписать сборку.

  3. В области Выберите файл ключей строгого имени щелкните <Создать...>.

    Появится диалоговое окно Создание ключа строгого имени.

  4. В поле Имя файла ключей введите SampleKey.

  5. Введите и подтвердите пароль, после чего нажмите кнопку ОК.

    При построении решения этот файл ключей будет использоваться для подписания сборки.

  6. В меню Файл выберите команду Сохранить все.

  7. В меню Построение выберите команду Построить решение.

Следующий шаг — добавление необходимых ссылок в проект.

Добавление ссылок в проект

  1. В обозревателе решений выберите проект ColumnCountCondition.

  2. В меню Проект щелкните команду Добавить ссылку.

    Откроется диалоговое окно Добавить ссылку.

  3. Выберите вкладку .NET.

  4. В столбце Имя компонента найдите расположение следующих компонентов:

    Совет

    Для выбора нескольких компонентов при нажатии кнопки мыши удерживайте клавишу CTRL.

  5. Нажмите кнопку OK, после того как выберите все нужные компоненты.

    Выбранные ссылки будут отображаться в окне обозревателя решений в узле Ссылки.

Создание класса ResultSetColumnCountCondition

Далее необходимо переименовать класс Class1 в ResultSetColumnCountCondition и сделать его производным от класса TestCondition. Класс ResultSetColumnCountCondition — это простое условие теста, проверяющее, соответствует ли количество возвращенных в результирующем наборе столбцов ожидаемому значению. Это условие теста можно использовать для проверки правильности контракта хранимой процедуры.

Создание класса условия теста

  1. В обозревателе решений щелкните правой кнопкой мыши Class1.cs, выберите команду Переименовать и введите ResultSetColumnCountCondition.cs.

  2. Чтобы подтвердить переименование всех ссылок на Class1, нажмите кнопку Да.

  3. Откройте файл ResultSetColumnCountCondition.cs и добавьте в файл следующие операторы using:

    using System;
    using System.Collections.Generic;
    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 ColumnCountCondition
    {
        public class ResultSetColumnCountCondition
    
  4. Сделайте класс производным от класса TestCondition:

        public class ResultSetColumnCountCondition : TestCondition
    
  5. Добавьте атрибут DatabaseSchemaProviderCompatibilityAttribute. Дополнительные сведения см. в разделе Создание специализированных тестовых данных с помощью пользовательского генератора данных.

    [DatabaseSchemaProviderCompatibility(typeof(DatabaseSchemaProvider))]
       [DatabaseSchemaProviderCompatibility(null)]
        [DisplayName("ResultSet Column Count")]
        public class ResultSetColumnCountCondition : TestCondition
    

    Условие теста имеет оба атрибута совместимости, что приводит к следующему.

    • Условие загружается, когда представлен любой поставщик схемы базы данных, который наследует от DatabaseSchemaProvider. Это помогает в ситуации, когда конструктор модульного теста базы данных имеет контекст поставщика схемы базы данных. Чтобы условия теста были определены по отношению к SQL Server, взамен нужно определить SqlDatabaseSchemaProvider.

    • Условие теста загружается при отсутствии поставщика схемы базы данных. Это проявляется, когда модульное тестирование базы данных загружает расширения при отсутствии поставщика схемы базы данных.

  6. Добавление атрибута DisplayName:

        [DatabaseSchemaProviderCompatibility(typeof(DatabaseSchemaProvider))]
            [DatabaseSchemaProviderCompatibility(null)]
        [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. Метод включает аргументы для класса IDbConnection, который служит для представления подключения к базе данных, и класса ExecutionResult. Для обработки ошибок метод использует класс DataSchemaException.

            //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 DataSchemaException(String.Format("Batch {0} does not exist", _batch));
     
                ExecutionResult result = results[_batch - 1];
     
                //verify resultset exists
                if (result.DataSet.Tables.Count < ResultSet)
                    throw new DataSchemaException(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 DataSchemaException(String.Format(
                        "ResultSet {0}: {1} columns did not match the {2} columns expected",
                        ResultSet, table.Columns.Count, Count));
            }
     
    
  10. Добавление следующего метода, который переопределяет метод ToString:

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

Окончательный код должен выглядеть следующим образом:

using System;
using System.Collections.Generic;
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 ColumnCountCondition
{
DatabaseSchemaProviderCompatibility(typeof(DatabaseSchemaProvider))]
        [DatabaseSchemaProviderCompatibility(null)]

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

Следующий шаг — построение проекта.

Построение проекта

  • В меню Построение выберите Построить решение.

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

Сбор сведений о сборке

  1. В меню Вид выберите пункт Другие окна, а затем — Окно команд, чтобы открыть командное окно.

  2. В окне Команда введите следующий код. Вместо FilePath подставьте путь и имя откомпилированного DLL-файла. Заключите путь и имя файла в кавычки.

    Примечание

    По умолчанию путь к откомпилированному DLL-файлу таков: путьКРешению\bin\Debug или путьКРешению\bin\Release.

    ? System.Reflection.Assembly.LoadFrom(@"FilePath").FullName
    
  3. Нажмите клавишу ВВОД. Строка должна иметь следующий вид (с учетом конкретного значения 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. Visual Studio при запуске идентифицирует все расширения в каталоге %Program Files%\Microsoft Visual Studio 10.0\VSTSDB\Extensions и вложенных каталогах, чтобы зарегистрировать их для использования в сеансе.

Копирование сведений о сборке и XML-файла в каталог Extensions

  1. В каталоге %Program Files%\Microsoft Visual Studio 10.0\VSTSDB\Extensions\ создайте папку с именем CustomConditions.

  2. Скопируйте файл сборки ColumnCountCondition.dll из выходного каталога по умолчанию My Documents\Visual Studio 2010\Projects\CustomConditions\CustomConditions\bin\Debug\) в созданный каталог %Program Files%\Microsoft Visual Studio 10.0\VSTSDB\Extensions\CustomConditions.

  3. Скопируйте файл сборки ColumnCountCondition.Extensions.xml (по умолчанию находящийся в My Documents\Visual Studio 2010\Projects\CustomConditions\CustomConditions\ directory) в созданный каталог %Program Files%\Microsoft Visual Studio 10.0\VSTSDB\Extensions\ CustomConditions.

    Совет

    Рекомендуется помещать сборки расширений в папку каталога %Program Files%\Microsoft Visual Studio 10.0\VSTSDB\Extensions.Это облегчит определение того, какие расширения изначально входили в продукт, а какие были созданы пользователем.Кроме того, с помощью папок можно группировать расширения по категориям.

Следующий шаг — запуск нового сеанса Visual Studio и создание проекта базы данных.

Запуск нового сеанса Visual Studio и создание проекта базы данных

  1. Запустите второй сеанс Visual Studio.

  2. В меню Файл последовательно выберите пункты Создать и Проект.

  3. В диалоговом окне Новый проект, в списке Установленные шаблоны разверните узел База данных и щелкните элемент SQL Server.

  4. В области сведений щелкните Проект базы данных SQL Server 2008.

  5. В текстовом поле Имя введите SampleConditionDB и нажмите кнопку ОК.

Следующий шаг — создание модульного теста.

Создание нового модульного теста базы данных в новом тестовом классе

  1. В меню Тест выберите команду Новый тест.

    Примечание

    Можно также открыть обозреватель решений, щелкнуть правой кнопкой мыши тестовый проект, выбрать команду Добавить, а затем — Новый тест.

    Откроется диалоговое окно Добавить новый тест.

  2. В списке Шаблоны щелкните Модульный тест базы данных.

  3. В Имя теста введите SampleUnitTest.

  4. В Добавить в тестовый проект щелкните Создать новый тестовый проект Visual C#.

  5. Нажмите кнопку ОК.

    Откроется диалоговое окно Новый тестовый проект.

  6. В качестве имени проекта укажите SampleUnitTest.

  7. Чтобы создать модульный тест без настройки использования подключения к базе данных в тестовом проекте, нажмите кнопку Отмена.

    Примечание

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

    Пустой тест появится в конструкторе модульных тестов базы данных. Файл исходного кода на языке Visual C# будет добавлен в тестовый проект.

  8. Чтобы завершить создание модульного теста, щелкните ссылку Щелкните здесь, чтобы создать.

После завершения процедуры новое условие отобразится в проекте SQL Server.

Просмотр нового условия

  1. В конструкторе модульных тестов базы данных в области Условия тестирования щелкните тест inconclusiveCondition1 в столбце Имя.

  2. Чтобы удалить тест inconclusiveCondition1, нажмите кнопку Удалить условие теста панели инструментов.

  3. В раскрывающемся списке Условия тестирования выберите ResultSet Column Count.

  4. Чтобы добавить пользовательское условие теста, нажмите кнопку Добавить условие теста панели инструментов.

  5. В окне Свойства настройте свойства Count, Enabled и ResultSet.

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

См. также

Задачи

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

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

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

Создание и определение модульных тестов базы данных

Другие ресурсы

Управление сборками и подписывание манифестов

Журнал изменений

Дата

Журнал

Причина

Декабрь 2010

В ответ на отзывы пользователей внесены небольшие исправления (атрибуты) в конечный код.

Обратная связь от клиента.