Tests d'intégration Java avec Docker : techniques avancées

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

\n

Les tests d'intégration sont une étape clé du développement d'applications Java modernes, en particulier dans une architecture microservices. L'utilisation de Docker permet d'isoler les environnements de test, garantissant la reproductibilité et l'indépendance vis-à-vis des services externes. Dans cet article, nous explorerons les techniques avancées de tests d'intégration d'applications Java avec Docker, notamment l'utilisation de la bibliothèque Testcontainers, la configuration de conteneurs personnalisés, le test de scénarios asynchrones et l'intégration dans les pipelines CI/CD. Ce contenu est destiné aux développeurs déjà familiarisés avec les bases de JUnit et Docker.

\n\n

Pourquoi Docker est-il crucial pour les tests d'intégration Java ?

\n

Les tests d'intégration traditionnels rencontrent souvent des problèmes : bases de données de test instables, conflits de ports, configuration manuelle de l'environnement. Docker résout ces problèmes en fournissant des conteneurs légers et éphémères. Chaque test peut lancer sa propre base de données, son courtier de messages ou son cache, puis les détruire automatiquement une fois terminé. Cela rend les tests :

\n
    \n
  • Isolés : chaque scénario de test fonctionne dans un environnement propre.
  • \n
  • Reproductibles : comportement identique sur la machine locale et dans le CI.
  • \n
  • Parallélisables : les conteneurs n'entrent pas en conflit sur les ports grâce au mappage dynamique.
  • \n
\n

Pour Java, la bibliothèque la plus populaire est Testcontainers, qui fournit une API simple pour gérer les conteneurs depuis les tests.

\n\n

Configuration de Testcontainers : du simple au complexe

\n

Commençons par un exemple de base — le test de la couche DAO avec PostgreSQL. Ajoutez la dépendance dans pom.xml :

\n
<dependency>\n    <groupId>org.testcontainers</groupId>\n    <artifactId>testcontainers</artifactId>\n    <version>1.19.3</version>\n    <scope>test</scope>\n</dependency>\n<dependency>\n    <groupId>org.testcontainers</groupId>\n    <artifactId>postgresql</artifactId>\n    <version>1.19.3</version>\n    <scope>test</scope>\n</dependency>
\n

Créons maintenant un test qui utilise un conteneur PostgreSQL :

\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 java.sql.Connection;\nimport java.sql.DriverManager;\nimport java.sql.ResultSet;\nimport static org.junit.jupiter.api.Assertions.assertEquals;\n\n@Testcontainers\npublic class UserRepositoryIntegrationTest {\n\n    @Container\n    private PostgreSQLContainer<?> postgres = new PostgreSQLContainer<>("postgres:15")\n            .withDatabaseName("testdb")\n            .withUsername("test")\n            .withPassword("test");\n\n    @Test\n    void shouldSaveAndFindUser() throws Exception {\n        // Récupération de l'URL dynamique depuis le conteneur\n        String jdbcUrl = postgres.getJdbcUrl();\n        String username = postgres.getUsername();\n        String password = postgres.getPassword();\n\n        try (Connection conn = DriverManager.getConnection(jdbcUrl, username, password)) {\n            conn.createStatement().execute("CREATE TABLE IF NOT EXISTS users (id SERIAL PRIMARY KEY, name VARCHAR(255))");\n            conn.createStatement().execute("INSERT INTO users (name) VALUES ('Alice')");\n            ResultSet rs = conn.createStatement().executeQuery("SELECT name FROM users WHERE id = 1");\n            rs.next();\n            assertEquals("Alice", rs.getString("name"));\n        }\n    }\n}
\n

Testcontainers démarre automatiquement le conteneur avant les tests et l'arrête après. Pour un niveau avancé, utilisez des conteneurs personnalisés (par exemple, avec des données préchargées

Blogs

Book Recommendations