Почему проблематично использовать БД в тестах? - PullRequest
3 голосов
/ 21 мая 2011


Я смотрю это видео пост (Джон Галлоуэй и Джесси Либерти) о создании репозитория для тестирования, и они отметили, что не очень хорошая идея иметь БД, а скорее однуследует использовать поддельный репозиторий.Это объясняется двумя причинами:
1. БД может быть недоступна, и
2. Модульные тесты должны быть сосредоточены на уровне кода.

Итак, о первом, я никогда не сталкивался со сценарием, в котором я хотел бы поработать над чем-либо и проверить env.DB не был доступен, и второе, что они сделали, я не получил.

Так это плохая практика использования вашей БД в модульных тестах?Каков потенциальный вред?

Спасибо.

Ответы [ 2 ]

5 голосов
/ 21 мая 2011

Так это плохая практика использования вашей БД в модульных тестах?

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

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

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

3 голосов
/ 21 мая 2011

Модульные тесты должны проверять одну вещь и не иметь внешних зависимостей (то есть тестировать изолированно).

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

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

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

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