E2E Testing PHP: Guía para no ahogarte en bugs | PythonLib

Entrenador de Python en Línea para Principiantes

Aprende Python fácilmente sin sobrecargarte de teoría. Resuelve tareas prácticas con verificación automática, recibe pistas y escribe código directamente en el navegador, sin instalar nada.

Start Course

¿Por qué los tests unitarios no bastan y qué es E2E?

\n\n

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

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

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

Herramientas para pruebas E2E en proyectos PHP

\n\n

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

Instalación de Codeception para E2E

\n\n

Crea un archivo composer.json en la raíz del proyecto (si no existe) y ejecuta:

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

Luego inicializa el framework:

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

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

\n\n

Escribiendo tu primer test E2E: registro de usuario

\n\n

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

Configuración para trabajar con el navegador

\n\n

Abre tests/acceptance.suite.yml y configura el módulo WebDriver (para Chrome):

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

Importante: no olvides iniciar Selenium Server (o ChromeDriver) en una terminal aparte:

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

Código del test

\n\n

Crea el archivo 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. 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                

Blogs

Book Recommendations