Testcontainers
Testing 🟡 MidDé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.
Termes liés
Sources
Fiche mise à jour le 2026-09-27