E2E Testing PHP : Guide complet pour maîtriser les tests de bout en bout

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

Pourquoi les tests unitaires ne suffisent pas, et qu'est-ce que le test E2E ?

\n\n

Imaginez : vous avez écrit un code parfait. Les tests unitaires sont verts, la couverture est à 90%, l'architecture est impeccable. Vous déployez la mise en production... et les utilisateurs se plaignent que le bouton « Payer » ne fonctionne pas, alors que toutes les entrées en base de données sont correctes. Une situation familière ?

\n\n

Le problème, c'est que les tests unitaires vérifient des morceaux de code isolés. Ils ne voient pas comment votre méthode PHP interagit avec le validateur JavaScript côté front, comment la session est transmise via les cookies, ni ce qui se passe lorsque Redis tombe soudainement. C'est là qu'intervient le test E2E (End-to-End), ou test de bout en bout.

\n\n

Les tests E2E simulent le comportement d'un utilisateur réel : ils cliquent sur les boutons, remplissent des formulaires, vérifient les redirections et les réponses API. Dans le monde PHP, c'est particulièrement pertinent car une application typique est un enchevêtrement complexe de Laravel/Symfony, de bases de données, de files d'attente et de services externes. Sans tests E2E, vous risquez de laisser passer des bugs qui ruineront l'expérience utilisateur.

\n\n

Outils pour les tests E2E de projets PHP

\n\n

Dans l'écosystème PHP, deux acteurs principaux se démarquent. Je ne vais pas vous faire languir : les voici.

\n\n
    \n
  • Codeception — le framework le plus populaire, qui combine les tests unitaires, fonctionnels et E2E. Il supporte nativement Selenium WebDriver, PHPBrowser et l'API REST.
  • \n
  • PHPUnit + Selenium WebDriver — la combinaison classique où PHPUnit gère l'exécution et Selenium l'émulation du navigateur. Elle nécessite plus de configuration manuelle, mais offre un contrôle total.
  • \n
\n\n

Personnellement, je recommande Codeception pour commencer : il est compatible avec les CMS populaires (WordPress, Drupal) et les frameworks (Laravel, Yii2), et sa configuration prend 10 minutes.

\n\n

Installation de Codeception pour les tests E2E

\n\n

Créez un fichier composer.json à la racine de votre projet (s'il n'existe pas) et exécutez :

\n\n
composer require --dev codeception/codeception codeception/module-webdriver codeception/module-phpbrowser
\n\n

Ensuite, initialisez le framework :

\n\n
vendor/bin/codecept init
\n\n

On vous demandera quel type de tests créer. Choisissez Acceptance (E2E). Un dossier tests/acceptance et un fichier de configuration codeception.yml seront alors créés.

\n\n

Écrire votre premier test E2E : inscription d'un utilisateur

\n\n

Le scénario le plus courant est l'inscription. Vérifions que le formulaire fonctionne correctement et que l'utilisateur voit un message de bienvenue après l'envoi.

\n\n

Configuration pour fonctionner avec un navigateur

\n\n

Ouvrez tests/acceptance.suite.yml et configurez le module WebDriver (pour Chrome) :

\n\n
actor: AcceptanceTester\nmodules:\n    enabled:\n        - WebDriver:\n            url: 'http://localhost:8000'  # URL de votre serveur local\n            browser: chrome\n            window_size: 1920x1080\n            capabilities:\n                chromeOptions:\n                    args: ["--headless", "--no-sandbox"]  # headless pour l'IC\n        - Db:\n            dsn: 'mysql:host=localhost;dbname=testdb'\n            user: 'root'\n            password: ''\n            populate: true\n            cleanup: true\n
\n\n

Important : n'oubliez pas de lancer Selenium Server (ou ChromeDriver) dans un terminal séparé :

\n\n
java -jar selenium-server-standalone.jar
\n\n

Code du test

\n\n

Créez un fichier tests/acceptance/RegistrationCest.php :

\n\n
<?php\nuse Codeception\\Util\\Locator;\n\nclass RegistrationCest\n{\n    public function _before(AcceptanceTester $I)\n    {\n        $I->amOnPage('/register');\n    }\n\n    public function testSuccessfulRegistration(AcceptanceTester $I)\n    {\n        // 1. Remplir le formulaire\n        $I->fillField('input[name="name"]', 'Jean Dupont');\n        $I->fillField('input[name="email"]', 'jean@example.com');\n        $I->fillField('input[name="password"]', 'MotDePasseFort123!');\n        \n                

Blogs

Book Recommendations