java – 在测试数据库操作时将数据库重置为已知状态的最佳方法是什么?

我正在使用JUnit为测试数据库上运行的某些方法编写测试.我需要在每次@Test之后将数据库重置为原始状态.我想知道最好的方法是什么.EntityManager中有一些方法吗?或者我应该手动删除所有内容还是使用SQL语句?删除并...

我正在使用JUnit为测试数据库上运行的某些方法编写测试.

我需要在每次@Test之后将数据库重置为原始状态.我想知道最好的方法是什么.

EntityManager中有一些方法吗?或者我应该手动删除所有内容还是使用SQL语句?删除并重新创建整个数据库会更好吗?

解决方法:

我过去使用的一种技术是通过简单地从标准的“测试数据库”复制数据库并在测试中使用它来从头开始重新创建数据库.

这项技术适用于:

>你的架构没有太大变化(否则很难保持一致)
>你正在使用像hibernate这样合理的数据库独立性.

这具有以下优点:

>它适用于管理自己的事务的代码.我的集成测试在junit下运行.例如,当我测试批处理时,我从junit调用Batch.main(),并测试之前和之后的内容.我不想更改被测代码中的事务处理.
>速度相当快.如果文件足够小,那么速度不是问题.
>它使ci服务器上的运行集成测试变得简单.使用代码签入数据库文件.无需启动和运行真正的数据库.

以下缺点:

>测试数据库文件需要与真实数据库一起维护.如果你一直在添加列,这可能会很痛苦.
>有管理jdbc网址的代码,因为它们会针对每个测试进行更改.

我使用Oracle作为生产/集成数据库,hsqldb作为测试数据库.它工作得很好. hsqldb是一个单独的文件,因此很容易复制.

因此,在@Before中,使用hsqldb,将文件复制到target / it / database / name_of_test.script等位置.这在测试中被选中.

在@After中,你删除文件(或者只是留下它,谁在乎).使用hsqldb,您还需要执行SHUTDOWN,以便删除该文件.

您还可以使用从ExternalResource扩展的@Rule,这是管理资源的更好方法.

另一个提示是,如果您正在使用maven或类似的东西,您可以在目标中创建数据库.我使用target / it.这样,当我这样做并清除mvn时,数据库的副本就会被删除.对于我的批次,我实际上将所有其他属性文件等复制到此目录中,因此我也不会在奇怪的地方出现任何文件.

本文标题为:java – 在测试数据库操作时将数据库重置为已知状态的最佳方法是什么?

基础教程推荐