Должны ли DAO (aka Repositories) быть модульными? - PullRequest
4 голосов
/ 14 февраля 2010

Частями любого репозитория / реализации DAO, которые стоит протестировать, являются запросы. Чтобы убедиться, что эти запросы верны, вам нужно запустить его в актуальная база данных.

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

Ответы [ 3 ]

2 голосов
/ 14 февраля 2010

Я тестирую свои хранилища довольно религиозно. Это, наверное, мои самые важные юнит-тесты.

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

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

Единственное, что он не улавливает, это специфичные для db-провайдера случаи, но при использовании чего-то вроде NHibernate обычно это исключение.

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

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

2 голосов
/ 14 февраля 2010

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

Этот мой блог обсуждает похожую тему.

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

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

0 голосов
/ 14 февраля 2010

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

...