Tests d'intégration JavaScript 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 JavaScript avec Docker : de la théorie à la pratique avancée

\n\n

Les tests d'intégration sont une étape cruciale du développement qui vérifie l'interaction entre différents modules et services externes. Pour les applications JavaScript sur Node.js, Docker devient un outil indispensable, permettant de créer des environnements de test isolés et reproductibles. Dans cet article, nous aborderons les techniques avancées de configuration des tests d'intégration avec Docker, y compris le travail avec les bases de données, les files d'attente et l'optimisation pour le CI/CD.

\n\n

Pourquoi Docker pour les tests d'intégration ?

\n\n

Les approches traditionnelles des tests d'intégration (mocks, stubs) ne reflètent pas toujours le comportement réel du système. Docker résout ce problème en offrant :

\n\n
    \n
  • Isolation : chaque test s'exécute dans un conteneur propre sans influence sur les autres tests ou l'environnement local.
  • \n
  • Reproductibilité : des conditions d'exécution identiques sur la machine du développeur et dans le CI/CD.
  • \n
  • Évolutivité : possibilité d'exécuter des tests en parallèle avec différentes versions de dépendances (PostgreSQL, Redis, Elasticsearch).
  • \n
  • Restauration rapide : la recréation des conteneurs prend quelques secondes, et non des heures de configuration.
  • \n
\n\n

Configuration d'un environnement de test avancé

\n\n

Considérons une application Node.js typique qui utilise PostgreSQL et Redis. Au lieu d'un simple docker-compose.yml, créons une configuration flexible avec prise en charge des tests parallèles et des health checks.

\n\n

Étape 1 : Docker Compose avec ports dynamiques

\n\n

Pour éviter les conflits de ports lors de l'exécution parallèle, utilisons une allocation dynamique :

\n\n
# docker-compose.test.yml\nversion: '3.8'\nservices:\n  postgres_test:\n    image: postgres:15-alpine\n    environment:\n      POSTGRES_DB: test_db\n      POSTGRES_USER: test_user\n      POSTGRES_PASSWORD: test_pass\n    ports:\n      - "0:5432"  # Port dynamique\n    healthcheck:\n      test: ["CMD-SHELL", "pg_isready -U test_user -d test_db"]\n      interval: 2s\n      timeout: 5s\n      retries: 10\n    tmpfs: /var/lib/postgresql/data  # Données en RAM pour la rapidité\n\n  redis_test:\n    image: redis:7-alpine\n    ports:\n      - "0:6379"\n    healthcheck:\n      test: ["CMD", "redis-cli", "ping"]\n      interval: 2s\n      timeout: 5s\n      retries: 10
\n\n

Étape 2 : Utilitaires pour lancer les tests avec Docker

\n\n

Créons une classe d'assistance qui trouve automatiquement les ports dynamiques et attend que les services soient prêts :

\n\n
// test/setup/docker-manager.js\nconst { DockerComposeEnvironment, Wait } = require('testcontainers');\nconst { Client } = require('pg');\nconst Redis = require('ioredis');\n\nclass DockerTestManager {\n    constructor() {\n        this.environment = null;\n        this.config = {\n            pgPort: null,\n            redisPort: null\n        };\n    }\n\n    async start() {\n        this.environment = await new DockerComposeEnvironment(\n            '.', \n            'docker-compose.test.yml'\n        ).withWaitStrategy('postgres_test', Wait.forHealthCheck())\n         .withWaitStrategy('redis_test', Wait.forHealthCheck())\n         .up();\n\n        // Extraction du mappage des ports\n        const pgContainer = this.environment.getContainer('postgres_test');\n        const redisContainer = this.environment.getContainer('redis_test');\n        \n        this.config.pgPort = pgContainer.getMappedPort(5432);\n        this.config.redisPort = redisContainer.getMappedPort(6379);\n        \n        return this.config;\n    }\n\n    async stop() {\n        if (this.environment) {\n            await this.environment.down();\n        }\n    }\n}\n\nmodule.exports = DockerTestManager;
\n\n

Scénarios avancés de tests d'intégration

\n\n

Passons maintenant à des tests spécifiques qui vérifient l'interaction réelle des composants.

\n

Blogs

Book Recommendations