Tests d'intégration Kotlin avec Docker : niveau avancé
\n\nLes tests d'intégration sont une étape cruciale dans le développement de microservices modernes en Kotlin. L'utilisation de Docker permet de créer des environnements isolés et reproductibles, aussi proches que possible de la production. Dans cet article, nous explorerons des techniques avancées de tests d'intégration d'applications Kotlin avec Docker, incluant Testcontainers, l'optimisation des performances et l'intégration CI/CD.
\n\n1. Configuration de Testcontainers pour un projet Kotlin
\n\nTestcontainers est une bibliothèque pour JUnit qui gère le cycle de vie des conteneurs Docker directement depuis les tests. Pour Kotlin, elle offre des extensions DSL pratiques.
\n\n1.1. Ajout des dépendances
\n\nAjoutez les dépendances suivantes dans 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. Exemple de base avec PostgreSQL
\n\nConsidérons un test pour un dépôt fonctionnant avec 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 autre pool de connexions\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 démarre automatiquement le conteneur avant les tests et l'arrête après leur achèvement. Cela garantit la propreté de l'environnement de test.
\n\n2. Test de plusieurs services avec Docker Compose
\n\nDans les microservices réels, il est souvent nécessaire d'interagir avec plusieurs systèmes externes : bases de données, files d'attente de messages, caches. Utilisez DockerComposeContainer pour déployer une pile complète.
2.1. Configuration de Docker Compose
\n\nCréez un fichier 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. Test d'intégration avec Docker Compose
\n\nExemple de test vérifiant l'interaction du service avec la base de données, le cache et la file d'attente :
\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