Создайте структуру базы данных в памяти из экземпляра Oracle
-
05-10-2019 - |
Вопрос
У меня есть приложение, где многие "единица измерения" Испытания используют реальное соединение с базой данных Oracle во время их выполнения.
Как вы можете себе представить, эти тесты занимают слишком много времени для выполнения, так как им нужно инициализировать некоторые пружинные контексты, и обмениваться экземпляром Oracle. В дополнение к этому, мы должны управлять сложными механизмами, такими как транзакции, чтобы избежать модификаций базы данных после выполнения теста (даже если мы используем полезные классы от пружины, как 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, весна 2.5, Oracle 10.g, Maven 2
Редактировать
Некоторая информация о моих модульных тестах:
В приложении, где я использовал hsqldb
, У меня были следующие тесты: - Некоторые «основные» тесты единиц, которые не имеют ничего общего с БД. - Для тестирования дао я использовал hsqldb
Для выполнения манипуляций базы данных, таких как CRUD. - Тогда, на сервисном слое, я использовал Mockito
Чтобы издеваться над своими объектами DAO, чтобы сосредоточиться на тесте обслуживания, а не в целом приложения (т. Е. Сервис + DAO + DB).
В моей нынешнем приложении у нас худший сценарий: тесты на слое DAO нужно запустить соединение Oracle. Слой сервисов делает нет Используйте (пока) любые издевательства объектов для моделирования DAO. Так что тесты услуг также Нужен соединение Oracle.
Я осознаю, что издевательства и база данных в памяти два разделяют точки, и я рассмотрю их как можно скорее. Тем не менее, мой первый шаг пытаться Чтобы удалить соединение Oracle в базе данных в памяти, а затем я буду использовать свой Mockito
знания для улучшения тестов.
Обратите внимание, что я также хочу отделить модульные тесты от тестов интеграции. Последний понадобится доступ к базе данных Oracle, выполнить «реальные» тесты, но моя главная проблема (и это цель этого вопроса) состоит в том, что почти все мои модульные тесты не работают в изоляции сегодня.
Решение
Используйте базу данных в памяти / Java для тестирования. Это обеспечит тесты ближе к реальному миру, чем если вы пытаетесь «абстрактный» база данных в вашем тесте. Вероятно, такие тесты также легче писать и поддерживать. С другой стороны, то, что вы, вероятно, хотите «абстрагировать» в ваших тестах, является интернет-интерфейсом, потому что тестирование UI обычно трудно автоматизировать.
Синтаксис Oracle, который вы разместили хорошо, работает хорошо с базой данных H2 (я только что тестировал ее), поэтому кажется, что H2 поддерживает синтаксис Oracle лучше, чем HSQLDB. Отказ от ответственности: Я один из авторов H2. Если что-то не работает, пожалуйста, опубликуйте его в списке рассылки H2.
В любом случае, вы должны иметь операторы DDL для базы данных в вашей системе управления версиями. Вы можете использовать эти скрипты для тестирования. Возможно, вам также нужно поддержать несколько версий схемы - в этом случае вы можете написать сценарии обновления версий (ALTER Table ...). С базой данных Java вы можете проверить их.
Кстати, вам не обязательно нужно использовать режим в памяти при использовании H2 или HSQLDB. Оба база данных быстро даже если вы сохраняете данные. И их легко установить (просто файл JAR) и нужно намного меньше памяти, чем Oracle.
Другие советы
Последние HSQLDB 2.0.1 поддерживает синтаксис Oracle для двойного, роупана, NementVal и Currval через флаг со совместимости синтаксиса, sql.syntax_ora = true. Таким же образом, конкатенация строки с нулевой строкой и ограничениями на NULL в уникальных ограничениях обрабатываются другими флагами. Наиболее функции Oracle, такие как to_char, to_date, nvl и т. Д., уже встроены.
На данный момент, чтобы использовать простые типы Oracle, такие как номер, вы можете использовать определение типа:
Создать номер типа как числовой
Следующий снимок позволит номеру (n) и другие аспекты совместимости типа Oracle, когда флаг установлен.
Скачать с http://hsqldb.org/support/
Обновление:] Снимок, выпущенный на 4 октября, переводит самые конкретные типы Oracle в типы ANSI SQL. HSQLDB 2.0 также поддерживает арифметический арифметический арифметический арифметический арифметический арифметический арифметический арифметический арифметический момент.
Для чего у вас тесты за единицу? Если они проверяют правильную работу DDL и сохраненные процедуры, вы должны написать тесты «ближе» в Oracle: либо без кода Java, либо без весной, так и для других приятных веб-интерфейсов вообще сосредоточиться на DB.
Если вы хотите проверить логику приложений, реализованную в Java и Spring, вы можете использовать MOCK Objects / Connection Connection, чтобы сделать ваши тесты независимы от базы данных.
Если вы хотите проверить работу в целом (что относится к модульной принципу разработки и тестирования), вы можете виртуализировать вашу базу данных и тестировать на этом случае без риска выполнения некоторых неприятных необратимых модификаций.
До тех пор, пока ваши тесты убираются после себя (как вы уже кажется, знаете, как настроить), нет ничего плохого в запущенных тестах против реального экземпляра базы данных. На самом деле это подход, который я обычно предпочитаю, потому что вы будете тестировать что-то как можно ближе к производству.
Несовместимости кажутся маленькими, но действительно в конце концов, не так долго. В хорошем случае вы можете уйти с некоторым неприятным переводом SQL / обширным издевательством. В плохих случаях части системы будут просто невозможны тестировать, что, я думаю, является неприемлемым риском для критических критических систем.