从Oracle实例创建内存数据库结构

Rom*_*las 32 java unit-testing h2 hsqldb in-memory-database

我有一个应用程序,其中许多"单元"测试在执行期间使用与Oracle数据库的真实连接.

可以想象,这些测试需要花费太多时间来执行,因为它们需要初始化一些Spring上下文,并与Oracle实例进行通信.除此之外,我们还必须管理复杂的机制,例如事务,以避免在测试执行后修改数据库(即使我们使用Spring中的有用类AbstractAnnotationAwareTransactionalTests).

所以我的想法是逐步用内存数据库替换这个Oracle测试实例.我会用hsqldb或者更好h2.

我的问题是要知道这样做的最佳方法是什么.我主要关心的是构建内存数据库结构和插入参考数据.

当然,我可以使用像SQL Developeror 这样的工具从Oracle中提取数据库结构TOAD,然后修改这些脚本以使它们适应hsqldbh2使用它们.但我不认为这是更好的方法.


事实上,我已经在另一个项目上使用了hsqldb,但是我已经手动编写了所有脚本来创建表.幸运的是,我只创建了几张桌子.我在此步骤中的主要问题是将用于创建表的Oracle脚本"转换"为该hsqldb语言.

例如,使用以下sql命令在Oracle中创建的表:

CREATE TABLE FOOBAR (
    SOME_ID NUMBER,
    SOME_DATE DATE, -- Add primary key constraint
    SOME_STATUS NUMBER,
    SOME_FLAG NUMBER(1) DEFAULT 0 NOT NULL);
Run Code Online (Sandbox Code Playgroud)

需要"翻译"为hsqldb:

CREATE TABLE FOOBAR (
    SOME_ID NUMERIC,
    SOME_DATE TIMESTAMP PRIMARY KEY,
    SOME_STATUS NUMERIC,
    SOME_FLAG INTEGER DEFAULT 0 NOT NULL);
Run Code Online (Sandbox Code Playgroud)

在我当前的项目中,有太多表要手动执行...


所以我的问题:

  • 您可以给我什么建议来实现这一目标?
  • 是否h2还是hsqldb提供了一些工具来生成一个Oracle连接的脚本?

技术信息

Java 1.6,Spring 2.5,Oracle 10.g,Maven 2


编辑

有关我的单元测试的一些信息:

在我使用的应用程序中hsqldb,我进行了以下测试: - 一些"基本"单元测试,与DB无关.- 对于DAO测试,我曾经hsqldb执行数据库操作,例如CRUD.- 然后,在服务层,我曾经Mockito模拟我的DAO对象,以便专注于服务测试而不是整个应用程序(即service + dao + DB).

在我当前的应用程序中,我们遇到了最糟糕的情况:DAO层测试需要运行Oracle连接.服务层并没有使用(但)任何模拟对象来模拟DAO.因此,服务测试需要Oracle连接.

我知道模拟和内存数据库是两个分离点,我会尽快解决它们.但是,我的第一步是尝试通过内存数据库删除Oracle连接,然后我将使用我的Mockito知识来增强测试.

请注意,我还想将单元测试与集成测试分开.后者需要访问Oracle数据库,才能执行"真正的"测试,但我主要关注的问题(这就是这个问题的目的)是几乎所有的单元测试都不是今天孤立运行的.

Tho*_*ler 19

使用内存/ Java数据库进行测试.这将确保测试比您在测试中"抽象"数据库时更接近现实世界.可能这样的测试也更容易编写和维护.另一方面,您可能希望在测试中"抽象"的是UI,因为UI测试通常难以自动化.

您发布的Oracle语法适用于H2数据库(我刚测试过),因此H2似乎比HSQLDB更好地支持Oracle语法.免责声明:我是H2的作者之一.如果某些内容无效,请将其发布在H2邮件列表中.

无论如何,您应该在版本控制系统中拥有数据库的DDL语句.您也可以使用这些脚本进行测试.可能您还需要支持多个模式版本 - 在这种情况下,您可以编写版本更新脚本(alter table ...).使用Java数据库,您也可以测试它们.

顺便说一句,在使用H2或HSQLDB时,您不一定需要使用内存模式.即使您持久保存数据,这两个数据库也都很快.而且它们易于安装(只是一个jar文件),并且需要比Oracle少得多的内存.

  • 鉴于DAO代码似乎与Oracle紧密耦合,并且DAO无法被抽象出来,这似乎是最好的方法 - 尽管DAO代码希望不依赖于任何Oracle特性.最好尽快抽出DAO ...... (2认同)

fre*_*edt 6

最新的 HSQLDB 2.0.1 通过语法兼容性标志 sql.syntax_ora=true 支持 DUAL、ROWNUM、NEXTVAL 和 CURRVAL 的 ORACLE 语法。以同样的方式,字符串与 NULL 字符串的连接以及 UNIQUE 约束中对 NULL 的限制是用其他标志处理的。大多数 ORACLE 函数,例如 TO_CHAR、TO_DATE、NVL 等,都已经内置。

目前,要使用简单的 ORACLE 类型(例如 NUMBER),您可以使用类型定义:

将类型编号创建为数字

下一个快照将在设置标志时允许 NUMBER(N) 和 ORACLE 类型兼容性的其他方面。

http://hsqldb.org/support/下载

[更新:] 10 月 4 日发布的快照将大多数 Oracle 特定类型转换为 ANSI SQL 类型。HSQLDB 2.0 也以与 Oracle 相同的方式支持 ANSI SQL INTERVAL 类型和日期/时间戳算法。