
Testcontainers数据库模块使用手册PostgreSQL、MySQL、MongoDB等20容器一站式集成测试【免费下载链接】testcontainers-javaTestcontainers is a Java library that supports JUnit tests, providing lightweight, throwaway instances of common databases, Selenium web browsers, or anything else that can run in a Docker container.项目地址: https://gitcode.com/GitHub_Trending/te/testcontainers-javaTestcontainers 是一个支持 JUnit 测试的 Java 测试容器库能为你在 Docker 中提供轻量级、用完即弃的 PostgreSQL、MySQL、MongoDB 等真实数据库实例让集成测试永远运行在干净的已知环境中。本手册面向新手带你快速掌握 Testcontainers 数据库模块的 3 种核心用法。为什么用 Testcontainers 做数据库测试很多团队的测试环境都踩过这些坑❌本地数据库状态污染上一次测试残留的数据导致这次测试莫名其妙失败❌版本不一致开发机装 MySQL 8.0CI 上是 5.7行为差异难排查❌H2 不兼容用内存库 H2 替代真实数据库但 SQL 方言、特性差异让测试假通过。Testcontainers 的解法很直接在容器里启动一个真实数据库测试结束立即销毁。好处是 100% 数据库兼容、每次都是全新状态、不占用固定端口。官方对适用场景的说明见 docs/modules/databases/index.md。快速上手3 步启动一个 PostgreSQL 容器第 1 步添加依赖以 Gradle 为例Maven 同理引入对应模块testImplementation org.testcontainers:testcontainers-postgresql第 2 步创建并启动容器try (PostgreSQLContainer postgres new PostgreSQLContainer(postgres:16)) { postgres.start(); // 通过 getJdbcUrl() / getUsername() / getPassword() 获取连接信息 }第 3 步像普通数据库一样写测试容器关闭后实例自动销毁无需任何清理代码。完整示例可参考官方测试 PostgreSQLContainerTest.java。 小贴士Rule会为每个测试方法提供独立容器ClassRule则整个测试类共享一个容器可在类级别节省启动时间。最快配置方法修改 JDBC URL零代码改动如果你不想在代码里显式管理容器Testcontainers 提供了一个更魔法的方式——JDBC URL 方案只需在原 URL 的jdbc:后插入tc:应用启动时就会自动拉取并启动一个全新的容器化数据库原始 URLTestcontainers URLjdbc:mysql://localhost:3306/dbnamejdbc:tc:mysql:8.0.36:///dbnamejdbc:postgresql://localhost:5432/dbnamejdbc:tc:postgresql:9.6.8:///dbname注意主机名和端口会被忽略可随意填写版本直接在 URL 中指定。URL 还支持几个实用参数TC_INITSCRIPT容器启动后自动执行 classpath 中的初始化脚本建表、造数TC_INITFUNCTION调用你自己的静态方法方便触发 Flyway / Liquibase 迁移TC_DAEMONtrue让容器在连接全部关闭后继续保活TC_TMPFS挂载 tmpfs 到内存显著加速数据库测试。详细规则与全部示例见 docs/modules/databases/jdbc.md。20 数据库容器速查表Testcontainers 为 20 多种数据库提供了开箱即用的模块以下是常用 JDBC URL 一览数据库JDBC URL 示例PostgreSQLjdbc:tc:postgresql:9.6.8:///databasenamePostGISjdbc:tc:postgis:9.6-2.5:///databasenameTimescaleDBjdbc:tc:timescaledb:2.1.0-pg13:///databasenamePGVectorjdbc:tc:pgvector:pg16:///databasenameMySQLjdbc:tc:mysql:8.0.36:///databasenameMariaDBjdbc:tc:mariadb:10.3.39:///databasenameSQL Serverjdbc:tc:sqlserver:2017-CU12:///databasenameOraclejdbc:tc:oracle:21-slim-faststart:///databasenameDB2jdbc:tc:db2:11.5.0.0a:///databasenameClickHousejdbc:tc:clickhouse:18.10.3:///databasenameCockroachDBjdbc:tc:cockroach:v21.2.3:///databasenameCrateDBjdbc:tc:cratedb:5.2.3:///databasenameOceanBasejdbc:tc:oceanbasece:4.2.1-lts:///databasenameQuestDBjdbc:tc:questdb:6.5.3:///databasenameTiDBjdbc:tc:tidb:v6.1.0:///databasenameTimeplusjdbc:tc:timeplus:2.3.21:///databasenameYugabyteDBjdbc:tc:yugabyte:2.14.4.0-b26:///databasename每个模块的详细文档都位于 docs/modules/databases/ 目录下例如 postgres.md、mysql.md。非关系型数据库MongoDB 容器怎么用MongoDB 模块提供两个容器类MongoDBContainer核心数据库容器。特别值得一提的是MongoDB 4 的多文档事务只在副本集中可用而 Testcontainers 帮你自动完成了启动副本集 → 初始化 → 等待就绪 → 分配随机端口这一整套繁琐流程MongoDBAtlasLocalContainer核心数据库 Atlas Search 向量搜索的本地组合getConnectionString()会自动带上动态分配的端口。模块源码位于 modules/mongodb/用法示例见 MongoDBContainerTest.java文档见 mongodb.md。异步开发者的福音R2DBC 支持使用 Spring Data R2DBC 的响应式项目同样可以改 URL 即得容器在r2dbc:后插入tc:并通过TC_IMAGE_TAG参数指定镜像版本注意R2DBC 方案中版本必须用参数指定r2dbc:tc:postgresql:///databasename?TC_IMAGE_TAG16.0使用前提classpath 中同时需要数据库模块如testcontainers-mysql和testcontainers-r2dbc两个依赖。详见 r2dbc.md。避坑指南4 个新手常见问题忘记加 JDBC 驱动添加 Testcontainers 模块 JAR不会自动引入数据库驱动请自行添加对应驱动依赖MySQL 的 root 密码若未自定义密码root用户默认使用密码test自定义了用户密码后它同时就是root的密码见 mysql.mdMySQL 配置覆盖可通过TC_MY_CNF参数把 classpath 中的.cnf文件映射进容器的/etc/mysql/conf.d无需改镜像测试数量控制容器启动比 H2 慢仍应尽量让依赖数据库的测试保持最少上层逻辑多用 Mock。总结选哪种方式使用方式适合场景JDBC/R2DBC URL零代码改动快速验证、Spring 应用Rule/ClassRuleJUnit 4 经典用法隔离性好手动创建容器对象需要精细控制指定版本、覆盖配置、监听日志从一行 URL 到完整容器编排Testcontainers 让真实数据库集成测试变得和内存数据库一样简单。建议配合本仓库 examples/ 下的可运行示例和 docs/modules/databases/jdbc.md 深入实践把数据库测试的脏活彻底交给容器。【免费下载链接】testcontainers-javaTestcontainers is a Java library that supports JUnit tests, providing lightweight, throwaway instances of common databases, Selenium web browsers, or anything else that can run in a Docker container.项目地址: https://gitcode.com/GitHub_Trending/te/testcontainers-java创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考