Уровень бизнес-логики модульных тестов

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

Я бы тоже хотел представить CI-сервер, но это будет тема других вопросов. Теперь вопрос: я сейчас читаю "Искусство модульного тестирования" (это рекомендуемый шедевр!), И автор подчеркивает, что модульное тестирование отличается от интеграционного тестирования. Это ясно для меня, и, если я правильно понял, модульное тестирование Business Logic не должно зависеть от соединений с базой данных и так далее. Прежде всего: я прав?

Итак, предположив, что я прав (т.е. когда я тестирую модуль BLL, я должен заглушить базу данных), как я это сделаю? Я читал, что есть некоторые рамки для дб издевательства. Должен ли я использовать один из них? Что вы используете?

Следующий вопрос: вы действительно думаете, что это правильный путь? Я имею в виду: в моем проекте BL взаимодействует с базой данных через Entity Framework. Так, например, когда вызывается метод "UpdateItem" в моем BLL, он что-то делает, а затем сохраняет ObjectContext. Этот ObjectContext является зависимостью Entity Framework, которую мне нужно удалить в моем BL. Но что я должен проверить в таком методе? Я действительно не могу понять модульное тестирование слоя BL без совместного тестирования DAL... Можете привести пример?

Большое спасибо за ваши усилия!

Marco

2 ответа

Да,

Тестирование бизнес-логики не должно зависеть от базы данных.

Вы правы в этом.

Я рекомендую вам:

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

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

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

Время от времени вы можете запускать интеграционные тесты (которые займут больше времени), чтобы проверить, что БД все еще работает правильно.

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

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

Тесты могут быть запущены в транзакции, которая откатывается в конце теста. Таким образом, база данных модульных тестов никогда не изменяется тестами и всегда хранится в известном состоянии.

Я написал об этом в разделе "Использование транзакций для модульных тестов" в моем блоге. Пример кода есть для linq-to-sql, но тот же подход работает и для структуры сущностей.

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