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

 

Создавать новые условия теста можно с помощью расширяемого класса TestCondition.Например, можно создать новое условие теста, которое проверяет число столбцов или значений в результирующем наборе.

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

В этой процедуре объясняется, как создать условие теста, которое появится в конструкторе модульных тестов SQL Server.

  1. Создайте проект библиотеки классов в Visual Studio.

  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. Сохраните файл и закройте его.Щелкните проект правой кнопкой мыши в обозревателе решений и выберите Перезагрузить проект.

  10. Этот класс является производным от класса TestCondition.

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

  12. Постройте библиотеку классов.

  13. Чтобы новое условие теста можно было использовать, подписанную сборку необходимо скопировать в папку %Program Files%\Microsoft Visual Studio <версия>\Common7\IDE\Extensions\Microsoft\SQLDB\TestConditions.Если такой папки не существует, создайте ее.Для копирования файлов в этот каталог пользователь должен обладать правами доступа администратора на компьютере.

  14. Установите условие теста.Дополнительные сведения см. в разделе Нестандартные условия теста для модульных тестов SQL Server.

  15. Добавьте новый модульный тест SQL Server в проект, чтобы создать в проекте ссылку на условие теста, которое требуется добавить в проект.Можно вручную добавить ссылку на сборку условий теста в проекте.Перезагрузите конструктор после выполнения этого шага.

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


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

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

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 Ssdt.Samples.SqlUnitTesting  
{  
  
    [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  
    }  
}  

Класс для нестандартного условия теста является производным от базового класса TestCondition.Поскольку у нестандартного условия теста есть дополнительные свойства, пользователи могут настраивать условие в окне «Свойства» после его установки.

Атрибут ExportTestConditionAttribute должен быть добавлен к классам, расширяющим TestCondition.Этот атрибут позволяет SQL Server Data Tools обнаруживать класс и использовать его при проектировании и выполнении модульных тестов.Этот атрибут принимает два параметра.

Параметр атрибута Положение Описание
DisplayName 1 Определяет строку в поле со списком «Условия теста».Имя должно быть уникальным.Если у двух решений одинаковое отображаемое имя, пользователю будет показано первое условие, при этом в диспетчере ошибок Visual Studio будет показано предупреждение.
ImplementingType 2 Используется для уникального определения расширения.Это значение необходимо изменить, чтобы оно совпадало с типом, которому задается этот атрибут.В этом примере используется тип ResultSetColumnCountCondition, поэтому укажите typeof(ResultSetColumnCountCondition).Если же используется тип NewTestCondition, то укажите typeof(NewTestCondition).

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

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

  • Имя категории, которое помогает в организации свойств.

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

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

Проверка выполняется по свойствам: проверяется, чтобы значение свойства ResultSet не было меньше одного, а значение свойства Count было больше нуля.

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

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

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

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

Необходимо подписать библиотеку классов, которая содержит условие теста. Сделать это можно на вкладке «Подписание» страницы свойств проекта.

См. также

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