Tests d'intégration Kotlin avec Docker : guide complet

Formateur Python en ligne pour débutants

Apprenez Python facilement sans surcharge théorique. Résolvez des tâches pratiques avec vérification automatique et écrivez du code directement dans le navigateur.

Start Course

Tests d'intégration Kotlin avec Docker : de A à Z

\n\n

Dans 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\n

Pourquoi Docker est-il important pour les tests d'intégration Kotlin ?

\n\n

Les 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
\n\n

Configuration d'un projet Kotlin pour les tests d'intégration avec Docker

\n\n

Pour commencer, ajoutons les dépendances nécessaires dans build.gradle.kts :

\n\n
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\n

Exemple de base : test avec PostgreSQL

\n\n

Considérons un exemple simple - le test d'un dépôt fonctionnant avec PostgreSQL. Créons un test d'intégration utilisant Testcontainers :

\n\n
import 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\n

Test des microservices avec Kafka et Docker Compose

\n\n

Pour des scénarios plus complexes nécessitant plusieurs services, utilisez Docker Compose via Testcontainers :

\n\n
import org.testcontainers.containers.DockerComposeContainer\nimport org.testcontainers.containers.wait.strategy.Wait\nimport java.io.File\n\nclass OrderService                

Blogs

Book Recommendations