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


Использование условий теста в модульных тестах SQL Server

В модульном тесте SQL Server выполняется один или несколько тестовых скриптов Transact-SQL. Результаты можно проверить с помощью скрипта Transact-SQL и предложений THROW или RAISERROR, которые возвращают ошибку и аварийно завершают тест. Также для проверки результатов можно задать условия теста. Тест возвращает экземпляр класса SqlExecutionResult. Экземпляр этого класса содержит один или несколько наборов данных, время выполнения и строки, затронутые скриптом. Все эти сведения собираются во время выполнения скрипта. Эти результаты можно оценить с помощью условий теста. SQL Server Data Tools предоставляет набор стандартных условий теста. Вы также можете создать и применить пользовательские условия, как описано в статье Пользовательские условия теста для модульных тестов SQL Server.

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

В следующей таблице приведены стандартные условия теста, которые можно добавлять с помощью панели "Условия теста" в конструкторе модульных тестов SQL Server.

Условие теста Описание условия теста
Контрольная сумма данных Завершается сбоем, если контрольная сумма результирующего набора, возвращенного скриптом Transact-SQL, не совпадает с ожидаемой суммой. Дополнительные сведения см. в разделе Указание контрольной суммы данных.

ПРИМЕЧАНИЕ. Использование этого условия теста не рекомендуется, если каждый запуск теста возвращает разные данные. Например, если результирующий набор содержит формируемые даты, или отметки времени, или столбцы идентификаторов, тесты будут завершаться неудачей, так как при каждом запуске контрольная сумма будет разной.
Пустой набор ResultSet Завершается сбоем, если результирующий набор, возвращенный сценарием Transact-SQL, не пуст.
Время выполнения Завершается сбоем, если тестовый скрипт Transact-SQL выполняется дольше, чем ожидалось. По умолчанию время выполнения равно 30 секундам.

Время выполнения относится только к скрипту теста, но не к скриптам, выполняемым до и после теста.
Ожидаемая схема Не выполняется, если столбцы и типы данных результирующего набора отличаются от столбцов и типов данных, заданных в условии теста. Схема указывается в свойствах условия теста. Дополнительные сведения см. в разделе Указание ожидаемой схемы.
С неопределенным результатом Всегда формирует тест с неопределенным результатом. Это условие добавляется в каждый тест по умолчанию. Оно указывает на то, что проверка теста не выполнена. Удалите это условие из теста после добавления других условий.
Не пустой набор ResultSet Не выполняется, если возвращен пустой результирующий набор. Это условие теста или EmptyResultSet можно использовать в скрипте теста вместе с функцией Transact-SQL @@RAISERROR для проверки правильности применения обновления. Например, можно сохранить значения до обновления, выполнить обновление, сравнить полученные значения и сформировать ошибку, если ожидаемые результаты не были получены.
Количество строк Не выполняется, если результирующий набор не содержит ожидаемое количество строк.
Скалярное значение Не выполняется, если определенное значение в результирующем наборе не равно указанному значению. По умолчанию ожидаемое значение — null.

Примечание

Условие теста "Время выполнения" задает временной лимит, в который должно уложиться выполнение тестового скрипта Transact-SQL. При превышении этого предела тест завершается неудачей. Результаты теста также содержат статистику «Продолжительность», которая отличается от условия теста «Время выполнения». Статистика по продолжительности содержит не только время выполнения, но также два значения времени на подключение к базе данных, время на выполнение других скриптов, например скриптов, выполняемых перед и после теста, и время на выполнение условий теста. Тест считается пройденным, даже если его продолжительность больше значения времени выполнения.

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

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

Также можно напрямую редактировать код метода теста, что позволяет добавить дополнительную функциональность. Дополнительные сведения см. в статьях Практическое руководство. Открытие модульного теста SQL Server для его изменения и Практическое руководство. Написание модульного теста SQL Server, который выполняется в области действия одной транзакции. Например, функциональность к методу теста можно добавить с помощью инструкций Assert. Дополнительные сведения см. в статье Использование операторов утверждений Transact-SQL в модульных тестах SQL Server.

Ожидаемые неудачи

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

  • Проверка хранимой процедуры, которая удаляет данные клиента, при тесте должна завершаться неудачей, если указывается недопустимый идентификатор клиента.

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

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

