Testcontainers

Testing 🟡 Mid

Définition

Bibliothèque (Node.js, Java, Go, Python…) qui démarre à la volée de vrais services dans des conteneurs Docker jetables pour les tests d'intégration : PostgreSQL, Redis, Kafka, MongoDB… Le test obtient un port aléatoire, tourne contre le même moteur qu'en production, puis le conteneur est détruit. Fini les mocks de base de données et les bases « in-memory » qui divergent de la vraie.

Analogie

Louer une cuisine équipée à l'heure pour répéter le plat exact, plutôt que de faire semblant avec des ustensiles en plastique.

Exemple de code

import { PostgreSqlContainer } from '@testcontainers/postgresql';
import { beforeAll, afterAll, test, expect } from 'vitest';

let pg;
beforeAll(async () => {
  pg = await new PostgreSqlContainer('postgres:16-alpine').start();
  process.env.DATABASE_URL = pg.getConnectionUri(); // port aléatoire
  await runMigrations();
}, 60_000);
afterAll(() => pg.stop());

test('crée un utilisateur', async () => {
  const user = await userRepo.create({ email: '[email protected]' });
  expect(user.id).toBeDefined();   // vraie contrainte UNIQUE, vrai SQL
});

Cas d'usage

Tester des requêtes SQL, des migrations, des transactions ou un consommateur Kafka contre le moteur réel.

Anti-pattern

Un conteneur par test au lieu d'un par fichier ou par suite : démarrages répétés qui rendent la suite lente.
#testing#integration#docker

Fiche mise à jour le 2026-09-27

← → au clavier pour passer d'une fiche à l'autre