0Pricing
Java Academy · Leçon

Testcontainers : essais d’intégration avec une vraie base de données

Lancez PostgreSQL dans Docker avec Testcontainers et exécutez des essais d’intégration sur une vraie base de données.

Testcontainers : essais d’intégration avec une vraie base de données est une leçon Java Academy gratuite sur CoddyKit. Ceci est la leçon 4 sur 4. Tu peux lire la leçon complète ci-dessous gratuitement — puis la pratiquer en direct dans le navigateur avec un éditeur de code intégré et un tuteur IA 24/7. Elle fait partie du parcours d'apprentissage Java Academy, et ta progression se synchronise sur le web et l'application CoddyKit. Le cours Java Academy comprend 4 leçons au total.

Pourquoi utiliser Testcontainers ?

Les bases de données H2 en mémoire ne prennent pas en charge les fonctionnalités propres à PostgreSQL, comme le JSON, la recherche en texte intégral et ON CONFLICT. Testcontainers démarre de vrais conteneurs Docker pendant les tests, ce qui vous fournit une base de données identique à celle de la production.

Ajouter la dépendance Testcontainers

Ajoutez le BOM Testcontainers et le module PostgreSQL à votre fichier de compilation. Spring Boot 3.1 et les versions ultérieures incluent une version gérée de Testcontainers.

// build.gradle:
testImplementation "org.testcontainers:junit-jupiter"
testImplementation "org.testcontainers:postgresql"
// Optionally use Spring Boot Testcontainers support:
testImplementation "org.springframework.boot:spring-boot-testcontainers"

@Testcontainers et @Container

Annotez la classe de test avec @Testcontainers et déclarez le conteneur comme champ statique @Container. JUnit 5 le démarre et l'arrête automatiquement.

@Testcontainers
@DataJpaTest
@AutoConfigureTestDatabase(replace = AutoConfigureTestDatabase.Replace.NONE)
class UserRepositoryIntegrationTest {
    @Container
    static PostgreSQLContainer<?> postgres = new PostgreSQLContainer<>("postgres:16-alpine")
        .withDatabaseName("testdb")
        .withUsername("test")
        .withPassword("test");
}

Configurer DataSource à partir d'un conteneur

Utilisez @DynamicPropertySource pour injecter le port dynamique et les identifiants du conteneur dans la configuration DataSource de Spring.

@DynamicPropertySource
static void configureProperties(DynamicPropertyRegistry registry) {
    registry.add("spring.datasource.url",      postgres::getJdbcUrl);
    registry.add("spring.datasource.username", postgres::getUsername);
    registry.add("spring.datasource.password", postgres::getPassword);
}

Spring Boot 3.1 ServiceConnection

Spring Boot 3.1+ configure automatiquement la DataSource à partir d’un bean Testcontainers @Container annoté avec @ServiceConnection — vous n’avez pas besoin de @DynamicPropertySource.

@Bean
@ServiceConnection
static PostgreSQLContainer<?> postgresContainer() {
    return new PostgreSQLContainer<>("postgres:16-alpine");
}

Modèle du conteneur singleton

Démarrer un conteneur pour chaque classe de test est lent. Partagez un seul conteneur entre tous les tests à l’aide d’un champ statique avec Startables.deepStart() ou d’une classe de base abstraite.

abstract class AbstractIntegrationTest {
    @Container
    static final PostgreSQLContainer<?> POSTGRES =
        new PostgreSQLContainer<>("postgres:16-alpine").withReuse(true);
    static { POSTGRES.start(); }
    @DynamicPropertySource
    static void props(DynamicPropertyRegistry r) {
        r.add("spring.datasource.url",      POSTGRES::getJdbcUrl);
        r.add("spring.datasource.username", POSTGRES::getUsername);
        r.add("spring.datasource.password", POSTGRES::getPassword);
    }
}

Tester les fonctionnalités propres à PostgreSQL

Avec Testcontainers, vous pouvez tester les colonnes JSON, les opérateurs JSONB, la recherche en texte intégral et ON CONFLICT DO UPDATE — ce qui est impossible avec H2.

@Test
void jsonb_search_works() {
    // Insert row with JSONB column, then query
    List<Event> logins = repo.findByType("login");
    assertEquals(1, logins.size());
}

Plusieurs conteneurs : Compose

