¿Por qué los tests unitarios no bastan y qué es E2E?
\n\nImagina esto: escribiste código perfecto. Los tests unitarios pasan en verde, la cobertura es del 90%, la arquitectura es impecable. Publicas el release... y los usuarios se quejan de que el botón "Pagar" no funciona, aunque en la base de datos todo está correcto. ¿Te suena familiar?
\n\nEl problema es que los tests unitarios verifican piezas aisladas de código. No ven cómo tu método PHP interactúa con el validador JavaScript en el frontend, cómo se transmite la sesión a través de cookies o qué sucede cuando Redis se cae inesperadamente. Aquí es donde entran las pruebas E2E (End-to-End) — o pruebas de extremo a extremo.
\n\nLos tests E2E simulan el comportamiento de un usuario real: hacen clic en botones, llenan formularios, verifican redirecciones y respuestas de API. En el mundo PHP esto es especialmente relevante porque una aplicación típica es un complejo entramado de Laravel/Symfony, bases de datos, colas y servicios externos. Sin E2E corres el riesgo de pasar por alto bugs que arruinarán la experiencia del usuario.
\n\nHerramientas para pruebas E2E en proyectos PHP
\n\nEn el ecosistema PHP hay dos grandes protagonistas. No te haré esperar:
\n\n- \n
- Codeception — el framework más popular que combina tests unitarios, funcionales y E2E. Soporta de serie Selenium WebDriver, PHPBrowser y API REST. \n
- PHPUnit + Selenium WebDriver — el clásico dúo donde PHPUnit se encarga de la ejecución y Selenium de la emulación del navegador. Requiere más configuración manual, pero te da control total. \n
Personalmente recomiendo Codeception para empezar: es compatible con CMS populares (WordPress, Drupal) y frameworks (Laravel, Yii2), y su configuración te lleva solo 10 minutos.
\n\nInstalación de Codeception para E2E
\n\nCrea un archivo composer.json en la raíz del proyecto (si no existe) y ejecuta:
composer require --dev codeception/codeception codeception/module-webdriver codeception/module-phpbrowser\n\nLuego inicializa el framework:
\n\nvendor/bin/codecept init\n\nTe preguntarán qué tipo de tests crear. Elige Acceptance (E2E). Después aparecerán la carpeta tests/acceptance y el archivo de configuración codeception.yml.
Escribiendo tu primer test E2E: registro de usuario
\n\nEl escenario más común es el registro. Vamos a verificar que el formulario funciona correctamente y que después de enviarlo el usuario ve un mensaje de bienvenida.
\n\nConfiguración para trabajar con el navegador
\n\nAbre tests/acceptance.suite.yml y configura el módulo WebDriver (para Chrome):
actor: AcceptanceTester\nmodules:\n enabled:\n - WebDriver:\n url: 'http://localhost:8000' # URL de tu servidor local\n browser: chrome\n window_size: 1920x1080\n capabilities:\n chromeOptions:\n args: ["--headless", "--no-sandbox"] # headless para CI\n - Db:\n dsn: 'mysql:host=localhost;dbname=testdb'\n user: 'root'\n password: ''\n populate: true\n cleanup: true\n\n\nImportante: no olvides iniciar Selenium Server (o ChromeDriver) en una terminal aparte:
\n\njava -jar selenium-server-standalone.jar\n\nCódigo del test
\n\nCrea el archivo 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. Llenamos el formulario\n $I->fillField('input[name="name"]', 'Juan Pérez');\n $I->fillField('input[name="email"]', 'juan@ejemplo.com');\n $I->fillField('input[name="password"]', 'ClaveFuerte123!');\n \n