Модульное тестирование с откатом по базе данных

Я только начинаю понимать важность модульного тестирования в среде aC#. Теперь мне интересно, как мне реализовать модульный тест черного ящика, который вставляет, удаляет и обновляет базу данных, а затем очищает данные после успешного тестирования.

Как вы на самом деле делаете процесс, который выполняет откат данных, вставленных / обновленных / удаленных? Вы просто сбрасываете индекс и удаляете вставленные строки? или восстановить исходное состояние таблицы, создав скрипт?

пожалуйста, ведите меня, я ценю это. Спасибо!

5 ответов

Решение

Что мы делаем здесь, в нашем цикле разработки. у нас всегда есть такое модульное тестирование и нагрузочное тестирование, когда мы разрабатываем приложение. Поэтому мы создаем столбец в таблице каждой нашей базы данных с помощью userId или else. Затем, когда мы запускаем Load Test или Unit test, мы вставляем в каждый столбец UserId -1, указывая, что это данные нагрузочного теста и -2 в случае данных модульного теста. тогда у нас есть предопределенные задания в конце базы данных, которые через некоторое время очистят эти данные.

Пока ваш тест лаконичен, и я предполагаю, что это должно быть - для тестирования вашего DAL, почему бы просто не вставить / обновить / удалить в транзакцию, которая откатывается после завершения теста.

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

Я думаю, что удаление строк в методе CleanUp должно быть хорошим выбором.

При этом вы всегда будете тестировать код удаления строк.

Я недавно проводил исследование и нашел эту тему. Вот мои выводы, которые могут быть полезны будущим читателям:

  • Сделайте тесты ответственными за восстановление данных, которые они изменяют. Sth как отменить для команды. Тесты обычно знают, какие изменения данных ожидаются, поэтому теоретически могут отменить их. Это, безусловно, потребует дополнительной работы и может внести некоторый шум, если только это не автоматизировано, например, вы можете попытаться отслеживать данные, созданные/обновленные в тесте, как-то вообще;
  • Оберните каждый тест в транзакцию и верните его впоследствии. Почти так же, как и выше, но проще реализовать с помощью таких вещей, как TransactionScope. Может не подходить, если приложение создает собственные транзакции, поскольку транзакции вообще не компонуются и если приложение не работает с TransactionScope (например, есть проблемы с Entity Framework);
  • Утверждайте каким-то разумным образом данные, относящиеся только к тесту. Тогда вам не нужно ничего очищать, если только данных не слишком много. Например, вы можете сообщить своему приложению о тестах и ​​установить определенное значение для столбца только для тестов, добавляемого в каждую таблицу. Я никогда не пробовал это на практике;
  • Создавать и инициализировать свежую базу данных с нуля для каждого теста;
  • Используйте резервные копии базы данных, чтобы восстановить базу данных до нужной вам точки;
  • Используйте моментальные снимки базы данных для восстановления;
  • Выполните сценарии, чтобы удалить все данные и вставить их снова.

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

Тестовые фреймворки обычно позволяют выполнять некоторую логику до и после каждого запуска тестов/тестовых приспособлений, что, скорее всего, понадобится для изложенных выше идей. Например, для NUnit это реализовано с использованием OneTimeSetUp , OneTimeTearDown, FixtureSetUp, FixtureTearDown, SetUp, TearDownатрибуты.

Одним из вариантов является использование базы данных Mock вместо реальной базы данных. Вот ссылка, которая описывает это.

Другие вопросы по тегам