2010-02-14 3 views
4

Элементы любого тестирования хранилища/хранилища DAO - это запросы. Чтобы убедиться, что эти запросы верны, вы должны запустить его в фактической базе данных .Следует ли тестировать DAO (aka Repositories)?

Учитывая приведенные выше факты, имеет смысл выполнить единичные испытания DAOs/Respositories? Если да, то какие лучшие практики?

ответ

2

I модульное тестирование моих репозиториев довольно религиозно. Наверное, это, наверное, мои самые важные модульные тесты.

Это может быть довольно безболезненно, если вы используете ORM, такой как NHibernate.

Я использую базовое устройство, которое содержит настройку и отключение для создания в памяти sqlite db, а затем уничтожает его в конце каждого теста. Это удивительно быстро. Тогда для каждого репозитория у меня есть настройка, которая вводит мои тестовые данные для моих тестов. Это очень самодостаточно и улавливает все логические проблемы в моих запросах репозитория.

Единственное, что он не улавливает, это конкретные случаи поставщика услуг, но при использовании чего-то вроде NHibernate это, как правило, исключение.

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

Если доступны «экспресс» выпуски программного обеспечения базы данных, которые вы тестируете, я по-прежнему рекомендую, чтобы база данных была настроена локально «на лету», чтобы вы всегда гарантировали, что база данных, на которую проходят ваши тесты, имеет схему, которую они ожидают. Однако я бы изменил одну часть настроек и разрывов этого. Я бы только установил и отменил базу данных в начале и в конце всего теста. Затем каждая установка и отключение теста должны начинать транзакцию, а затем откатывать ее в конце. Это быстрый способ держать вещи раздельными между испытаниями. Последнее, что вы хотите, - это данные одного теста, чтобы повлиять на другой тест.

+0

Я использую Hibernate (Java), но мое приложение использует кучу родных SQL для использования нескольких инструкций Oracle, которые недоступны на других серверах. –

+0

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

2

Да - с базой данных в оперативной памяти (например HSQLDBL)

This blogpost of mine обсуждает подобную тему.

Обновление: о вашем комментарии - в сообщении, которое я связал с ORM, используется, чтобы убедиться, что несоответствия базы данных не являются проблемой. Работа с необработанным SQL - это не совсем хорошая идея (при работе с ООП). Затем вы всегда можете использовать ANSI SQL как можно скорее (и не тестировать несоответствия).

Другим вариантом может быть посвящает базы данных тестирования сервера + в интеграции двигатель непрерывного и запускать тесты только в двигателе (так что несколько тестов расстрелов из нескольких машин не связываться друг с другом)

+0

Поскольку большинство серверов РСУБД отличаются друг от друга тем, как они обрабатывают SQL, как мы можем быть уверены, что он будет работать на нашем производственном сервере только потому, что он работал с БД в памяти и наоборот? –

+0

, если вы хотите, чтобы все работало, вам также необходимо выполнить интеграционный тест. –

+0

Проголосовали за полезный ответ.Однако использование ANSI SQL не является вариантом. :( –

0

Да, требуется единичные тесты для слоя DAO. В java существуют такие фреймворки, как dbUnit. Сохранение отдельной схемы/экземпляра в базе данных с некоторыми данными начальной загрузки поможет вам выполнить правильное модульное тестирование, и вы можете охватить большинство сценариев.

Смежные вопросы