以编程方式在集成测试之间重置Hibernate数据库

时间:2014-04-10 18:36:26

标签: java hibernate integration-testing hsqldb

我正在开发一个Web应用程序,我想用Jetty / hsqldb运行一系列集成测试。所以jetty会旋转,webdriver会点击一下然后测试就会完成,在数据库中留下一些垃圾。由于我想运行多于1次测试,这是有问题的。

在其他项目中,我们有一个按表以编程方式删除行的函数,但是这个项目的数据库很复杂,在这里工作是不可行的。

最佳解决方案是在每次测试之前保存可以加载到数据库的已知hsql状态。

另一种解决方案是删除并重新创建表格。

在我所做的所有研究中,我只发现了模糊的不可复制的提示,所以我们会非常感谢细节。

3 个答案:

答案 0 :(得分:0)

考虑以下方法:

  • 使用不同的数据库进行测试和真正的应用程序 - 例如Apache Derby数据库;
  • 仅在每次运行时为测试重新创建数据库。有关创建Derby架构的详细信息,请参阅this文章;
  • 使用一些将数据库状态维护为一系列更改集的工具 - 例如Liquibase。有了它,您可以在每次运行测试时删除数据库,liquibase将为您重新创建它。

答案 1 :(得分:0)

在我们的项目中,我们使用dbUnit将数据加载到每个测试的空数据库中。测试启动事务并刷新他们需要保存的任何内容而不提交事务。测试运行后,我们检查延迟约束和回滚。这样,数据库始终保持为空,测试不会相互影响(串行运行时)。

为了使用同一组testdata进行一系列测试的高性能执行,我们在插入测试数据后设置了一个保存点,然后我们只回退到该保存点而不是回滚所有内容。

总而言之,这是一项很多工作。无论如何,我们认为它为我们的项目带来了回报。

http://dbunit.sourceforge.net

答案 2 :(得分:0)

HSQLDB有此用法的设置。

使用前测试表和数据创建初始数据库。 hsqldb.files_readonly属性已设置,这可以防止对数据库的更改保留为文件。

通常使用此解决方案代替内存测试数据库。

populating in memory hsqldb database from script