Как юнит-тестирование базы данных зависит поведение C # - PullRequest
3 голосов
/ 18 ноября 2010


У меня есть приложение C #, которое общается с БД. Я хочу протестировать некоторые функции, которые зависят от БД. Поэтому я хочу быть уверенным, что БД имеет начальное состояние перед каждым тестом. Я использую NUnit для тестирования моего приложения. Какие средства доступны для восстановления исходного состояния БД?
Спасибо за вашу помощь!

Ответы [ 5 ]

5 голосов
/ 18 ноября 2010

Вы не тестируете взаимодействие с базой данных. Этот тип тестирования называется интеграционным тестированием. Для этого вы можете использовать ваши обычные инструменты тестирования (NUnit, MSTest и т. Д.), Но лучше всего разделить интеграционные тесты в отдельном проекте, использовать выделенную тестовую базу данных и запустить эти тесты в транзакции (например, использовать TransactionScope ), который вы откатываете. Это гарантирует, что данные не изменятся, а поведение ваших тестов предсказуемо, что очень важно.

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

3 голосов
/ 18 ноября 2010

Вы можете использовать в памяти базу данных SQLite для создания тестовой среды БД.

SQLite Nunit & Fluent Nhibernate - протестируйте свой уровень доступа к данным

1 голос
/ 18 ноября 2010

Как уже говорили другие, вы НЕ должны зависеть от БД и ее структуры в модульном тестировании. Следовательно, я бы создал интерфейс, который скрывает БД от компонента, который его использует (он же уровень абстракции БД), а затем внедрил бы БД в памяти для модульного тестирования.

Таблицы этой in-memory-DB могут быть реализованы с использованием простого C # HashTable для каждой таблицы DB.

Это разделение также имеет то преимущество, что создает в вашем коде разделение между БД, которое может меняться (например, переходить с MySQL на Oracle и т. Д.) От компонентов, которые его используют.

0 голосов
/ 18 ноября 2010

Рассмотрите возможность перехода на MbUnit для ваших интеграционных тестов. Он имеет очень удобный атрибут Rollback именно для ваших нужд.

MbUnit имеет те же атрибуты для маркировки тестовых классов и методов, что и NUnit. Таким образом, вам нужно всего лишь изменить директивы using и сослаться на библиотеки MbUnit.

0 голосов
/ 18 ноября 2010

Вы должны использовать макетные программы (плагины), такие как:

Rhino mocks или moq

эти программы могут имитировать источник данных, например базу данных, во времятестирование.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...