Pruebas de integración de Kotlin con Docker: nivel avanzado

Entrenador de Python en Línea para Principiantes

Aprende Python fácilmente sin sobrecargarte de teoría. Resuelve tareas prácticas con verificación automática, recibe pistas y escribe código directamente en el navegador, sin instalar nada.

Start Course

Pruebas de integración de Kotlin con Docker: nivel avanzado

\n\n

Las 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\n

1. Configuración de Testcontainers para un proyecto Kotlin

\n\n

Testcontainers 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\n

1.1. Agregar dependencias

\n\n

Agregue las siguientes dependencias en build.gradle.kts:

\n\n
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\n

1.2. Ejemplo básico con PostgreSQL

\n\n

Consideremos una prueba para un repositorio que trabaja con PostgreSQL:

\n\n
import 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\n

Testcontainers inicia automáticamente el contenedor antes de las pruebas y lo detiene al finalizar. Esto garantiza la limpieza del entorno de prueba.

\n\n

2. Pruebas de múltiples servicios con Docker Compose

\n\n

En 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.

\n\n

2.1. Configuración de Docker Compose

\n\n

Cree un archivo docker-compose-test.yml:

\n\n
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\n

2.2. Prueba de integración con Docker Compose

\n\n

Ejemplo de una prueba que verifica la interacción del servicio con la base de datos, la caché y la cola:

\n\n
import 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                

Blogs

Book Recommendations