У меня есть приложение, в котором многие "юнит" тесты используют реальное соединение с базой данных 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, чтобы сосредоточиться на тесте службы, а не на целых приложениях (т. Е. Service + dao + DB).
В моем текущем приложении у нас худший сценарий: для тестирования уровня DAO требуется соединение с Oracle. Уровень служб не использует (пока) любые фиктивные объекты для имитации DAO. Поэтому сервисным тестам также требуется соединение с Oracle.
Мне известно, что макеты и база данных в памяти - это две отдельные точки, и я рассмотрю их как можно скорее. Тем не менее, мой первый шаг - попытаться удалить соединение Oracle с помощью базы данных в памяти, а затем я буду использовать свои Mockito
знания для улучшения тестов.
Обратите внимание, что я также хочу отделить модульные тесты от интеграционных тестов. Последнему понадобится доступ к базе данных Oracle, чтобы выполнять «настоящие» тесты, но моя главная проблема (и это цель этого вопроса) заключается в том, что почти все мои модульные тесты сегодня не выполняются изолированно.