Я пытаюсь определить способ работы с тестовой базой данных (в SQL Server) для нашего интеграционного тестирования.
Моя идея состояла в том, чтобы сделать эти шаги при запуске сборки интеграционного теста:
- создать полностью пустую базу данных
- запустить сценарий «создание объектов базы данных» для создания всех соответствующих объектов базы данных (таблицы, представления, последовательности и т. д.)
- заполнить «базовые данные» (поиск значений и т. д.)
- сделать снимок базы данных, называемый
(db)_Basis
«базовой линией» для будущих интеграционных тестов
Теперь перед каждым тестовым классом (содержащим 1-n тестов) я планировал просто выполнить «восстановление из моментального снимка», чтобы вернуться к четко определенному, более или менее «пустому» состоянию базы данных. Работает как шарм до сих пор.
Однако существует ряд интеграционных тестов, которые должны работать с большой тестовой базой данных - поэтому я надеялся сделать это перед каждым из этих тестовых тестов (классы с n отдельными тестами)
- восстановить базу данных из
(db)_Basis
снимка - вставить эти 50'000 + строк данных в базу данных
- создать еще один моментальный
(db)_With_Testdata
снимок
а затем для каждого теста сбросьте базу данных до четко определенной (db)_With_Testdata
версии снимка, запустите тесты, проверьте результат и так далее.
Проблема в том, что у меня не может быть двух снимков базы данных одновременно - как только я это сделаю, я не смогу восстановить свою базу данных ни к одному из них .... Я продолжаю получать эту ошибку:
Сообщение 3137, уровень 16, состояние 4, строка 9
База данных не может быть восстановлена. Неправильно указаны имена основного или моментального снимка, все остальные моментальные снимки не были удалены или отсутствуют файлы.Сообщение 3013, уровень 16, состояние 1, строка 9
RESTORE DATABASE завершается ненормально.
Это действительно, как работают снимки базы данных SQL Server? Кажется ужасно ограничивающим ..... Я бы понял, если бы я не мог вернуться непосредственно к исходному снимку "(db) _Basis", может быть - но только потому, что у меня теперь есть два снимка, я даже не могу вернуться к самому последнему ?!?!?
источник
Ответы:
К сожалению, это по замыслу.
Взято со страницы BOL « Вернуть базу данных в моментальный снимок базы данных »:
В качестве альтернативы вы можете удалить первый снимок
(db)_Basis
. Я могу понять, что это кажется очень ограничивающим, но посмотрите на это следующим образом: снимки - это разреженные файлы, основанные на исходных файлах данных, поэтому возврат к определенному снимку в любом случае сделает недействительными все снимки (базовые файлы данных будут изменены с помощью операции возврата) , Ограничение может быть раздражающим, но не выглядит необоснованным.источник
Другой перспективой будет создание резервных копий и их восстановление - поскольку вы просто создаете пустую базу данных и схему с некоторыми значениями поиска.
Кроме того, просто вставив 50К строк, база данных не будет такой большой. Если вы используете сжатие, размер резервной копии также будет меньше.
У вас могут быть задания агента TSQL или просто сценарии (может быть, вы можете создать хранимую процедуру и просто вызывать ее после ваших тестов, основываясь на полученном вами результате).
(db)_Basis
(db)_With_Testdata
запустив свои интеграционные сценарии и основанные на конечном результате, вы можете запустить любое из указанных выше заданий, чтобы вернуться к тому, что вы когда-либо захотите.
Я чувствую, что метод резервного копирования / восстановления является очень элегантным в вашем сценарии, поскольку вы используете ограничение снимка базы данных . Кроме того, Пол Рэндал писал о неприятной ошибке во всех версиях, включая SQL Server 2012 включительно (не уверен, исправлена ли она в более поздней CU)
источник