Scala版Testcontainers Postgres配置启动执行初始化脚本方法
Scala版Testcontainers PostgreSQL配置启动初始化脚本方案
com.dimafeng.testcontainers.PostgreSQLContainer 是对Java原生Testcontainers PostgreSQL模块的Scala封装,未直接暴露withInitScript接口,可通过以下三种方式实现容器启动阶段自动执行建表、数据填充类初始化脚本:
方式1:调用底层Java容器实例的原生初始化方法
Scala封装类保留了底层Java容器对象的公开引用,可直接调用Java版原生的withInitScript方法配置初始化脚本,脚本文件放在测试资源目录下即可被识别:
import com.dimafeng.testcontainers.PostgreSQLContainer import org.testcontainers.containers.PostgreSQLContainer as JavaPostgresContainer val postgresContainer = PostgreSQLContainer() // 访问底层Java容器对象配置初始化脚本路径 postgresContainer.container.asInstanceOf[JavaPostgresContainer[String]] .withInitScript("sql/init_test_env.sql")
注意:
withInitScript接收的路径是类加载根路径的相对路径,通常将初始化SQL文件放在src/test/resources/sql/目录下即可。
方式2:挂载脚本到PostgreSQL镜像原生初始化目录
PostgreSQL官方Docker镜像自带初始化逻辑:容器首次启动时,会自动按文件名排序执行/docker-entrypoint-initdb.d/目录下所有.sql、.sql.gz、.sh格式的文件。只需在创建容器时将本地初始化脚本挂载到该目录即可,完全不依赖Testcontainers的特定API,兼容性最强:
import com.dimafeng.testcontainers.PostgreSQLContainer import org.testcontainers.utility.MountableFile val postgresContainer = PostgreSQLContainer() // 将本地测试资源中的脚本挂载到镜像初始化目录 postgresContainer.container.copyFileToContainer( MountableFile.forClasspathResource("sql/init_test_data.sql"), "/docker-entrypoint-initdb.d/init.sql" )
方式3:容器启动后手动执行脚本
如果初始化逻辑需要动态拼接参数、根据测试场景调整内容,可以在容器启动完成后,通过JDBC连接手动执行脚本内容,灵活度最高:
import java.nio.file.Files import java.nio.file.Paths import java.sql.DriverManager val postgresContainer = PostgreSQLContainer() postgresContainer.start() // 读取初始化脚本内容 val initSqlPath = Paths.get(getClass.getResource("/sql/init_test_schema.sql").toURI) val initSql = Files.readString(initSqlPath) // 获取JDBC连接执行脚本 val conn = DriverManager.getConnection( postgresContainer.jdbcUrl, postgresContainer.username, postgresContainer.password ) try { conn.createStatement().execute(initSql) } finally { conn.close() }
方案选择建议:固定结构的建表、基础测试数据填充优先选方式2,配置简单不受封装层API变动影响;如果需要和Java版Testcontainers的初始化逻辑保持一致选方式1;存在动态初始化逻辑的场景选方式3。
内容的提问来源于stack exchange,提问作者riccardo.cardin
相关产品推荐
相关产品推荐

