Tests d'intégration PHP avec Docker : de A à Z
\n\nLe développement PHP moderne est impensable sans des tests de qualité. Si les tests unitaires vérifient des morceaux de code isolés, les tests d'intégration s'assurent que tous les composants du système fonctionnent ensemble : base de données, Redis, API externes et système de fichiers. Docker rend ce processus reproductible, rapide et indépendant de l'environnement du développeur. Dans cet article, nous allons voir comment configurer les tests d'intégration d'une application PHP avec Docker à partir de zéro.
\n\nPourquoi Docker est-il l'outil idéal pour les tests d'intégration ?
\n\nProblèmes traditionnels des tests d'intégration :
\n- \n
- Dépendance à l'environnement — chaque développeur a sa propre version de MySQL, PHP, Redis. \n
- Pollution des données — les tests laissent des déchets dans la vraie base de données. \n
- Difficulté d'exécution parallèle — les tests entrent en conflit les uns avec les autres. \n
Docker résout ces problèmes :
\n- \n
- Chaque test s'exécute dans un conteneur propre avec des versions connues des dépendances. \n
- Les conteneurs sont isolés et supprimés après l'exécution. \n
- Docker Compose permet de déployer toute l'infrastructure avec une seule commande. \n
Étape 1 : Structure du projet et Docker Compose
\n\nCommençons par une application PHP typique sous Symfony. Créons le fichier docker-compose.test.yml pour l'environnement de test :
version: '3.8'\nservices:\n php:\n build:\n context: .\n dockerfile: Dockerfile.test\n environment:\n DATABASE_URL: "mysql://test:test@mysql:3306/test_db?serverVersion=8.0"\n REDIS_URL: "redis://redis:6379"\n depends_on:\n - mysql\n - redis\n\n mysql:\n image: mysql:8.0\n environment:\n MYSQL_ROOT_PASSWORD: root\n MYSQL_DATABASE: test_db\n MYSQL_USER: test\n MYSQL_PASSWORD: test\n tmpfs: /var/lib/mysql # Données en mémoire — plus rapide\n\n redis:\n image: redis:7-alpine\n tmpfs: /data\n\nFichier Dockerfile.test :
FROM php:8.2-cli\n\nRUN docker-php-ext-install pdo_mysql\nRUN pecl install redis && docker-php-ext-enable redis\n\nCOPY --from=composer:latest /usr/bin/composer /usr/bin/composer\n\nWORKDIR /app\nCOPY . .\n\nRUN composer install --no-interaction --prefer-dist\n\nCMD ["vendor/bin/phpunit", "--configuration", "phpunit.xml.dist"]\n\nRemarquez tmpfs — il s'agit du montage d'un système de fichiers temporaire en mémoire. La base de données et Redis fonctionneront beaucoup plus rapidement que sur le disque, ce qui est crucial pour des tests rapides.
Étape 2 : Configuration de PHPUnit pour les tests d'intégration
\n\nCréons une configuration séparée phpunit.integration.xml.dist :
<?xml version="1.0" encoding="UTF-8"?>\n<phpunit xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"\n xsi:noNamespaceSchemaLocation="vendor/phpunit/phpunit/phpunit.xsd"\n bootstrap="tests/bootstrap.php"\n colors="true">\n <testsuites>\n <testsuite name="Integration">\n <directory>tests/Integration</directory>\n </testsuite>\n </testsuites>\n <php>\n <env name="APP_ENV" value="test"/>\n <env name="KERNEL_CLASS" value="App\\Kernel"/>\n </php>\n</phpunit>\n\nFichier tests/bootstrap.php pour l'initialisation de l'environnement de test :
<?php\n\nrequire dirname(__DIR__) . '/vendor/autoload.php';\n\n// On attend que MySQL et Redis soient prêts\n$maxAttempts = 30;\n$connected = false;\n\nfor ($i = 0; $i < $maxAttempts; $i++) {\n try {\n $pdo = new PDO(\n $_ENV['DATABASE_URL'],\n null, null,\n [PDO::ATTR_TIMEOUT => 1]\n );\n $connected = true;\n break;\n } catch (PDOException $e) {\n sleep(1);\n }\n}\n\