2010-08-09 56 views
15
支持快速的Java集成测试的内存数据库可靠的,如果我使用的内存数据库,而不是PostgreSQL的

我的集成测试将运行得更快。我使用JPA(Hibernate),而且我需要一个内存数据库,它可以很容易地切换到使用JPA,易于设置和可靠。它需要支持JPA和Hibernate(或者反之亦然),因为我不想采用我的数据访问代码进行测试。简单,在与JPA

什么数据库是最好的选择上面给出的要求?

回答

19

对于集成测试,我现在使用H2(来自HSQLDB的原作者),我比较喜欢HSQLDB。它是faster(我希望我的测试尽可能快),它有一些很好的功能,比如compatibility模式,开发团队响应速度很快(而HSQLDB几年前一直保持休眠状态直到最近)。

+0

基准测试用于持久数据存储,因为大部分开销是由于数据库中的磁盘/高速缓存策略所致,所以内存中的结果可能不同。 H2和HSQLDB的区别很大,但并不重要。我仍然选择基于易用性,最小配置,功能。兼容模式功能看起来非常有吸引力。谢谢! – topchef 2010-08-10 03:19:49

+0

@grigory:是的,你说得对。但即使使用持久模式,H2和HSQLDB实际上默认在内存中运行,并推迟写入磁盘(以Durability的价格)。所以数据仍然很有趣。 – 2010-08-10 09:55:00

4

我一直在使用HSQLDBin-memory来集成测试Java中的JPA/Hibernate持久性。启动非常快,不需要任何特殊设置。

到目前为止使用HSQLDB和Hibernate我见过的唯一问题是在批量大小需要被设置为0,这样做,但是,很可能只是已涉及到旧版本。我会挖掘一下,看看我能否找到这个问题的细节。

Derby supports an in-memory mode这些天,这已不再是试验。

+0

为内存数据库我想有最简单的和最侵入性(希望零自定义(除了persistence.xml中)溶液)给出的同样的支持。谢谢! – topchef 2010-08-09 22:07:16

+0

对HSQLDB的另一次投票,特别是自V2发布以来,v1.x将不支持JDBC支持的一些当前结构,例如返回自动生成的键值,但v2却支持。 – mezmo 2010-08-10 21:58:16

2

我使用德比。首先,每单元测试的代码行数少于3行,因为在测试之后不需要关机。但是,您需要使用可以删除和创建诸如EclipseLink之类的表的JPA实现。

德比也可以从文件中初始化一个新的内存数据库,所以你可以有一个参考数据库,并恢复它在任何时候。

尽管对于单元测试,我更喜欢在我的单元测试的@Before逻辑中创建我的对象,我发现它更容易,尤其是使用JPA,因为它允许我灵活地进行重构,而不必担心底层数据库结构,其他像DBunit这样的工具实际上依赖于静态结构,重构意味着手动更改DBunit XML,而不是依赖于Eclipse的重构功能。