我正在使用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 – 在测试数据库操作时将数据库重置为已知状态的最佳方法是什么?
基础教程推荐
- Mybatis动态SQL之where标签用法说明 2023-02-04
- java.sql.SQLException:连接关闭后不允许任何操作 2023-11-07
- IntelliJ IDEA中创建Java项目 2023-10-08
- Springboot详解如何整合使用Thymeleaf 2023-02-05
- Java将Object转换为数组的代码 2023-05-14
- Java lambda表达式与泛型整理总结 2023-03-22
- java – 将Protobuf消息保留到数据库 2023-11-07
- Springboot项目中内嵌sqlite数据库的配置流程 2023-01-13
- 深入Java万物之母Object类详情 2023-01-29
- java实现日历应用程序设计 2023-01-02