代码之家  ›  专栏  ›  技术社区  ›  Romain Linsolas

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

  •  32
  • Romain Linsolas  · 技术社区  · 14 年前

    我有一份申请 测试在执行期间使用到Oracle数据库的真实连接。

    AbstractAnnotationAwareTransactionalTests ).

    所以我的想法是用内存数据库逐步替换这个Oracle测试实例。我将使用 hsqldb h2 .

    我的问题是知道做这件事的最佳方法是什么。我主要关心的是内存数据库结构的构建和引用数据的插入。

    当然,我可以使用诸如 SQL Developer TOAD ,然后修改这些脚本以使其适应 氢气 语言。但我不认为这是更好的方法。


    hsqldb公司 ,但我已经手动编写了所有创建表的脚本。幸运的是,我只需要创建几个表。在这一步中,我的主要问题是将用于创建表的Oracle脚本“翻译”到 hsqldb公司 语言。

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

    需要“翻译”为 收件人:

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

    在我当前的项目中,有太多的表无法手动执行此操作。。。


    • 氢气 hsqldb公司 提供一些工具从Oracle连接生成脚本?

    技术信息


    编辑

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

    在我使用的应用程序中 hsqldb公司 ,我做了以下测试: -一些“基本”单元测试,与DB无关。 hsqldb公司 -然后,在服务层,我使用 Mockito

    在我当前的应用程序中,我们遇到了最坏的情况:DAO层测试需要运行Oracle连接。服务层没有 使用任何模拟对象来模拟DAO。So服务测试 需要Oracle连接。

    我知道mock和内存数据库是两个独立的点,我将尽快解决它们。然而,我的第一步是 尝试 莫基托 增强测试的知识。

    注意,我还想将单元测试与集成测试分开。后者将需要访问Oracle数据库,以执行“真正的”测试,但我主要关心的是(这就是这个问题的目的)现在我的几乎所有单元测试都不是孤立运行的。

    4 回复  |  直到 14 年前
        1
  •  19
  •   vivekmore Shiv    8 年前

    使用内存/Java数据库进行测试。这将确保测试更接近真实世界,而不是试图在测试中“抽象”掉数据库。可能这样的测试也更容易编写和维护。另一方面,您可能希望在测试中“抽象”掉的是UI,因为UI测试通常很难自动化。

    您发布的Oracle语法与H2数据库配合得很好(我刚刚测试过),因此H2似乎比HSQLDB更支持Oracle语法。免责声明:我是H2的作者之一。如果有些东西不起作用,请把它贴在H2邮件列表上。

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

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

        2
  •  5
  •   fredt    14 年前

    最新的hsqldb2.0.1通过语法兼容性标志支持DUAL、ROWNUM、NEXTVAL和CURRVAL的ORACLE语法,sql.syntax\u ora=真. 以相同的方式,字符串与空字符串的串联以及唯一约束中对空的限制也用其他标志处理。大多数ORACLE函数,如TO\u CHAR、TO\u DATE、NVL等都已经内置。

    将类型编号创建为数字

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

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

    [更新:]10月4日发布的快照将大多数特定于Oracle的类型转换为ANSI SQL类型。hsqldb2.0还支持与Oracle相同的ansisql间隔类型和日期/时间戳算法。

        3
  •  2
  •   rics    14 年前

    你的单元测试是为了什么? 如果他们测试ddl和存储过程是否正常工作,那么您应该编写与Oracle“更接近”的测试:要么不使用Java代码,要么根本不使用Spring和其他优秀的web接口,将重点放在db上。

    如果您想作为一个整体来测试工作(这与模块化开发和测试原则背道而驰),那么您可以虚拟化您的数据库并在该实例上进行测试,而不必冒做一些不可逆的修改的风险。

        4
  •  1
  •   oksayt    13 年前

    只要您的测试在完成后进行了清理(您似乎已经知道如何设置),那么针对真实的数据库实例运行测试并没有什么问题。事实上,这是我通常喜欢的方法,因为您将测试尽可能接近生产的东西。