Teste de Integração Kotlin com Docker: do A ao Z
\n\nNo desenvolvimento moderno em Kotlin, o teste de integração com Docker tornou-se o padrão de fato. A conteinerização permite criar ambientes de teste isolados e reproduzíveis, que são o mais próximo possível do ambiente de produção. Neste artigo, abordaremos o processo completo de configuração e escrita de testes de integração para aplicações Kotlin usando Docker e a biblioteca Testcontainers.
\n\nPor que o Docker é importante para o teste de integração Kotlin?
\n\nOs testes de integração tradicionais frequentemente sofrem com problemas de ambiente: versões diferentes de bancos de dados, incompatibilidade de drivers, testes "instáveis" devido a processos em segundo plano. O Docker resolve esses problemas, fornecendo:
\n\n- \n
- Isolamento: cada teste é executado em um contêiner limpo \n
- Reprodutibilidade: mesmo ambiente em qualquer máquina \n
- Escalabilidade: capacidade de testar arquiteturas complexas de microsserviços \n
- Velocidade: inicialização e parada rápidas dos contêineres \n
Configuração do projeto Kotlin para testes de integração com Docker
\n\nPara começar, adicionaremos as dependências necessárias no build.gradle.kts:
dependencies {\n // Testcontainers\n testImplementation("org.testcontainers:testcontainers:1.19.3")\n testImplementation("org.testcontainers:postgresql:1.19.3")\n testImplementation("org.testcontainers:kafka:1.19.3")\n testImplementation("org.testcontainers:junit-jupiter:1.19.3")\n \n // Banco de dados\n testImplementation("org.postgresql:postgresql:42.7.1")\n \n // JUnit 5\n testImplementation("org.junit.jupiter:junit-jupiter:5.10.1")\n \n // Para aplicações Spring Boot\n testImplementation("org.springframework.boot:spring-boot-starter-test:3.2.1")\n testImplementation("org.springframework.boot:spring-boot-testcontainers:3.2.1")\n}\n\nExemplo básico: teste com PostgreSQL
\n\nVamos considerar um exemplo simples - teste de um repositório que trabalha com PostgreSQL. Criaremos um teste de integração usando Testcontainers:
\n\nimport org.junit.jupiter.api.Test\nimport org.testcontainers.containers.PostgreSQLContainer\nimport org.testcontainers.junit.jupiter.Container\nimport org.testcontainers.junit.jupiter.Testcontainers\nimport javax.sql.DataSource\n\n@Testcontainers\nclass UserRepositoryIntegrationTest {\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 find user`() {\n val dataSource = createDataSource(postgres)\n val repository = UserRepository(dataSource)\n \n val user = User(id = null, name = "João Silva", email = "joao@example.com")\n val savedUser = repository.save(user)\n \n val foundUser = repository.findById(savedUser.id!!)\n assert(foundUser != null)\n assert(foundUser?.name == "João Silva")\n }\n\n private fun createDataSource(container: PostgreSQLContainer<*>): DataSource {\n val config = HikariConfig().apply {\n jdbcUrl = container.jdbcUrl\n username = container.username\n password = container.password\n driverClassName = container.driverClassName\n }\n return HikariDataSource(config)\n }\n}\n\nTeste de microsserviços com Kafka e Docker Compose
\n\nPara cenários mais complexos, onde vários serviços são necessários, use o Docker Compose através do Testcontainers:
\n\nimport org.testcontainers.containers.DockerComposeContainer\nimport org.testcontainers.containers.wait.strategy.Wait\nimport java.io.File\n\nclass OrderService