我有一个应用程序,在这个应用程序中,许多“单元”测试在执行过程中使用与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:12:07
你的单元测试是为了什么?如果它们测试DDL和存储过程的正确工作方式,那么您应该将测试写得“更接近”Oracle:要么没有Java代码,要么没有Spring和其他很好的web接口,完全集中在数据库上。
如果您想测试用Java和Spring实现的应用程序逻辑,那么可以使用模拟对象/数据库连接使测试独立于数据库。
如果您想将工作作为一个整体进行测试(这违背了模块化开发和测试原则),那么您可以虚拟化您的数据库并在该实例上进行测试,而不需要进行一些令人讨厌的不可逆转的修改。
https://stackoverflow.com/questions/3784843
复制相似问题