Tests d'intégration JavaScript avec Docker : de A à Z
\n\nDans le développement web moderne, la qualité du code n'est pas simplement une métrique, mais la clé de la stabilité du produit. Les tests d'intégration (Integration Testing) occupent une place centrale dans la pyramide des tests, permettant de vérifier l'interaction entre différents modules, bases de données, API externes et services. Cependant, la configuration d'environnements isolés et reproductibles pour ces tests devient souvent un casse-tête. C'est là que Docker entre en jeu — un outil de conteneurisation idéal pour créer des environnements de test propres et reproductibles.
\n\nDans cet article, nous allons voir comment organiser les tests d'intégration pour les applications JavaScript (Node.js) avec Docker. Vous apprendrez à mettre en place une base de données de test, à lancer les dépendances dans des conteneurs et à écrire des tests efficaces qui peuvent être facilement intégrés dans un pipeline CI/CD.
\n\n1. Pourquoi Docker est-il idéal pour les tests d'intégration ?
\n\nL'approche traditionnelle des tests d'intégration nécessite souvent une configuration manuelle de l'environnement sur chaque machine de développement ou serveur CI. Cela conduit au problème "ça marche sur ma machine". Docker résout ce problème de manière radicale :
\n\n- \n
- Isolation : Chaque test s'exécute dans un conteneur propre, éliminant l'influence des effets secondaires des exécutions précédentes. \n
- Reproductibilité : Le même environnement (version de Node.js, bases de données, bibliothèques système) fonctionne de manière garantie partout : sur la machine locale du développeur, sur le serveur de build et en production. \n
- Gestion des dépendances : Vous pouvez facilement déployer des infrastructures complexes (Redis, PostgreSQL, RabbitMQ) avec une seule commande
docker-compose up -d. \n - Vitesse : Les conteneurs se lancent en quelques secondes, contrairement aux machines virtuelles. Docker met en cache les couches, ce qui accélère les reconstructions répétées. \n
Dans le contexte de Node.js, Docker permet de "mocker" les services externes sans quitter l'environnement de développement. Au lieu d'appeler une API de production, vous lancez un conteneur de test avec, par exemple, json-server ou testcontainers.
2. Configuration du projet Node.js pour les tests
\n\nSupposons que nous ayons une simple application Express qui enregistre des utilisateurs dans PostgreSQL. Notre objectif est de tester l'endpoint POST /users.
Structure du projet :
\n\nproject/\n├── src/\n│ ├── app.js\n│ ├── db.js\n│ └── routes/\n│ └── users.js\n├── test/\n│ └── integration/\n│ └── users.test.js\n├── docker-compose.test.yml\n├── Dockerfile\n├── package.json\n└── .env.test\n\n\n
Pour les tests, nous utiliserons une stack populaire : Mocha (framework) + Chai (bibliothèque d'assertions) + Supertest (tests HTTP).
\n\nInstallons les dépendances :
\nnpm install --save-dev mocha chai supertest\n\nLe fichier package.json doit contenir un script pour lancer les tests :
{\n "scripts": {\n "test:integration": "mocha test/integration/**/*.test.js --timeout 10000"\n }\n}\n\n3. Création de l'environnement Docker pour les tests
\n\nLe fichier clé est docker-compose.test.yml. Il décrit les services nécessaires aux tests.
version: '3.8'\n\nservices:\n app-test:\n build:\n context: .\n dockerfile: Dockerfile\n environment:\n - NODE_ENV=test\n - DB_HOST=postgres-test\n - DB_PORT=5432\n - DB_USER=test_user\n - DB_PASSWORD=test_pass\n - DB_NAME=test_db\n depends_on:\n postgres-test:\n condition: service_healthy\n command: ["npm", "run", "test:integration"]\n\n postgres-test:\n image: postgres:15-alpine\n environment:\n POSTGRES_USER: test_user\n POSTGRES_PASSWORD: test_