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

 

В этом пошаговом руководстве по расширению компонента вы создадите условие теста и проверите его работоспособность, создав модульный тест SQL Server.Частью этого процесса является создание проекта библиотеки классов для условия теста, а также его подписание и установка.Если у вас уже есть условие теста, которое требуется обновить, то см. раздел Практическое руководство. Обновление нестандартного условия теста Visual Studio 2010 с предыдущего выпуска до SQL Server Data Tools.

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

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

  • Подписание сборки строгим именем.

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

  • Построение условия теста.

  • Установка нового условия теста.

  • Проверка нового условия теста.

Для выполнения этого пошагового руководства требуется Visual Studio 2010 или Visual Studio 2012 с последней версией SQL Server Data Tools.Дополнительные сведения см. в разделе Установка базовой версии SQL Server Data Tools.

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

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

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

  2. В диалоговом окне Создание проекта в разделе Типы проектов щелкните Visual C#.

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

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

Затем подпишите проект.

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

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

  3. В поле выбора файла ключа строгого имени щелкните <New...>.

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

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

  5. Введите и подтвердите пароль, затем нажмите кнопку ОК.При построении решения файл ключа используется для подписания сборки.

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

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

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

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

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

  3. Перейдите на вкладку .NET.

  4. В столбце Имя компонента найдите и выберите компонент System.ComponentModel.Composition.Выбрав этот компонент, нажмите кнопку ОК.

  5. Добавьте необходимые ссылки на сборки.Щелкните правой кнопкой мыши узел проекта и выберите пункт Добавить ссылку.Нажмите кнопку Обзор и перейдите к папке C:\Program Files (x86)\MicrosoftSQL Server\110\DAC\Bin.Выберите Microsoft.Data.Tools.Schema.Sql.dll и нажмите «Добавить», а затем нажмите кнопку ОК.

  6. В меню Проект выберите пункт Передать проект.

  7. Щелкните проект правой кнопкой мыши в обозревателе решений и выберите Изменить <имя проекта>.csproj.

  8. После импорта Microsoft.CSharp.targets добавьте следующую инструкцию Import:

    <Import Project="$(MSBuildExtensionsPath32)\Microsoft\VisualStudio\v10.0\SSDT\Microsoft.Data.Tools.Schema.Sql.UnitTesting.targets" Condition="'$(VisualStudioVersion)' == ''" />  
    
    <Import Project="$(MSBuildExtensionsPath32)\Microsoft\VisualStudio\v$(VisualStudioVersion)\SSDT\Microsoft.Data.Tools.Schema.Sql.UnitTesting.targets" Condition="'$(VisualStudioVersion)' != ''" />  
    
  9. Сохраните файл и закройте его.Щелкните проект правой кнопкой мыши в обозревателе решений и выберите Перезагрузить проект.

    Требуемые ссылки будут показаны в узле Ссылки проекта в обозревателе решений.

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

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

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

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

  3. Откройте файл ResultSetColumnCountCondition.cs и добавьте в него следующие инструкции Using.

    using System;  
    using System.ComponentModel;  
    using System.Data;  
    using System.Data.Common;  
    using Microsoft.Data.Tools.Schema.Sql.UnitTesting;  
    using Microsoft.Data.Tools.Schema.Sql.UnitTesting.Conditions;  
    
    namespace ColumnCountCondition {  
        public class ResultSetColumnCountCondition  
    
  4. Сделайте класс производным от класса TestCondition.

    public class ResultSetColumnCountCondition : TestCondition  
    
  5. Добавьте ExportTestConditionAttribute.Дополнительные сведения о Практическое руководство. Создание условия теста для конструктора модульных тестов SQL Server см. в разделе ExportTestConditionAttribute.

    [ExportTestCondition("ResultSet Column Count", typeof(ResultSetColumnCountCondition))]  
        public class ResultSetColumnCountCondition : TestCondition  
    
  6. Создайте переменные и конструктор.

            private int _resultSet;  
            private int _count;  
            private int _batch;  
    
            public ResultSetColumnCountCondition() {  
                _resultSet = 1;  
                _count = 0;  
                _batch = 1;  
            }  
    
  7. Переопределите метод Assert.Метод имеет аргументы для IDbConnection, представляющего подключение к базе данных, и SqlExecutionResult.Для обработки ошибок метод использует DataSchemaException.

           //method you need to override  
            //to perform the condition verification  
            public override void Assert(DbConnection validationConnection, SqlExecutionResult[] 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));  
    
                SqlExecutionResult 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));  
            }  
    
    Add the following method, which overrides the ToString method:  
    C#  
            //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);  
            }  
    
  8. С помощью атрибутов 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.ComponentModel;  
using System.Data;  
using System.Data.Common;  
using Microsoft.Data.Tools.Schema.Sql.UnitTesting;  
using Microsoft.Data.Tools.Schema.Sql.UnitTesting.Conditions;  
  
namespace ColumnCountCondition  
{  
  
    [ExportTestCondition("ResultSet Column Count", typeof(ResultSetColumnCountCondition))]  
    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, SqlExecutionResult[] 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));  
  
            SqlExecutionResult 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  
    }  
}  
  

Теперь выполним построение проекта.

Компиляция проекта и установка условия теста

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

Затем необходимо будет скопировать данные сборки в каталог Extensions.При запуске Visual Studio программа определяет расширения в папке %Program Files%\Microsoft Visual Studio <версия>\Common7\IDE\Extensions\Microsoft\SQLDB\TestConditions и вложенных в нее папках и предоставляет доступ к ним.

Скопируйте файл сборки ColumnCountCondition.dll из выходного каталога в каталог %Program Files%\Microsoft Visual Studio <версия>\Common7\IDE\Extensions\Microsoft\SQLDB\TestConditions.

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

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

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

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

  3. В диалоговом окне Создание проекта в списке установленных шаблонов выберите узел SQL Server.

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

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

Теперь необходимо создать модульный тест.Создание модульного теста SQL Server в новом классе тестов

  1. В меню Тест выберите команду Создать тест, чтобы открыть диалоговое окно Добавление нового теста.

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

  2. В списке шаблонов щелкните Модульный тест SQL Server.

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

  4. В разделе Добавить в проект тестов щелкните Создать новый проект тестов Visual C#.Затем нажмите кнопку ОК, чтобы отобразить диалоговое окно Создание проекта тестов.

  5. В качестве имени проекта введите SampleUnitTest.

  6. Чтобы создать модульный тест без настройки использования подключения к базе данных в проекте тестов, нажмите кнопку Отмена.В конструкторе модульных тестов SQL Server откроется пустой тест.В проект тестов будет добавлен файл с исходным кодом Visual C#.

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

  7. Выберите Щелкните здесь, чтобы создать для завершения создания модульного теста.Новое условие теста будет отображено в проекте SQL Server.

System_CAPS_ICON_note.jpg Примечание


Для использования созданного условия теста в существующих проектах модульных тестов необходимо создать хотя бы один новый класс модульных тестов SQL Server.Требуемая ссылка на сборку условия теста добавляется в проект тестов во время создания класса тестов.

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

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

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

  3. Щелкните раскрывающийся список Условия теста и выберите Число столбцов ResultSet.

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

  5. В окне Свойства задайте значения свойств Count, Enabled и ResultSet.

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

См. также

Нестандартные условия теста для модульных тестов SQL Server