Micronaut 重用测试容器

Posted

技术标签:

【中文标题】Micronaut 重用测试容器【英文标题】:Micronaut to reuse testcontainer 【发布时间】:2021-06-14 16:10:28 【问题描述】:

我正在使用 Micronaut 2.4.0 并使用 testContainers 进行 SQL Server 集成测试。

这是我的 gradle.build

    testImplementation("org.testcontainers:testcontainers")
    testImplementation("org.testcontainers:junit-jupiter")
    testImplementation("org.testcontainers:mssqlserver")

这是用于测试的 application.yml

    url: jdbc:tc:sqlserver://localhost;databaseName=test-db
    username: sa
    password: sa
    driverClassName: org.testcontainers.jdbc.ContainerDatabaseDriver

这些是唯一的变化,micronaut 处理测试容器的创建和启动。

问题

对于每个测试类,它都会创建新容器。 测试的大部分时间是在容器创建中。

有没有办法可以重复使用容器? (清除数据库可能仍然可以)

【问题讨论】:

我不确定 Testcontainers 重用功能是否适用于 JDBC 支持。使用手动容器定义,它肯定会起作用(如similar question 所示)。您还可以找到详细示例here(使用 Spring Boot,但设置类似)。 在 spring 中很容易,在 micronaut 中同样不起作用。 application.yml 有连接字符串。在应用启动之前需要一些方法来初始化测试容器 你使用注解@Container 吗?如果是,你不应该。请参阅***.com/a/62443261/696714 【参考方案1】:

迟到的回复,但是,以防有人偶然发现。

尝试将 TC_REUSABLE=true 添加到 jdbc URL 中

即:jdbc:tc:sqlserver://localhost;databaseName=test-db/TC_INITSCRIPT=db/customer_database_schema.sql&TC_REUSABLE=true

【讨论】:

这行得通。我之前的配置“testcontainers.reuse.enable: true”不起作用,这可能是 Spring Boot 而不是 Micronaut 的设置【参考方案2】:

另一个答案可能是正确的。

我让它在 jdbc URL 中使用 TC_DAEMON=true 参数

所以,它变成了

url: jdbc:tc:sqlserver://localhost;databaseName=mydb?TC_DAEMON=true

编辑

最终我离开了测试容器,现在手动从 docker 开始

【讨论】:

以上是关于Micronaut 重用测试容器的主要内容,如果未能解决你的问题,请参考以下文章

使用 Micronaut 应用程序为 JUnit5 中的每个单元/集成测试运行一次 TestContainer

在 Micronaut 应用程序中使用 TestContainer 的测试环境的 ApplicationContext 不起作用

覆盖 Micronaut 测试中的依赖项

在 micronaut 中为集成测试配置数据库

使用 Junit 5 和 Micronaut 设置测试 MongoDBContainer

在 JUnit 5 完成所有类测试后,测试容器未从 docker 中删除