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

问题描述 投票:2回答:3

我正在开发Web应用程序,并且我想使用Jetty / hsqldb进行一系列集成测试。因此,码头将旋转起来,Webdriver将单击一下,然后测试将完成,从而在数据库中留下一些垃圾。由于我想再进行1次测试,所以这是有问题的。

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

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

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

在我完成的所有研究中,我仅发现模糊且不可重现的提示,因此,不胜感激。

java hibernate integration-testing hsqldb
3个回答
0
投票

在我们的项目中,我们使用dbUnit以便将每个测试的数据加载到空数据库中。测试将启动一个事务,并在不提交事务的情况下清除需要保存的所有内容。测试运行后,我们检查延迟的约束和回滚。这样,数据库始终保持为空,并且测试不会相互影响(串行运行时)。

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

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

http://dbunit.sourceforge.net


0
投票

请考虑以下方法:

  • 将不同的数据库用于测试和real应用程序-例如Apache Derby数据库;
  • 仅在每次运行时为测试重新创建数据库。有关创建Derby模式的详细信息,请参见this文章;
  • 例如,使用一些将数据库状态保持为一系列变更集的工具-Liquibase。使用它,您可以在每次运行测试时删除数据库,liquibase会为您重新创建它。

0
投票

HSQLDB具有此用法的设置。

使用测试前的表和数据创建一个初始数据库。设置了hsqldb.files_readonly属性,这可以防止对数据库的更改持久化到文件中。

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

populating in memory hsqldb database from script

© www.soinside.com 2019 - 2024. All rights reserved.