Pruebas de integración de Kotlin con Docker: nivel avanzado
\n\nLas pruebas de integración son una etapa crítica en el desarrollo de microservicios modernos en Kotlin. El uso de Docker permite crear entornos aislados y reproducibles, lo más cercanos posible a producción. En este artículo, exploraremos técnicas avanzadas de pruebas de integración de aplicaciones Kotlin con Docker, incluyendo Testcontainers, optimización del rendimiento e integración con CI/CD.
\n\n1. Configuración de Testcontainers para un proyecto Kotlin
\n\nTestcontainers es una biblioteca para JUnit que gestiona el ciclo de vida de los contenedores Docker directamente desde las pruebas. Para Kotlin, proporciona extensiones DSL convenientes.
\n\n1.1. Agregar dependencias
\n\nAgregue las siguientes dependencias en build.gradle.kts:
testImplementation("org.testcontainers:testcontainers:1.19.3")\ntestImplementation("org.testcontainers:postgresql:1.19.3")\ntestImplementation("org.testcontainers:junit-jupiter:1.19.3")\ntestImplementation("org.jetbrains.kotlin:kotlin-test")\n\n1.2. Ejemplo básico con PostgreSQL
\n\nConsideremos una prueba para un repositorio que trabaja con PostgreSQL:
\n\nimport org.junit.jupiter.api.Test\nimport org.testcontainers.containers.PostgreSQLContainer\nimport org.testcontainers.junit.jupiter.Container\nimport org.testcontainers.junit.jupiter.Testcontainers\n\n@Testcontainers\nclass UserRepositoryTest {\n\n companion object {\n @Container\n val postgres = PostgreSQLContainer<Nothing>("postgres:15-alpine").apply {\n withDatabaseName("testdb")\n withUsername("test")\n withPassword("test")\n }\n }\n\n @Test\n fun `should save and retrieve user`() {\n val dataSource = createDataSource(postgres.jdbcUrl, postgres.username, postgres.password)\n val repository = UserRepository(dataSource)\n\n val user = User(id = null, name = "Alice", email = "alice@example.com")\n val saved = repository.save(user)\n\n val found = repository.findById(saved.id!!)\n assert(found?.name == "Alice")\n }\n\n private fun createDataSource(jdbcUrl: String, username: String, password: String): DataSource {\n // HikariCP u otro pool de conexiones\n return HikariDataSource(HikariConfig().apply {\n this.jdbcUrl = jdbcUrl\n this.username = username\n this.password = password\n driverClassName = "org.postgresql.Driver"\n })\n }\n}\n\nTestcontainers inicia automáticamente el contenedor antes de las pruebas y lo detiene al finalizar. Esto garantiza la limpieza del entorno de prueba.
\n\n2. Pruebas de múltiples servicios con Docker Compose
\n\nEn microservicios reales, a menudo se requiere interactuar con varios sistemas externos: bases de datos, colas de mensajes, cachés. Use DockerComposeContainer para levantar una pila completa.
2.1. Configuración de Docker Compose
\n\nCree un archivo docker-compose-test.yml:
version: '3.8'\nservices:\n postgres:\n image: postgres:15-alpine\n environment:\n POSTGRES_DB: testdb\n POSTGRES_USER: test\n POSTGRES_PASSWORD: test\n redis:\n image: redis:7-alpine\n rabbitmq:\n image: rabbitmq:3-management-alpine\n\n2.2. Prueba de integración con Docker Compose
\n\nEjemplo de una prueba que verifica la interacción del servicio con la base de datos, la caché y la cola:
\n\nimport org.junit.jupiter.api.Test\nimport org.testcontainers.containers.DockerComposeContainer\nimport org.testcontainers.junit.jupiter.Container\nimport org.testcontainers.junit.jupiter.Testcontainers\nimport java.io.File\n\n@Testcontainers\nclass OrderServiceIntegrationTest {\n\n companion object {\n @Container\n val environment = DockerComposeContainer(\n File("src/test/resources/docker-com