Tests d'intégration PHP avec Docker : des scénarios de base aux solutions industrielles
\n\nLes tests d'intégration sont une étape critique du développement, qui vérifie l'interaction entre les différents composants du système : base de données, cache, API externes et la logique métier elle-même. Dans le monde PHP, où les applications fonctionnent souvent en combinaison avec MySQL/PostgreSQL, Redis et des serveurs web, Docker devient un outil indispensable pour créer des environnements de test isolés et reproductibles. Dans cet article, nous explorerons des techniques avancées de tests d'intégration d'applications PHP utilisant Docker, qui vous aideront à élever la qualité de votre code à un nouveau niveau.
\n\nPourquoi Docker est-il le compagnon idéal pour les tests d'intégration PHP ?
\n\nLes approches traditionnelles des tests d'intégration souffrent souvent de problèmes d'environnement : les bases de données peuvent être différentes sur la machine locale et le serveur CI, les ports sont occupés et les dépendances ne correspondent pas. Docker résout ces problèmes de manière radicale :
\n\n- \n
- Isolation : chaque scénario de test s'exécute dans un conteneur propre, ce qui élimine les effets secondaires des tests précédents. \n
- Reproductibilité : les images avec des versions fixes de PHP, des extensions et des services garantissent que les tests se dérouleront de manière identique sur n'importe quelle machine. \n
- Parallélisme : vous pouvez exécuter plusieurs séries de tests simultanément, chacune dans son propre conteneur avec une base de données unique. \n
- Vitesse : les outils modernes, tels que Testcontainers ou Docker Compose, permettent de monter et de détruire des environnements en quelques secondes. \n
Pour PHP, c'est particulièrement pertinent car une application typique interagit avec de nombreuses ressources externes, des files d'attente (RabbitMQ) aux moteurs de recherche (Elasticsearch).
\n\nConfiguration d'un environnement de test multicouche avec Docker Compose
\n\nLa première étape vers des tests avancés est la création d'un docker-compose.yml flexible, qui inclut non seulement PHP, mais aussi tous les services nécessaires. Considérons un exemple pour une application Laravel/Symfony qui utilise MySQL, Redis et une API REST externe :
version: '3.8'\n\nservices:\n php-test:\n image: php:8.2-cli\n volumes:\n - ./:/app\n working_dir: /app\n environment:\n - DB_HOST=mysql-test\n - DB_DATABASE=test_db\n - REDIS_HOST=redis-test\n - API_BASE_URL=http://mock-api:8080\n depends_on:\n mysql-test:\n condition: service_healthy\n redis-test:\n condition: service_started\n mock-api:\n condition: service_started\n\n mysql-test:\n image: mysql:8.0\n environment:\n MYSQL_ROOT_PASSWORD: root\n MYSQL_DATABASE: test_db\n healthcheck:\n test: ["CMD", "mysqladmin", "ping", "-h", "localhost"]\n interval: 5s\n timeout: 3s\n retries: 5\n\n redis-test:\n image: redis:7-alpine\n\n mock-api:\n image: wiremock/wiremock:latest\n volumes:\n - ./tests/mock-api:/home/wiremock\n\n\nLe point clé est l'utilisation de WireMock pour simuler les API externes. Cela permet de tester l'intégration avec des services qui peuvent être indisponibles ou instables dans l'environnement de test. WireMock s'exécute dans un conteneur séparé et renvoie des réponses prédéfinies basées sur des fichiers de configuration JSON.
\n\nPour exécuter les tests dans cet environnement, utilisez le script :
\n\n#!/bin/bash\ndocker-compose -f docker-compose.test.yml up -d\ndocker-compose -f docker-compose.test.yml exec php-test vendor/bin/phpunit --testsuite=Integration\ndocker-compose -f docker-compose.test.yml down\n\nTechniques avancées : création dynamique de conteneurs et exécution parallèle
\n\nLorsque le projet s'agrandit, un docker-compose.yml statique peut devenir un goulot d'étranglement. C'est là que la bibliothèque Testcontainers (disponible pour PHP via le paquet testc