Pruebas de integración de Kotlin con Docker: guía paso a paso

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

Introducción: ¿por qué necesitas pruebas de integración con Docker?



Al desarrollar aplicaciones modernas en Kotlin, especialmente microservicios, es importante verificar cómo los componentes del sistema interactúan entre sí y con dependencias externas (bases de datos, colas de mensajes, cachés). Las pruebas unitarias aíslan el código, pero no garantizan que la aplicación funcione correctamente en un entorno real.



Las pruebas de integración con Docker resuelven este problema. Docker permite levantar contenedores aislados con los servicios necesarios (PostgreSQL, Redis, Kafka) justo antes de ejecutar las pruebas y destruirlos automáticamente al finalizar. Esto proporciona:



  • Reproducibilidad: las pruebas siempre se ejecutan en el mismo entorno.
  • Aislamiento: los contenedores no afectan al entorno local del desarrollador.
  • Velocidad: los contenedores se inician en segundos, no en minutos.


En este artículo, analizaremos cómo configurar las pruebas de integración de una aplicación Kotlin utilizando Docker, la biblioteca Testcontainers y Docker Compose. Obtendrás ejemplos de código listos para usar y las mejores prácticas.



1. Configuración del proyecto Kotlin para pruebas de integración



1.1. Dependencias en build.gradle.kts



Para empezar, añade las dependencias necesarias a tu archivo build.gradle.kts. Usaremos JUnit 5, Testcontainers y el driver para PostgreSQL:



dependencies {    // Dependencias principales de la aplicación    implementation("org.jetbrains.kotlin:kotlin-stdlib")    implementation("org.postgresql:postgresql:42.7.1")

// Pruebas testImplementation("org.junit.jupiter:junit-jupiter:5.10.1") testImplementation("org.testcontainers:testcontainers:1.19.3") testImplementation("org.testcontainers:postgresql:1.19.3") testImplementation("org.testcontainers:junit-jupiter:1.19.3")}

tasks.test { useJUnitPlatform()}


1.2. Estructura básica de la clase de prueba



Creemos una clase simple para la prueba de integración que levantará un contenedor PostgreSQL:



import org.junit.jupiter.api.Testimport org.testcontainers.containers.PostgreSQLContainerimport org.testcontainers.junit.jupiter.Containerimport org.testcontainers.junit.jupiter.Testcontainersimport java.sql.DriverManager

@Testcontainersclass UserRepositoryIntegrationTest {

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

@Test fun `should connect to database and execute query`() { val jdbcUrl = postgres.jdbcUrl val username = postgres.username val password = postgres.password

val connection = DriverManager.getConnection(jdbcUrl, username, password) val statement = connection.createStatement()

statement.execute("CREATE TABLE IF NOT EXISTS users (id SERIAL PRIMARY KEY, name VARCHAR(100))") statement.execute("INSERT INTO users (name) VALUES ('Alice')")

val resultSet = statement.executeQuery("SELECT COUNT(*) FROM users") resultSet.next() val count = resultSet.getInt(1)

assert(count == 1) println("Prueba superada: se encontraron $count usuarios") }}


Observa: la anotación @Testcontainers gestiona automáticamente el ciclo de vida del contenedor. Se inicia antes de todas las pruebas en la clase y se detiene después de que finalicen.



2. Pruebas con múltiples contenedores (Docker Compose)



En proyectos reales, a menudo se necesitan varios servicios simultáneamente: base de datos, Redis, Kafka. Testcontainers es compatible con Docker Compose, lo que permite describir toda la infraestructura en un solo archivo

Blogs

Book Recommendations