Rom*_*las 32 java unit-testing h2 hsqldb in-memory-database
我有一个应用程序,其中许多"单元"测试在执行期间使用与Oracle数据库的真实连接.
可以想象,这些测试需要花费太多时间来执行,因为它们需要初始化一些Spring上下文,并与Oracle实例进行通信.除此之外,我们还必须管理复杂的机制,例如事务,以避免在测试执行后修改数据库(即使我们使用Spring中的有用类AbstractAnnotationAwareTransactionalTests).
所以我的想法是逐步用内存数据库替换这个Oracle测试实例.我会用hsqldb或者更好h2.
我的问题是要知道这样做的最佳方法是什么.我主要关心的是构建内存数据库结构和插入参考数据.
当然,我可以使用像SQL Developeror 这样的工具从Oracle中提取数据库结构TOAD,然后修改这些脚本以使它们适应hsqldb或h2使用它们.但我不认为这是更好的方法.
事实上,我已经在另一个项目上使用了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少得多的内存.
最新的 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 类型兼容性的其他方面。
[更新:] 10 月 4 日发布的快照将大多数 Oracle 特定类型转换为 ANSI SQL 类型。HSQLDB 2.0 也以与 Oracle 相同的方式支持 ANSI SQL INTERVAL 类型和日期/时间戳算法。