Kotlin 与 Docker 集成测试:完整指南

面向初学者的在线Python训练器

轻松学习Python,无需理论负担。在浏览器中直接解决带自动检查的实践任务,无需安装任何东西。

开始课程

Kotlin 与 Docker 集成测试:从入门到精通



在现代 Kotlin 开发中,使用 Docker 进行集成测试已成为事实上的标准。容器化允许创建隔离、可重复的测试环境,这些环境尽可能接近生产环境。在本文中,我们将详细介绍使用 Docker 和 Testcontainers 库为 Kotlin 应用程序设置和编写集成测试的完整过程。



为什么 Docker 对 Kotlin 集成测试很重要?



传统的集成测试经常受到环境问题的困扰:不同版本的数据库、驱动程序不兼容、由于后台进程导致的“不稳定”测试。Docker 通过提供以下功能解决了这些问题:



  • 隔离性:每个测试在干净的容器中运行
  • 可重复性:在任何机器上都有相同的环境
  • 可扩展性:能够测试复杂的微服务架构
  • 速度:容器的快速启动和停止


为集成测试配置 Kotlin 项目与 Docker



首先,在 build.gradle.kts 中添加必要的依赖项:



dependencies {    // Testcontainers    testImplementation("org.testcontainers:testcontainers:1.19.3")    testImplementation("org.testcontainers:postgresql:1.19.3")    testImplementation("org.testcontainers:kafka:1.19.3")    testImplementation("org.testcontainers:junit-jupiter:1.19.3")        // 数据库    testImplementation("org.postgresql:postgresql:42.7.1")        // JUnit 5    testImplementation("org.junit.jupiter:junit-jupiter:5.10.1")        // 用于 Spring Boot 应用程序    testImplementation("org.springframework.boot:spring-boot-starter-test:3.2.1")    testImplementation("org.springframework.boot:spring-boot-testcontainers:3.2.1")}


基础示例:使用 PostgreSQL 进行测试



让我们看一个最简单的例子——测试一个与 PostgreSQL 配合使用的仓库。使用 Testcontainers 创建一个集成测试:



import org.junit.jupiter.api.Testimport org.testcontainers.containers.PostgreSQLContainerimport org.testcontainers.junit.jupiter.Containerimport org.testcontainers.junit.jupiter.Testcontainersimport javax.sql.DataSource

@Testcontainersclass UserRepositoryIntegrationTest {

companion object { @Container val postgres = PostgreSQLContainer<Nothing>("postgres:15-alpine").apply { withDatabaseName("testdb") withUsername("test") withPassword("test") } }

@Test fun `should save and find user`() { val dataSource = createDataSource(postgres) val repository = UserRepository(dataSource) val user = User(id = null, name = "伊万·彼得罗夫", email = "ivan@example.com") val savedUser = repository.save(user) val foundUser = repository.findById(savedUser.id!!) assert(foundUser != null) assert(foundUser?.name == "伊万·彼得罗夫") }

private fun createDataSource(container: PostgreSQLContainer<*>): DataSource { val config = HikariConfig().apply { jdbcUrl = container.jdbcUrl username = container.username password = container.password driverClassName = container.driverClassName } return HikariDataSource(config) }}


使用 Kafka 和 Docker Compose 测试微服务



对于需要多个服务的更复杂场景,通过 Testcontainers 使用 Docker Compose:



import org.testcontainers.containers.DockerComposeContainerimport org.testcontainers.containers.wait.strategy.Waitimport java.io.File

class OrderService

博客

书籍推荐