Tests d'intégration Kotlin avec Docker : de A à Z
\n\nDans le développement moderne avec Kotlin, les tests d'intégration utilisant Docker sont devenus la norme de facto. La conteneurisation permet de créer des environnements de test isolés et reproductibles, aussi proches que possible de l'environnement de production. Dans cet article, nous allons détailler le processus complet de configuration et d'écriture de tests d'intégration pour les applications Kotlin à l'aide de Docker et de la bibliothèque Testcontainers.
\n\nPourquoi Docker est-il important pour les tests d'intégration Kotlin ?
\n\nLes tests d'intégration traditionnels souffrent souvent de problèmes d'environnement : différentes versions de bases de données, incompatibilité des pilotes, tests "flottants" dus aux processus en arrière-plan. Docker résout ces problèmes en offrant :
\n\n- \n
- Isolation : chaque test s'exécute dans un conteneur propre \n
- Reproductibilité : environnement identique sur n'importe quelle machine \n
- Évolutivité : possibilité de tester des architectures microservices complexes \n
- Vitesse : démarrage et arrêt rapides des conteneurs \n
Configuration d'un projet Kotlin pour les tests d'intégration avec Docker
\n\nPour commencer, ajoutons les dépendances nécessaires dans 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 // Base de données\n testImplementation("org.postgresql:postgresql:42.7.1")\n \n // JUnit 5\n testImplementation("org.junit.jupiter:junit-jupiter:5.10.1")\n \n // Pour les applications 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\nExemple de base : test avec PostgreSQL
\n\nConsidérons un exemple simple - le test d'un dépôt fonctionnant avec PostgreSQL. Créons un test d'intégration utilisant 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 = "Иван Петров", email = "ivan@example.com")\n val savedUser = repository.save(user)\n \n val foundUser = repository.findById(savedUser.id!!)\n assert(foundUser != null)\n assert(foundUser?.name == "Иван Петров")\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\nTest des microservices avec Kafka et Docker Compose
\n\nPour des scénarios plus complexes nécessitant plusieurs services, utilisez Docker Compose via Testcontainers :
\n\nimport org.testcontainers.containers.DockerComposeContainer\nimport org.testcontainers.containers.wait.strategy.Wait\nimport java.io.File\n\nclass OrderService