Utilisez DockerComposeContainer pour exécuter une pile complète (PostgreSQL + Redis + Kafka) lors de tests d’intégration nécessitant plusieurs services.

@Container
static DockerComposeContainer<?> compose = new DockerComposeContainer<>(
    new File("src/test/resources/docker-compose.yml"))
    .withExposedService("postgres", 5432)
    .withExposedService("redis", 6379);

Ryuk : nettoyage automatique

Testcontainers utilise un conteneur Ryuk pour arrêter et supprimer automatiquement les conteneurs lorsque la JVM se termine — même en cas d’échec d’un test, ce qui évite les conteneurs orphelins.

@SpringBootTest avec Testcontainers

Utilisez @SpringBootTest plutôt que @DataJpaTest pour tester toute la pile applicative (contrôleurs, services et référentiels) avec un conteneur PostgreSQL réel.

@SpringBootTest(webEnvironment = SpringBootTest.WebEnvironment.RANDOM_PORT)
@Testcontainers
class FullIntegrationTest extends AbstractIntegrationTest {
    @LocalServerPort int port;
    @Autowired TestRestTemplate rest;
    @Test
    void end_to_end_user_creation() {
        ResponseEntity<UserDto> r = rest.postForEntity("/api/users", createReq(), UserDto.class);
        assertEquals(HttpStatus.CREATED, r.getStatusCode());
    }
}

Mise en cache des images de conteneur

Testcontainers met en cache localement les images Docker téléchargées. Téléchargez les images dans l’environnement d’intégration continue avant l’exécution des tests (docker pull postgres:16-alpine) afin d’éviter le temps de téléchargement pendant l’exécution des tests.

Vérification rapide

Quelle annotation connecte automatiquement un conteneur Testcontainers à la DataSource de Spring dans Spring Boot 3.1+ ?

Récapitulatif

Testcontainers exécute de vrais conteneurs Docker pour les tests d’intégration. Utilisez @Container + @DynamicPropertySource ou @ServiceConnection (Boot 3.1+). Partagez les conteneurs entre les tests avec le modèle singleton. Testez les fonctionnalités propres à PostgreSQL qui sont impossibles avec H2.

Questions Fréquemment Posées

La leçon « Testcontainers : essais d’intégration avec une vraie base de données » est-elle gratuite ?

Oui — le texte complet de « Testcontainers : essais d’intégration avec une vraie base de données » est gratuit à lire ici sur le web. Pour la pratiquer de manière interactive (un éditeur de code intégré et un tuteur IA 24/7) et déverrouiller le reste du cours Java Academy, passe à CoddyKit PRO. Le cours Java Academy comprend 4 leçons au total.

Qu'est-ce que j'apprendrai dans « Testcontainers : essais d’intégration avec une vraie base de données » ?

Lancez PostgreSQL dans Docker avec Testcontainers et exécutez des essais d’intégration sur une vraie base de données. Tu pratiques Java Academy avec du code pratique que tu exécutes directement dans le navigateur, et un tuteur IA 24/7 répond à tes questions au fur et à mesure que tu avances dans la leçon.

Dois-je avoir de l'expérience pour commencer Java Academy ?

Aucune expérience préalable n'est requise. Java Academy sur CoddyKit est structuré pour les débutants jusqu'aux apprenants avancés, donc tu peux commencer ici ou depuis le début et avancer à ton rythme. Ceci est la leçon 4 sur 4.

Combien de temps prend la leçon « Testcontainers : essais d’intégration avec une vraie base de données » ?

La plupart des leçons CoddyKit prennent environ 5–10 minutes. Chacune est courte et interactive, tu progresses régulièrement et tu repiques exactement où tu t'es arrêté sur le web et l'app.

Peux-tu écrire et exécuter du code dans cette leçon Java Academy ?

Oui. Chaque leçon Java Academy inclut un éditeur de code intégré, tu écris et exécutes du vrai code directement dans ton navigateur et tu reçois des retours IA instantanés — aucune configuration locale requise.

Toutes les leçons de ce cours

  1. Essais paramétrés avec @CsvSource et @MethodSource
  2. Mockito avancé : captureurs d’arguments et espions
  3. Tranches d’essai Spring Boot : @WebMvcTest et @DataJpaTest
  4. Testcontainers : essais d’intégration avec une vraie base de données
← Retour à Java Academy