Tests d'intégration Kotlin avec Docker : niveau avancé

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 : niveau avancé

\n\n

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

1. Configuration de Testcontainers pour un projet Kotlin

\n\n

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

1.1. Ajout des dépendances

\n\n

Ajoutez les dépendances suivantes dans build.gradle.kts :

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

1.2. Exemple de base avec PostgreSQL

\n\n

Considérons un test pour un dépôt fonctionnant avec PostgreSQL :

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

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

2. Test de plusieurs services avec Docker Compose

\n\n

Dans 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.

\n\n

2.1. Configuration de Docker Compose

\n\n

Créez un fichier docker-compose-test.yml :

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

2.2. Test d'intégration avec Docker Compose

\n\n

Exemple de test vérifiant l'interaction du service avec la base de données, le cache et la file d'attente :

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

Blogs

Book Recommendations