2014-01-26 3 views
2

Я экспериментирую с модульным тестированием проекта базы данных SQL Server в Visual Studio 2013. Выход хранимой процедуры, которую я хочу протестировать, записывается в журнал файл путем вызова другой хранимой процедуры, sp_log.Visual Studio 2013: Отказывание хранимых процедур при модульном тестировании проекта базы данных SQL Server

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

Я мог бы создать макет sp_log в сценарии предварительной проверки, без проблем. Однако в сценарии после теста я хотел бы повторно выполнить сценарий sp_LogCREATE PROC, чтобы восстановить его исходное определение. Я не хочу вырезать и вставлять sp_Log CREATE PROC из тестируемого проекта SQL Server Database Project, так как я уверен, что две версии CREATE PROC (в проекте базы данных SQL Server и в проекте тестирования модулей) перестанут синхронизироваться.

Можно ли каким-либо образом вызвать сценарий sp_Log CREATE PROC в проекте базы данных SQL Server из сценария после тестирования в проекте Unit Test?

В качестве альтернативы, есть ли способ записать определение sp_log в сценарий предварительной проверки, а затем повторно запустить это определение в пост-тестовом сценарии? Например. возможно ли создать локальную переменную в сценарии предварительной проверки и прочитать определение хранимой процедуры в ней, а затем прочитать определение из локальной переменной в сценарии после теста?

ответ

1

Попробуйте переименовать sp_log в сценарий предварительной проверки, а затем переименуйте его в сценарий после тестирования.

Дотестовое:

EXEC sp_rename 'sp_log', 'sp_log_BACKUP' 
CREATE PROCEDURE sp_log AS .... /* your mock sp_log */ 

Послетестовое

EXEC sp_rename 'sp_log_BACKUP', 'sp_log' 

Я не уверен, таким образом, чтобы ссылаться на сохраненные определения процедуры в переменных или что-то подобное. Надеюсь, переименование хранимой процедуры, как я предложил, является достаточным.

+0

Отличная идея, которая будет работать. –

+0

Предостережение для всех, кто думает об этом: если тест не удается, появляется сценарий пост-теста. Таким образом, вы можете остаться со сломанной базой данных. Я думаю, вам нужно будет отредактировать автоматически сгенерированный тестовый код .NET, чтобы гарантировать, что сценарий после тестирования будет запущен, даже если условие проверки завершится неудачно. Когда условие теста завершается неудачно, он, похоже, генерирует исключение, которое предотвращает выполнение оставшейся части тестового кода .NET. –

+1

@SimonTewsi Вы можете исправить код, чтобы убедиться, что сценарий пост-теста всегда выполняется, редактируя тестовый код блока C# - вам просто нужно обернуть тестовое действие в блок try/finally. Это будет фактически исправлено в будущей версии SSDT. См. Это сообщение на форуме SSDT для получения полного объяснения: http://social.msdn.microsoft.com/Forums/sqlserver/en-US/e80b77d7-0cdc-4ecf-bd4e-6a03f1d821aa/posttest-not-run-after- test-failed? forum = ssdt –

2

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

https://tangodude.wordpress.com/2014/02/08/ssdt-database-projects-mocking-database-objects-for-isolated-unit-testing-kind-of/

Извините за избыточный ответ, но не хватает респа комментировать еще. :)

+0

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

+0

BTW: Я заметил, что этикетирование Stackoverflow, похоже, способствует цитированию или перефразированию соответствующей информации в ответе Stackoverflow в дополнение к добавлению ссылки. Таким образом, если страница связана с когда-либо изменением адреса или удаляется, ответ Stackoverflow может по-прежнему стоять сам по себе. Не уверен, что это возможно в этом случае, так как вы, вероятно, просто закончите вставлять всю запись в блоге в свой ответ, но это может быть полезно знать в будущем. –

+0

Хорошо, я попробую. Спасибо за совет, я все еще новичок в SO, так что все еще учась. :) – Jorge

1

Чтобы ваша база данных оставалась в том же состоянии после выполнения теста, я выполняю ее в рамках транзакции. Поступая таким образом, мне не нужно беспокоиться об очистке базы данных после выполнения теста. Вы можете найти более подробную информацию здесь: http://msdn.microsoft.com/en-us/library/aa833153(v=vs.100).aspx

Смежные вопросы