【问题标题】:How to rollback data.sql script in integration tests?如何在集成测试中回滚 data.sql 脚本?
【发布时间】:2023-02-08 14:26:02
【问题描述】:

我遇到了这个问题:

对于集成测试,我们有一个已经填充数据的旧数据库。某些数据没有正确的值(例如,对于布尔列,也有空值)。现在,在创建一些集成测试时,这些测试由于数据没有正确的值而失败。

我认为在data.sql 文件中添加一些脚本来更正数据(例如UPDATE my_table SET my_column = 0 WHERE my_column IS NULL)是个好主意,但问题是此更新也会提交给数据库,因此数据已更改(现在没有更多的 null 值)。更改数据库数据不是一个选项,所以我想做的是在每个测试/类结束时对 data.sql 文件进行某种回滚。你能请adivse吗?

版本为Spring boot 2.0.7.RELEASE,测试依赖为spring-boot-starter-test,测试标注为@SpringBootTest,数据库为Oracle


应用程序.yml:
spring:
  datasource:
    driver-class-name: oracle.jdbc.OracleDriver
    url: ${URL}
    username: ${USERNAME}
    password: ${PASSWORD}
    continue-on-error: true

【问题讨论】:

  • 我建议改用测试容器,一个数据库容器,每次执行测试时都会在 docker 中运行,一旦测试完成容器关闭,就会创建类似于生产中的模式。
  • 我还建议不要为此依赖回滚。使用新模式,您可以每次写入并丢弃或截断并重​​新启动。

标签: java oracle spring-boot spring-data spring-boot-test


【解决方案1】:

您可以使用 Oracle 的 flashback table 功能回滚自 data.sql 运行以来发生的所有 DML 更改。我不确定 Spring Boot 测试是如何工作的,但我假设有一些方法可以调用可以调用以下 Oracle 命令的前后操作。

首先,您可能需要在相关表上启用行移动。每个表只需要执行一次此步骤,并且无法撤消。 (但这种变化也非常无害。如果我没记错的话,唯一的缺点是元数据空间的增加非常小。)

alter table my_table1 enable row movement;
alter table my_table2 enable row movement;

在测试开始之前,创建一个唯一命名的还原点,用于记录要回滚到的确切系统更改编号。

create restore point restore_point_1;

运行data.sql 和所有其他测试更改。

测试完成后,运行 FLASHBACK TABLE 命令,将所有相关表恢复到恢复点时的状态。

flashback table my_table1, my_table2 to restore point restore_point_1;

正如评论者所建议的那样,有更简洁、更现代的方法可以立即重新创建数据。但并不是每个人都有容器或构建脚本设置。我已经看到测试人员仅用少量努力就成功使用了这种闪回方法。

使用闪回时有一些潜在的陷阱。还原点和更改的数据只会持续这么久。如果您的测试将持续数天,您可能需要查看保证还原点并调整数据库的 UNDO 表空间。闪回表仅适用于 DML,如果表发生更改将不起作用,并且不会恢复存储过程或序列值等内容。如果你需要一切闪回,那么您也许可以使用闪回数据库,但该命令也有一些复杂性。

【讨论】:

    猜你喜欢
    • 2011-11-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-04-26
    • 1970-01-01
    • 2016-06-07
    • 2011-07-07
    • 1970-01-01
    相关资源
    最近更新 更多