Пошаговое руководство. Использование пользовательского условия теста для проверки результатов выполнения хранимой процедуры
В этом пошаговом руководстве по расширению компонента вы создадите условие теста и проверите его работоспособность, создав модульный тест SQL Server.Частью этого процесса является создание проекта библиотеки классов для условия теста, а также его подписание и установка.Если у вас уже есть условие теста, которое требуется обновить, то см. раздел Практическое руководство. Обновление нестандартного условия теста Visual Studio 2010 с предыдущего выпуска до SQL Server Data Tools.
В этом пошаговом руководстве описаны следующие задачи:
Создание условия теста.
Подписание сборки строгим именем.
Добавление необходимых ссылок в проект.
Построение условия теста.
Установка нового условия теста.
Проверка нового условия теста.
Для выполнения этого пошагового руководства требуется Visual Studio 2010 или Visual Studio 2012 с последней версией SQL Server Data Tools.Дополнительные сведения см. в разделе Установка базовой версии SQL Server Data Tools.
Создание пользовательского условия теста
Сначала будет создана библиотека классов.
В меню Файл выберите пункт Создать, а затем пункт Проект.
В диалоговом окне Создание проекта в разделе Типы проектов щелкните Visual C#.
В разделе Шаблоны выберите пункт Библиотека классов.
В текстовое поле Имя введите ColumnCountCondition и нажмите кнопку ОК.
Затем подпишите проект.
В меню Проект выберите пункт Свойства ColumnCountCondition.
На вкладке Подпись установите флажок Подписать сборку.
В поле выбора файла ключа строгого имени щелкните <New...>.
Откроется диалоговое окно Создание ключа строгого имени.
В поле Имя файла ключа введите SampleKey.
Введите и подтвердите пароль, затем нажмите кнопку ОК.При построении решения файл ключа используется для подписания сборки.
В меню Файл выберите команду Сохранить все.
В меню Сборка выберите Построить решение.
Затем выполняется добавление необходимых ссылок в проект.
В обозревателе решений выберите проект ColumnCountCondition.
В меню Проект щелкните Добавить ссылку, чтобы открыть диалоговое окно Добавление ссылки.
Перейдите на вкладку .NET.
В столбце Имя компонента найдите и выберите компонент System.ComponentModel.Composition.Выбрав этот компонент, нажмите кнопку ОК.
Добавьте необходимые ссылки на сборки.Щелкните правой кнопкой мыши узел проекта и выберите пункт Добавить ссылку.Нажмите кнопку Обзор и перейдите к папке C:\Program Files (x86)\MicrosoftSQL Server\110\DAC\Bin.Выберите Microsoft.Data.Tools.Schema.Sql.dll и нажмите «Добавить», а затем нажмите кнопку ОК.
В меню Проект выберите пункт Передать проект.
Щелкните проект правой кнопкой мыши в обозревателе решений и выберите Изменить <имя проекта>.csproj.
После импорта 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)' != ''" />
Сохраните файл и закройте его.Щелкните проект правой кнопкой мыши в обозревателе решений и выберите Перезагрузить проект.
Требуемые ссылки будут показаны в узле Ссылки проекта в обозревателе решений.
Создание класса ResultSetColumnCountCondition
Теперь переименуем класс Class1 в ResultSetColumnCountCondition и сделаем его производным от класса TestCondition.Класс ResultSetColumnCountCondition является простым условием теста, которое проверяет число столбцов, возвращенных в ResultSet.С помощью этого условия теста можно проверять правильность контракта для хранимой процедуры.
В обозревателе решений щелкните правой кнопкой мыши Class1.cs, выберите команду Переименовать и введите ResultSetColumnCountCondition.cs.
Нажмите кнопку Да, чтобы подтвердить переименование всех ссылок на Class1.
Откройте файл 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
Сделайте класс производным от класса TestCondition.
public class ResultSetColumnCountCondition : TestCondition
Добавьте ExportTestConditionAttribute.Дополнительные сведения о Практическое руководство. Создание условия теста для конструктора модульных тестов SQL Server см. в разделе ExportTestConditionAttribute.
[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; }
Переопределите метод 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); }
С помощью атрибутов 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 и создание проекта базы данных
Запустите второй сеанс работы Visual Studio.
В меню Файл выберите пункт Создать, а затем пункт Проект.
В диалоговом окне Создание проекта в списке установленных шаблонов выберите узел SQL Server.
На панели сведений щелкните SQL Server Проект базы данных.
В текстовое поле Имя введите SampleConditionDB и нажмите кнопку ОК.
Теперь необходимо создать модульный тест.Создание модульного теста SQL Server в новом классе тестов
В меню Тест выберите команду Создать тест, чтобы открыть диалоговое окно Добавление нового теста.
Также можно открыть обозреватель решений, щелкнуть правой кнопкой мыши проект теста, выбрать Добавить, а затем щелкнуть Создать тест.
В списке шаблонов щелкните Модульный тест SQL Server.
В поле Имя теста введите SampleUnitTest.
В разделе Добавить в проект тестов щелкните Создать новый проект тестов Visual C#.Затем нажмите кнопку ОК, чтобы отобразить диалоговое окно Создание проекта тестов.
В качестве имени проекта введите SampleUnitTest.
Чтобы создать модульный тест без настройки использования подключения к базе данных в проекте тестов, нажмите кнопку Отмена.В конструкторе модульных тестов SQL Server откроется пустой тест.В проект тестов будет добавлен файл с исходным кодом Visual C#.
Сведения о создании и настройке подключений к базе данных в модульных тестах баз данных см. в разделе Практическое руководство. Создание пустого модульного теста SQL Server.
Выберите Щелкните здесь, чтобы создать для завершения создания модульного теста.Новое условие теста будет отображено в проекте SQL Server.
Примечание |
---|
|
Просмотр нового условия теста
В конструкторе модульных тестов SQL Server в разделе Условия тестов в столбце Имя щелкните тест inconclusiveCondition1.
Нажмите кнопку Удалить условие теста на панели инструментов, чтобы удалить тест inconclusiveCondition1.
Щелкните раскрывающийся список Условия теста и выберите Число столбцов ResultSet.
Нажмите кнопку Добавить условие теста на панели инструментов, чтобы добавить созданное условие теста.
В окне Свойства задайте значения свойств Count, Enabled и ResultSet.
Дополнительные сведения см. в разделе Практическое руководство. Добавление условий теста в модульные тесты SQL Server.