【问题标题】:Restore database state after integration test using Docker?使用 Docker 进行集成测试后恢复数据库状态?
【发布时间】:2021-11-14 14:42:20
【问题描述】:

我们正在使用 PostgreSQL 以及部署到 JBoss 的 EAR。在构建过程中,我们有一个开发数据库转储,然后用于集成测试:部署了特殊的工件,测试使用 http 客户端与应用程序通信。

目前,在测试运行期间数据库状态会发生变化,因此我们只能为修改它的每个测试添加额外的内容,因此没有测试会相互依赖。这需要大量的时间和耐心,因为这样的测试甚至取决于记录的顺序。

有没有办法制作数据库快照,以便在每次测试运行后使用合理数量的资源恢复它? Docker 能帮上忙吗?或者其他方式?

H2 不是办法,因为我们使用了一些 PostgreSQL 特有的特性。测试可能跨越多个事务,所以我猜回滚也无济于事。

【问题讨论】:

    标签: postgresql docker integration-testing


    【解决方案1】:

    使用 Docker 的一种直接方法是将数据库快照作为一个卷进行重置,然后挂载到测试运行的开始。

    您可以在测试运行之前对这些数据进行处理(或者拥有整个启动数据库配置的 tar 文件或其他内容),然后启动您的 PostgreSQL 测试数据库,将测试数据安装为一个卷,并且您的 PostgreSQL 指向这个, 对于每个测试。

    【讨论】:

    • 我可以让 docker 使用挂载在容器中的目录,以便我的 postgres 转储仍然驻留在它所在的项目文件夹中吗?
    • 我只是熟悉docker这个概念,所以希望你澄清一些事情。我可以强制 docker 将对容器文件系统所做的更改存储在内存中,这样我就可以在每次测试之前恢复到已保存的状态并快速执行此操作吗?
    • 这听起来是个好主意。愿意分享一些示例命令和/或文档链接,以展示如何实现这一目标?
    【解决方案2】:

    一种选择是在每次集成测试完成后重新播种数据。 Spring 通过 SqlScriptsTestExecutionListener@Sql 注释提供了这样的功能。我知道你提到了EARJBoss,所以如果Spring 没有被使用,我相信Arquillian 可能会提供类似的东西。

    如果由于用于集成测试的数据量太大而重新为数据库播种成为一项昂贵的操作,另一种选择是使用已包含数据库和播种数据的Docker 图像。您需要在每个集成测试执行之前启动DB with data 容器,并在它完成后停止,换句话说,您需要在集成测试期间管理容器生命周期。几个月前,我在博客上写过如何做到这一点:Integration Testing using Spring Boot, Postgres and Docker,再次使用Spring Boot,但这些想法适用于另一个框架。它包括使用导入的数据创建Docker 图像,从现有模式生成JPA 实体,添加对集成测试的支持以在每个测试执行之前和之后启动/停止容器,并且可以轻松扩展以启动超过每个测试一个容器或同时执行它们,因为Docker 容器被映射到主机随机端口。

    在这一点上,这是一种折衷方案,从已知状态(恕我直言,正确的方法)开始每个测试,代价是为每个单独的测试重新播种数据或启动/停止容器,或者以特定顺序运行测试并在执行测试套件之前重新播种数据。

    【讨论】:

      【解决方案3】:

      您可以通过克隆初始数据库并在测试后删除新创建的测试数据库来做到这一点。当将原始数据库用作TEMPLATE 时,这将需要几毫秒,例如

      -- Crete a copy before each test:
      CREATE DATABASE some_test_database_name TEMPLATE "initial_database";
      
      -- Tear down after every test:
      DROP DATABASE some_test_database_name;
      

      【讨论】:

      • 当事务无法使用时,这是一个很好的解决方案。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-09-06
      • 1970-01-01
      • 2015-07-09
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多