Можно определить модульные тесты SQL Server для хранимых процедур, которые вызывают ожидаемые исключения. К методу модульного теста можно добавить атрибут, чтобы указать, какие исключения следует ожидать. Таким образом можно предотвратить неудачу выполнения теста при возникновении такого исключения.

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

[ExpectedSqlException(MessageNumber = nnnnn, Severity = x, MatchFirstError = false, State = y)]  

Где:

  • nnnnn — номер ожидаемого сообщения, например 14025;

  • x — серьезность ожидаемого исключения;

  • y — состояние ожидаемого исключения.

Любые неуказанные параметры не используются. Эти параметры передаются инструкции THROW в коде базы данных. Если указано MatchFirstError = false, то атрибут будет соответствовать любой из ошибок SqlErrors исключения. По умолчанию (MatchFirstError = true) сопоставление происходит только с первой возникшей ошибкой.

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

Указание контрольной суммы данных

Чтобы отобразить конструктор модульных тестов SQL Server, дважды щелкните файл исходного кода модульного теста в Обозреватель решений.

После добавления условия теста «Контрольная сумма данных» к модульному тесту БД следует указать контрольную сумму, выполнив следующие действия.

Указание ожидаемой контрольной суммы

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

  2. Откройте окно Свойства , нажав F4. Это окно также можно открыть из меню Вид , выбрав пункт Свойства .

  3. (Необязательно) Вы можете изменить свойство Имя для условия теста, чтобы оно было более понятным и подробным.

  4. Рядом со свойством Конфигурация нажмите кнопку обзора ( ).

    Откроется диалоговое окно Конфигурация для TestConditionName .

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

  6. По умолчанию на панели редактирования открывается код Transact-SQL для вашего теста. При необходимости для получения нужных результатов можно изменить код теста. Например, если для теста нужен код, который выполняется перед самим тестом, то потребуется добавить такой код.

    Важно!

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

  7. Нажмите Получить.

    Скрипт Transact-SQL будет выполнен для указанного подключения к базе данных, и в диалоговом окне отобразятся результаты этого теста.

  8. Если результаты совпадают с ожидаемыми значениями теста, нажмите кнопку ОК. В противном случае измените код Transact-SQL и повторяйте шаги 6, 7 и 8, пока результаты не совпадут с ожидаемыми.

    Столбец Значение условия теста содержит ожидаемую контрольную сумму.

Указание ожидаемой схемы

Добавив условие теста "Ожидаемая схема" к модульному тесту SQL Server, настройте ожидаемую схему, выполнив указанные ниже действия.

Указание ожидаемой схемы

  1. В списке условий теста выберите условие «Ожидаемая схема», для которого нужно указать схему.

  2. Откройте окно Свойства , нажав F4. Это окно также можно открыть из меню Вид , выбрав пункт Свойства .

  3. (Необязательно) Вы можете изменить свойство Имя для условия теста, чтобы оно было более понятным и подробным.

  4. Рядом со свойством Конфигурация нажмите кнопку обзора ( ).

    Откроется диалоговое окно Конфигурация для TestConditionName .

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

  6. По умолчанию на панели редактирования открывается код Transact-SQL для вашего теста. При необходимости для получения нужных результатов можно изменить код теста. Например, если для теста нужен код, который выполняется перед самим тестом, то потребуется добавить такой код.

    Важно!

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

  7. Нажмите Получить.

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

  8. Если результаты совпадают с ожидаемыми значениями теста, нажмите кнопку ОК. В противном случае измените код Transact-SQL и повторяйте шаги 6, 7 и 8, пока результаты не совпадут с ожидаемыми.

    Столбец Значение условия теста содержит сведения об ожидаемой схеме. Например: "Ожидается: 2 таблицы".

Расширяемые условия теста

В дополнение к шести стандартным условиям теста можно написать собственные условия. Эти условия будут отображаться на панели "Условия теста" в конструкторе модульных тестов SQL Server. Дополнительные сведения см. в статье Пользовательские условия теста для модульных тестов SQL Server.

См. также:

Создание и определение модульных тестов SQL Server
Использование операторов утверждений Transact-SQL в модульных тестах SQL Server
Скрипты в модульных тестах SQL Server