Уровень бизнес-логики модульных тестов
Я начинаю внедрять формальное модульное тестирование в нашей компании, так как у нас есть проект, который становится все больше и больше, и в этом проекте мне поможет другой парень. Поэтому я должен быть уверен, что то, что он делает, не разрушает все и наоборот.
Я бы тоже хотел представить CI-сервер, но это будет тема других вопросов. Теперь вопрос: я сейчас читаю "Искусство модульного тестирования" (это рекомендуемый шедевр!), И автор подчеркивает, что модульное тестирование отличается от интеграционного тестирования. Это ясно для меня, и, если я правильно понял, модульное тестирование Business Logic не должно зависеть от соединений с базой данных и так далее. Прежде всего: я прав?
Итак, предположив, что я прав (т.е. когда я тестирую модуль BLL, я должен заглушить базу данных), как я это сделаю? Я читал, что есть некоторые рамки для дб издевательства. Должен ли я использовать один из них? Что вы используете?
Следующий вопрос: вы действительно думаете, что это правильный путь? Я имею в виду: в моем проекте BL взаимодействует с базой данных через Entity Framework. Так, например, когда вызывается метод "UpdateItem" в моем BLL, он что-то делает, а затем сохраняет ObjectContext. Этот ObjectContext является зависимостью Entity Framework, которую мне нужно удалить в моем BL. Но что я должен проверить в таком методе? Я действительно не могу понять модульное тестирование слоя BL без совместного тестирования DAL... Можете привести пример?
Большое спасибо за ваши усилия!
Marco
2 ответа
Да,
Тестирование бизнес-логики не должно зависеть от базы данных.
Вы правы в этом.
Я рекомендую вам:
- используйте набор модульных тестов для бизнес-уровня, используя заглушки вместо реальных вызовов БД. Вы можете заглушить БД любым удобным для вас способом (у вас есть поддельные классы или фиктивные библиотеки), при условии, что у вас есть абстракции над компонентами БД.
- использовать набор интеграционных тестов для проверки реальных вызовов БД (и только это!)
Основные различия между модульными тестами и интеграционными тестами заключаются в следующем: * модульные тесты бывают быстрыми и не требуют какой-либо настройки * интеграционные тесты могут быть медленными и требовать правильной конфигурации (должна быть настроена база данных и должна быть соответствующая строка подключения, указывающая на Это).
Я думаю, что это хорошо, потому что позволяет очень часто запускать тесты бизнес-юнитов при внесении изменений в код. Это важно, потому что вы получаете очень быструю обратную связь (обычно в течение 1-2 секунд), что сделанные вами изменения ничего не сломали.
Время от времени вы можете запускать интеграционные тесты (которые займут больше времени), чтобы проверить, что БД все еще работает правильно.
Кроме того, я предлагаю вам прочитать книгу, которую вы упомянули. Он считает, что это очень важный источник информации по этой теме.
Заглушка базы данных - огромная задача, которая, я думаю, не стоит того. Я предпочитаю иметь специальную копию базы данных с тщательно подготовленными данными, подходящими для юнит-тестов.
Тесты могут быть запущены в транзакции, которая откатывается в конце теста. Таким образом, база данных модульных тестов никогда не изменяется тестами и всегда хранится в известном состоянии.
Я написал об этом в разделе "Использование транзакций для модульных тестов" в моем блоге. Пример кода есть для linq-to-sql, но тот же подход работает и для структуры сущностей.