Создайте структуру базы данных в памяти из экземпляра Oracle

StackOverflow https://stackoverflow.com/questions/3784843

Вопрос

У меня есть приложение, где многие "единица измерения" Испытания используют реальное соединение с базой данных 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 / обширным издевательством. В плохих случаях части системы будут просто невозможны тестировать, что, я думаю, является неприемлемым риском для критических критических систем.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top