Spring JPA: тестирование уровня DAO с несколькими базами данных в среде CI - PullRequest
3 голосов
/ 21 февраля 2012

Мы работаем над проектом, в котором требования к базе данных не ясны. Итак, мы создаем независимое от базы данных приложение.

См. Мой предыдущий вопрос здесь: Приложение для базы данных

Теперь я хочу протестировать мое приложение Spring DAO с несколькими базами данных. Я написал несколько тестовых случаев, используя TestNG и DBUnit.

Когда я запускаю эти тесты в среде CI, я хочу, чтобы они тестировали приложение на всех настроенных базах данных. Я установил базы данных на «тестовом сервере».

например. Я хочу что-то вроде этого:

for ( each database configured ) {
 run each dao test
}

Не уверен, что это лучший способ сделать это? И помощь приветствуется.

Спасибо, Adi

Ответы [ 3 ]

2 голосов
/ 21 февраля 2012
  1. Если вы хотите быть независимым от базы данных, вам нужно протестировать каждую систему баз данных, которую вы хотите поддерживать. Есть очень тонкие различия, которые просачиваются через Hibernate.

  2. То, что я делал в прошлом, состояло в том, чтобы заставить тест извлекать конфигурацию их базы данных через некоторое свойство системы. Обычно используется hibernate_.property вместо hibernate.property по умолчанию. Затем настройте CI Jobs, которые задают для свойства разные значения и предоставляют по одному hibernate_xxx.property для каждой базы данных для проверки. Я сделал это, используя JUnit Rules, чтобы логика была в одном месте. Не знаю подходящий инструмент для TestNG

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

  4. Мне также не нравится dbunit, потому что кажется, что поддержка тестовых данных довольно болезненна. Я предпочитаю в большинстве случаев ручной DSL. Посмотрите на некоторые статьи, которые я написал об этом:

http://blog.schauderhaft.de/2011/03/13/testing-databases-with-junit-and-hibernate-part-1-one-to-rule-them/

http://blog.schauderhaft.de/2011/03/20/testing-databases-with-junit-and-hibernate-part-2-the-mother-of-all-things/

http://blog.schauderhaft.de/2011/03/27/testing-databases-with-junit-and-hibernate-part-3-cleaning-up-and-further-ideas/

2 голосов
/ 21 февраля 2012

Если вы создаете приложение, независимое от базы данных, и не используете какие-либо из присущих конкретному поставщику баз данных функций, тогда объем ваших тестов должен состоять в том, чтобы протестировать настройку, манипулирование и доступ к данным через DAOобъектов и меньше с тестированием фактической базы данных.В Hibernate 3.5 есть диалекты, доступные как для Oracle 11g, так и для DB2, поэтому, если вы писали тестовые примеры, которые тестировали интеграцию приложения, независимого от базы данных, с конкретным поставщиком базы данных, то на самом деле вы проверяете, как работают диалекты hibernate, как они говорятони делают (что, я уверен, было покрыто тестовыми примерами в проекте hibernate).

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

Теперь все, что сказано, и DB2 и Oracle иметь очень хорошую документацию, связанную с настройкой.Действительно, у них обоих есть "волшебники", чтобы сделать это.Если вы по-прежнему считаете целесообразным тестировать добавление данных в базу данных и извлекать их из физической базы данных, не находящейся в памяти, я бы порекомендовал настроить среду «тестовой базы данных» и указать источник данных на нее во время непрерывной интеграции.тесты.Если вы используете Hudson или Jenkins для CI, вы можете настроить его для запуска сценария после завершения сборки, который будет обрезать таблицы базы данных, чтобы следующий цикл тестов работал с чистого листа.

РЕДАКТИРОВАТЬ :

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

Надеюсь, это поможет!

1 голос
/ 21 февраля 2012

Unit 4.9 имеет новую особенность: TestRule

Вы должны быть в состоянии написать правило, которое повторяет тест для разных баз данных.

Возникает вопрос переполнения стека: Как немедленно повторно запустить неудачные тесты JUnit? Это немного другой вопрос, но решение должно быть тем же.

...