Pourquoi les tests unitaires ne suffisent pas, et qu'est-ce que le test E2E ?
\n\nImaginez : 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\nLe 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\nLes 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\nOutils pour les tests E2E de projets PHP
\n\nDans 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
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\nInstallation de Codeception pour les tests E2E
\n\nCréez un fichier composer.json à la racine de votre projet (s'il n'existe pas) et exécutez :
composer require --dev codeception/codeception codeception/module-webdriver codeception/module-phpbrowser\n\nEnsuite, initialisez le framework :
\n\nvendor/bin/codecept init\n\nOn 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.
Écrire votre premier test E2E : inscription d'un utilisateur
\n\nLe 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\nConfiguration pour fonctionner avec un navigateur
\n\nOuvrez tests/acceptance.suite.yml et configurez le module WebDriver (pour Chrome) :
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\nImportant : n'oubliez pas de lancer Selenium Server (ou ChromeDriver) dans un terminal séparé :
\n\njava -jar selenium-server-standalone.jar\n\nCode du test
\n\nCréez un fichier tests/acceptance/RegistrationCest.php :
<?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