java - 是否可以有条件地使用测试容器与本地运行的 Docker 容器?

我公司的应用程序使用多个图像的测试容器,以及设置模式的 flyway 等。我们的测试套件功能强大但运行时间长。所以我正在寻找加速测试套件执行的方法。这主要适用于在我们的本地机器上运行测试套件的开发人员,而对于 CI/CD 来说,整体执行时间不那么烦人。

澄清一下,我们的套件需要大约 5 分钟才能运行,所以它并不像灾难性的那样糟糕。但我正在努力减少它。

我的一个想法与 testcontainers 的使用有关。启动套件需要 45-60 秒,因此消除此开销将非常有益。

我的想法是使用本地 Docker 容器进行本地开发。与其在启动套件时从头开始创建整个容器,不如通过 Docker Compose 或类似的方式设置所有内容,然后使用这些容器进行测试。这将由环境变量控制,因此可以选择打开。

我们正在使用@Testcontainers 框架集成,我看不出有任何方法可以有条件地控制testcontainers 的实例化。我希望那里有一些解决方案。

回答1

我在这个问题中认识到 2 个问题,我将尝试回答这两个问题:

  • A:TestContainers受控容器和本地启动容器混合运行;
  • B:通过避免完整的飞行路径迁移来加速测试。

关于混合运行:

据我所知, TestContainers 不支持此功能。

但是,您可以使用 Spring 配置文件来解决此问题。有 1 个配置文件(用于构建服务器),其中容器由 TestContainers 启动,还有一个配置文件用于设置属性以与预启动的容器连接。

关于加速测试:

我看到您正在使用 Flyway 进行迁移。如果您使用 TestContainers (和一个空数据库),这些脚本每次都会运行,这可能很耗时。您可以将容器提交到已完成这些数据/迁移的新映像中。我在这个答案中描述了这一点:https://stackoverflow.com/a/72265528/2082699

回答2

如果您手动控制容器生命周期,而不是使用 @Testcontainers 集成,这是可能的。您可以检查服务是否在已知端口上可用,如果没有,则启动基于 Testcontainers 的容器并相应地配置您的 SUT。

此外,正如其他人所提到的,您可以使用 withReuse(true) 功能并在 ~/.testcontainers.properties 中启用重用:

testcontainers.reuse.enable = true

这将使容器在 JVM 进程生命周期中存活下来。

相似文章