У меня есть приложение, в котором многие "единичные" тесты используют реальное соединение с базой данных Oracle во время их выполнения.
Как вы можете себе представить, эти тесты занимают слишком много времени, чтобы их выполнить, поскольку они должны инициализировать некоторые контексты Spring и обмениваться данными с экземпляром Oracle. В дополнение к этому мы должны управлять сложными механизмами, такими как транзакции, чтобы избежать изменений в базе данных после выполнения теста (даже если мы используем полезные классы из Spring, например AbstractAnnotationAwareTransactionalTests
).
Итак, моя идея - постепенно заменить этот тестовый экземпляр Oracle на базу данных в памяти. Я буду использовать hsqldb
или, может быть, лучше h2
.
Мой вопрос - знать, что лучше всего подходит для этого. Моя основная проблема связана с построением структуры базы данных в памяти и введением справочных данных.
Конечно, я могу извлечь структуру базы данных из Oracle, используя некоторые инструменты, такие как SQL Developer
или TOAD
, а затем модифицировать эти скрипты, чтобы адаптировать их к языку hsqldb
или h2
. Но я не думаю, что лучший подход.
Фактически, я уже делал это в другом проекте, используя hsqldb
, но я написал все скрипты вручную для создания таблиц. К счастью, у меня было всего несколько таблиц для создания. Моя основная проблема на этом этапе состояла в том, чтобы "перевести" сценарии Oracle, используемые для создания таблиц на языке hsqldb
.
Например, таблица, созданная в Oracle, используя следующую команду sql:
CREATE TABLE FOOBAR (
SOME_ID NUMBER,
SOME_DATE DATE, -- Add primary key constraint
SOME_STATUS NUMBER,
SOME_FLAG NUMBER(1) DEFAULT 0 NOT NULL);
необходимо было "перевести" для hsqldb
в:
CREATE TABLE FOOBAR (
SOME_ID NUMERIC,
SOME_DATE TIMESTAMP PRIMARY KEY,
SOME_STATUS NUMERIC,
SOME_FLAG INTEGER DEFAULT 0 NOT NULL);
В моем текущем проекте слишком много таблиц для этого вручную...
Итак, мои вопросы:
- Каковы советы, которые вы можете мне дать, чтобы достичь этого?
- Предоставляют ли
h2
илиhsqldb
некоторые инструменты для генерации своих скриптов из соединения Oracle?
Техническая информация
Java 1.6, Spring 2.5, Oracle 10.g, Maven 2
Изменить
Некоторая информация о моих модульных тестах:
В приложении, где я использовал hsqldb
, у меня были следующие тесты:
- Некоторые "базовые" модульные тесты, которые не имеют ничего общего с БД.
- Для тестирования DAO я использовал hsqldb
для выполнения манипуляций с базами данных, таких как CRUD.
- Тогда на уровне обслуживания я использовал Mockito
, чтобы издеваться над моими объектами DAO, чтобы сосредоточиться на тесте обслуживания, а не на всех приложениях (например, службе + дао + DB).
В моем текущем приложении у нас самый худший сценарий: для тестирования уровня DAO необходимо запустить соединение Oracle. Уровень сервиса не использует (пока) любые макетные объекты для имитации DAO. Таким образом, для тестирования служб также требуется соединение Oracle.
Я знаю, что mocks и база данных в памяти - две разделяющие точки, и я буду обращаться к ним как можно скорее. Тем не менее, мой первый шаг - попытаться удалить соединение Oracle с помощью базы данных в памяти, а затем я буду использовать свои знания Mockito
для улучшения тестов.
Обратите внимание, что я также хочу отделить модульные тесты от тестов интеграции. Последнему нужен доступ к базе данных Oracle для выполнения "реальных" тестов, но моя главная проблема (и это цель этого вопроса) состоит в том, что почти все мои модульные тесты не выполняются изолированно сегодня.