在本地开发期间,您可以使用 Testcontainer 来管理服务依赖关系,例如数据库吗?

Can you use Testcontainers to manage service dependencies, like a database, during local development?

Testcontainer 可以管理 dockerized 服务依赖,如数据库、Kafka、Elasticsearch 等用于集成测试。

我可以配置我的 Spring 引导应用程序以在本地开发期间管理这些服务依赖项吗?

例如,我的 Spring 启动应用程序 需要一个 MySQL 数据库。 我想将它与 Testcontainers 集成,以提供一个 Docker 容器 MySQL 不仅在测试执行期间,而且在本地开发期间的应用程序启动时也是如此。

Testcontainers 提供 API 来管理 Docker 容器中的应用程序和服务。它对于集成测试非常有用,其中以编程方式配置、隔离、可重复的环境是可信测试的基本要求。 因此,Testcontainers 与 Spring 和 Quarkus 等框架以及 JUnit、Spock 等测试框架集成,可以自动将容器化依赖项的生命周期与测试的生命周期联系起来。

但是,Testcontainers API 是通用的,在测试期间不必 运行。例如,Quarkus 有一个名为 Dev Services 的功能,当您的应用程序尝试访问数据库但配置不存在时,它会自动为您的数据库(或其他服务依赖项,例如 Kafka、Redis 等)创建一个容器.

你可以这样想,如果你有数据访问存储库 类 初始化和连接,但配置中没有 datasource.url -- 它将使用 testcontainers 启动数据库并配置应用程序以使用它(就像在测试期间发生的那样,而是用于本地开发)。

Spring Boot 目前没有这样的自动化功能,有一个 open issue to investigate these local development setups with Testcontainers.

如果您愿意为您的特定应用程序手动添加功能,您可以在此处查看从该问题链接的原型:https://github.com/joshlong/testcontainers-auto-services-prototype

它有点复杂,因为它与 Spring DevTools 集成,但这里是需要注意的基本部分:

  • 检查您是否需要使用数据库(在您的应用程序中可以给定)。
  • 验证不存在使用数据库的配置(如果数据库已经配置,您不需要启动一个新的)
  • 使用 Testcontainers API 创建容器,使用适当的模块或 GenericContainer 与任何 Docker 图像。
  • 将配置提供回应用程序。对于将是 jdbcUrl、用户名、密码、数据库名称、r2dbcUrl 和任何其他相关属性的数据库。

您可以看看 Josh Long 尝试这个概念的视频:https://www.youtube.com/watch?v=1PUshxvTbAc&t=2450s

它也适用于生产环境,但临时数据库的用途可能有限。