Tests d'intégration PHP avec Docker : guide complet

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 PHP avec Docker : de A à Z

\n\n

Le 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\n

Pourquoi Docker est-il l'outil idéal pour les tests d'intégration ?

\n\n

Problè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
\n\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
\n\n

Étape 1 : Structure du projet et Docker Compose

\n\n

Commençons par une application PHP typique sous Symfony. Créons le fichier docker-compose.test.yml pour l'environnement de test :

\n\n
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\n

Fichier Dockerfile.test :

\n\n
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\n

Remarquez 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.

\n\n

Étape 2 : Configuration de PHPUnit pour les tests d'intégration

\n\n

Créons une configuration séparée phpunit.integration.xml.dist :

\n\n
<?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\n

Fichier tests/bootstrap.php pour l'initialisation de l'environnement de test :

\n\n
<?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\                

Blogs

Book Recommendations