Создание и откат тестовых данных с помощью SQL-сервера

Я создаю серию тестов веб-автоматизации, которые требуют, чтобы тестовые данные находились в базе данных (SQL Server 2008). Чтобы сгенерировать необходимые данные для каждого теста, мне нужно вызвать некоторый код C #, который вставит правильные данные в БД (т.е. я не могу просто написать сценарии SQL для вставки данных). Моя проблема в том, что я не хочу загрязнять свою тестовую базу данных большим количеством тестовых данных из этих автоматических тестов. Поэтому хотелось бы откатить все изменения, внесенные в БД во время теста.

Может ли кто-нибудь предложить разумный способ достижения этого?


person James Hollingworth    schedule 28.11.2010    source источник


Ответы (6)


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

person AdaTheDev    schedule 28.11.2010
comment
Или даже выполните восстановление в конце тестов, чтобы в следующий раз при запуске тестов чистая база данных уже была на месте. Привет, Тим, привет, Джеймс! - person mcintyre321; 29.11.2010
comment
Джейми, я бы тоже пошел по этому пути. Установите для базы данных «полную» модель восстановления. Сделайте одноразовое полное резервное копирование, а затем в начале каждого тестового запуска выполните дифференциальное резервное копирование, это должно быть очень быстрым. В конце тестов выполните «Восстановление на определенный момент времени» msdn.microsoft .com / en-us / library / ms190982.aspx - используйте студию управления, чтобы показать вам сценарии, необходимые для ее автоматизации. - person Joel Mansford; 29.11.2010

Это можно сделать двумя способами.

Один из них - заключить тест в транзакцию и откатить ее. Другой - использовать сценарий очистки как часть кода завершения теста (мы делаем это для некоторых из наших интеграционных тестов, когда транзакция не работает).

person Bob Palmer    schedule 28.11.2010
comment
Кстати, мы обычно работаем с конкретной эталонной базой данных для наших интеграционных тестов, поэтому система всегда находится в заведомо исправном состоянии до запуска наших интеграционных тестов (даже с данными отката). Делает вещи намного проще. - person Bob Palmer; 28.11.2010

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

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

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

Не пробовал автоматизировать резервное копирование / откат, как предлагает AdaTheDev, но это звучит как, вероятно, ваш лучший вариант, если вы не хотите поддерживать потенциально сложные (и ошибочные) сценарии очистки (зависит от сложности данных вашего моментального снимка / от того, как часто вы может изменить ваш снимок и соответственно изменить ваши очистки).

Рассматривали ли вы имитацию доступа к данным, чтобы ваши веб-тесты работали с хранилищем данных в памяти? Затем протестируйте процедуры доступа к данным изнутри, где вы все еще можете откатить области транзакций?

person Tim Iles    schedule 28.11.2010

Мастера из Red Gate только что выпустили SQL Virtual Restore, который фактически смонтирует файл резервной копии как живую, читаемую и доступную для записи базу данных - так что у вас может быть файл резервной копии, представляющий базовое состояние вашей системы перед тестами, сделайте копию этой резервной копии, смонтируйте копию как тестовую базу данных, запустите тесты, а затем отключите и сотрите копию.

Виртуальное восстановление находится по адресу http://www.red-gate.com/products/sql_virtual_restore/index.htm, и есть 14-дневная пробная версия, если вы хотите попробовать.

Между прочим, я не связан с Red Gate - я просто с энтузиазмом пользуюсь их инструментами.

person Dylan Beattie    schedule 28.11.2010
comment
Мне непонятно, какая добавленная стоимость по сравнению с восстановлением резервной копии в MyTestDb? Инструменты не требуются ... - person Patrick Honorez; 27.06.2011

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

Если у вас есть правильная версия SQL-сервера, вы можете использовать моментальные снимки базы данных вместо резервных копий: http://msdn.microsoft.com/en-us/library/ms175876.aspx просто потому, что они быстрее :)

person Rob Fonseca-Ensor    schedule 28.11.2010

Очевидно, все зависит от того, как вы вызываете тесты, но будет ли работать атрибут «Откат», который есть в MbUnit?

person caveman_dick    schedule 28.11.2010