Хранимые процедуры в базе данных SQL Server могут подвергаться модульному тестированию с использованием модульных тестов базы данных Visual Studio. Сначала это может показаться простым делом, но когда вы начнете писать тесты, вы обнаружите, что это более сложная задача, чем ожидалось. В этой публикации я расскажу о тестировании базы данных с помощью инструментов Visual Studio.
NB! В этой публикации я буду использовать Visual Studio 2010, поскольку я не смог запустить модульные тесты базы данных в Visual Studio 2012. VS2012 также имеет эти тесты, но мне кажется, что эта поддержка еще не завершена и ожидает стабилизации и исправлений.
Это на самом деле юнит-тесты?
Я не очень уверен, что эти тесты можно назвать юнит-тестами. Они отличаются от модульных тестов, которые мы использовали при разработке приложений. Поскольку эти тесты могут также тестировать интегрированные компоненты в базе данных, я бы скорее назвал эти тесты тестами базы данных. Считать, что эти тесты шире, чем модульные, это нормально, потому что один и тот же механизм позволяет нам писать совершенно разные тесты для баз данных.
Почему тестирование базы данных?
Базы данных часто являются более сложными животными, чем просто некоторые таблицы, ключи и индексы. Часто базы данных содержат сложные запросы, хранимые процедуры и пользовательские функции. SQL Server также поддерживает библиотеки CLR. Все эти объекты базы данных содержат некоторую логику, которая обычно очень важна.
Системы, которые интенсивно используют хранимые процедуры, являются хорошими целями для тестов базы данных. На самом деле, есть два способа проверить эти базы данных:
- регулярные интеграционные тесты для некоторого сервиса или набора классов, которые делают данные доступными для системы,
- тесты базы данных.
Тесты базы данных кажутся мне лучшим вариантом, потому что тогда мы не включаем код из других уровней в тесты, и поэтому ошибки в других слоях не могут повлиять на результаты тестов базы данных.
Тестирование определенной пользователем функции
Начнем с простого теста, который можно рассматривать как модульный тест. Вот определение нашей функции:
CREATE FUNCTION [dbo].[GetImportantValue] ( @n int ) RETURNS float AS BEGIN if(ABS(@n)=2) begin return 0 end return 1.0 / (4 - @n*@n) END
Что можно проверить здесь? Пара вещей:
- дает ли функция ожидаемые результаты с нормальными значениями?
- дает ли функция ожидаемые результаты с особыми значениями?
Хорошо, что нормально и в чем особая ценность? Нормальные значения — это то, что функция должна принимать во всех обычных случаях. Специальные значения в текущем случае являются значениями, которые вызывают деление на ноль. Мы не хотим находить подобные ошибки в общедоступных тестовых или производственных средах.
Создание базы данных теста
Мы начнем с создания нового тестового проекта в Visual Studio и добавления модульного теста базы данных в этот проект.
После создания проекта у нас есть один тестовый модуль по умолчанию, и мы должны удалить его, так как он нам не нужен. Если мы запустим его, мы получим исключение, и в нашем списке тестов всегда будет один неудачный тест.
Теперь давайте добавим модульный тест базы данных. Наш первый тест — это просто вызов нашей функции со значением 3.
Мы удаляем условие теста по умолчанию. Вместо этого мы добавим условие скалярного значения, так как ожидаем обратное скалярное значение. Нажав на условие, мы можем установить ожидаемое значение.
Теперь первый тест готов.
Бегущий тест
Создайте проект и в верхнем меню выберите Test => Run => All Tests in Solution. Npw все тесты в текущем решении выполняются и результаты отображаются в результатах тестирования Windows.
Наш тест пройден, и все это хорошо.
Добавление большего количества условий
У нас было более одного значения для проверки нашей функции. Мы можем добавить больше тестов в наш тестовый проект, но мы также можем использовать один и тот же тест с более чем одним условием теста.
Давайте добавим тесты для этих значений: –3, –2, 0, 2, 3. В первую очередь мы изменим наш тестовый запрос. Поскольку он должен возвращать только пять чисел, мы можем добавить условия скалярных значений для этих чисел, не делая тест слишком сложным для обработки.
Вот один трюк с условиями испытаний. Мы должны также изменить индекс столбца каждого скалярного условия, поскольку наш тест вернет одну строку с пятью столбцами. Запустив тест мы получаем следующий результат.
Тесты базы данных Visual Studio позволяют нам делать гораздо больше, но эта публикация достаточно длинная, и я вернусь к тестам базы данных в другой раз.
Вывод
Модульные тесты базы данных являются мощным инструментом для использования при создании базы данных, которая реализует некоторую бизнес-логику или выполняет конфиденциальные вычисления, и мы хотим быть уверены, что код в базе данных работает правильно. Существует множество способов написания тестов базы данных, и здесь мы начали с простого случая, который поможет вам. Тесты баз данных могут предложить гораздо больше, и я предлагаю вам попробовать их.