我有一个应用程序,在这个应用程序中,许多“单元”测试在执行过程中使用与Oracle数据库的真正连接。
可以想象,这些测试需要花费太多的时间来执行,因为它们需要初始化一些Spring上下文,并与Oracle实例通信。此外,我们还必须管理复杂的机制,例如事务,以避免在测试执行后对数据库进行修改(即使我们使用了来自Spring的有用类,比如AbstractAnnotationAwareTransactionalTests)。
因此,我的想法是逐步用内存中的数据库替换这个Oracle测试实例。我将使用hsqldb或者更好的h2。
我的问题是知道什么是最好的方法来做到这一点。我主要关注的是内存数据库结构的构建和引用数据的插入。
当然,我可以使用一些工具(如SQL Developer或TOAD )从Oracle提取数据库结构,然后修改这些脚本以使它们适应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);需要将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、Spring 2.5、Oracle 10.g、Maven 2
编辑
关于我的单元测试的一些信息:
在我使用hsqldb的应用程序中,我进行了以下测试:-一些“基本”单元测试,这些测试与DB无关。-对于DAO测试,我使用hsqldb来执行数据库操作,例如CRUD。然后,在服务层,我使用Mockito来模拟DAO对象,以便集中精力于服务测试,而不是整个应用程序(即服务+ dao + DB)。
在我当前的应用程序中,我们有一个最糟糕的场景: DAO层测试需要运行一个Oracle连接。服务层做的是,而不是使用任何模拟对象来模拟DAO。因此,服务测试还需要一个Oracle连接。
我知道模拟和内存中的数据库是两个分离点,我将尽快解决它们。然而,我的第一步是尝试通过内存中的数据库删除Oracle连接,然后我将使用我的Mockito知识来增强测试。
请注意,我还希望将单元测试与集成测试分开。后者将需要访问Oracle数据库,以执行“真正的”测试,但我的主要关切(这就是这个问题的目的)是,今天我的几乎所有单元测试都不是孤立地运行的。
发布于 2010-09-24 07:51:46
使用内存中/ Java数据库进行测试。这将确保测试更接近真实世界,而不是试图“抽象”测试中的数据库。也许这样的测试也更容易编写和维护。另一方面,您可能想在测试中“抽象化”的是UI,因为UI测试通常很难自动化。
您发布的Oracle语法与H2数据库工作得很好(我刚刚对它进行了测试),因此H2似乎比HSQLDB更支持Oracle语法。声明:我是H2的作者之一。如果有些东西不起作用,请将其张贴在H2邮件列表中。
无论如何,您应该在版本控制系统中拥有数据库的DDL语句。您也可以使用这些脚本进行测试。可能还需要支持多个模式版本--在这种情况下,您可以编写版本更新脚本(alter .)。使用Java数据库,您也可以测试这些。
顺便说一下,在使用H2或HSQLDB时,您不一定需要使用内存中的模式。即使持久化数据,这两个数据库也是快速的。而且它们很容易安装(只是一个jar文件),并且需要比Oracle少得多的内存。
发布于 2010-09-24 10:29:29
最新的HSQLDB2.0.1通过语法兼容性标志sql.syntax_ora=true支持DUAL、ROWNUM、NEXTVAL和CURRVAL的ORACLE语法。以同样的方式,使用其他标志来处理带有空字符串的字符串的级联以及在唯一约束中对NULL的限制。甲骨文的大部分功能,如TO_CHAR、TO_DATE、NVL等,都已经内置。
目前,要使用简单的ORACLE类型(如NUMBER ),可以使用类型定义:
将类型编号创建为数字
下一次快照将允许在设置标志时使用NUMBER(N)和ORACLE类型兼容性的其他方面。
从http://hsqldb.org/support/下载
更新:10月4日发布的快照将大多数Oracle特定类型转换为ANSI SQL类型。HSQLDB2.0还与Oracle一样支持ANSI SQL间隔类型和日期/时间戳算法。
发布于 2010-09-24 07:12:07
你的单元测试是为了什么?如果它们测试DDL和存储过程的正确工作方式,那么您应该将测试写得“更接近”Oracle:要么没有Java代码,要么没有Spring和其他很好的web接口,完全集中在数据库上。
如果您想测试用Java和Spring实现的应用程序逻辑,那么可以使用模拟对象/数据库连接使测试独立于数据库。
如果您想将工作作为一个整体进行测试(这违背了模块化开发和测试原则),那么您可以虚拟化您的数据库并在该实例上进行测试,而不需要进行一些令人讨厌的不可逆转的修改。
https://stackoverflow.com/questions/3784843
复制相似问题