Testes de Integração Kotlin com Docker: Nível Avançado
\n\nTestes de integração são uma etapa crítica no desenvolvimento de microsserviços modernos em Kotlin. O uso do Docker permite criar ambientes isolados e reproduzíveis, o mais próximo possível da produção. Neste artigo, abordaremos técnicas avançadas de testes de integração de aplicações Kotlin com Docker, incluindo Testcontainers, otimização de desempenho e integração com CI/CD.
\n\n1. Configuração do Testcontainers para um projeto Kotlin
\n\nTestcontainers é uma biblioteca para JUnit que gerencia o ciclo de vida de contêineres Docker diretamente a partir dos testes. Para Kotlin, ela oferece extensões DSL convenientes.
\n\n1.1. Adicionando dependências
\n\nAdicione as seguintes dependências ao 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. Exemplo básico com PostgreSQL
\n\nConsidere um teste para um repositório que trabalha com 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 ou outro pool de conexões\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\nO Testcontainers inicia automaticamente o contêiner antes dos testes e o para após a conclusão. Isso garante a limpeza do ambiente de teste.
\n\n2. Testando vários serviços com Docker Compose
\n\nEm microsserviços reais, muitas vezes é necessária a interação com vários sistemas externos: bancos de dados, filas de mensagens, caches. Use DockerComposeContainer para levantar uma pilha completa.
2.1. Configuração do Docker Compose
\n\nCrie um arquivo 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. Teste de integração com Docker Compose
\n\nExemplo de teste que verifica a interação do serviço com banco de dados, cache e fila:
\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