Por que os testes unitários comuns não salvam, e o que é E2E?
\n\nImagine: você escreveu um código perfeito. Os testes unitários estão verdes, a cobertura é de 90%, a arquitetura é um doce. Você faz o deploy... e os usuários reclamam que o botão "Pagar" não funciona, embora todos os registros no banco de dados estejam corretos. Essa dor é familiar?
\n\nO problema é que os testes unitários verificam pedaços isolados de código. Eles não enxergam como seu método PHP interage com o validador JavaScript no frontend, como a sessão é transmitida via cookies e o que acontece quando o Redis cai de repente. É aqui que entram os testes E2E (End-to-End) — ou testes de ponta a ponta.
\n\nOs testes E2E simulam o comportamento de um usuário real: clicam em botões, preenchem formulários, verificam redirecionamentos e respostas de API. No mundo PHP, isso é especialmente relevante porque uma aplicação típica é um emaranhado complexo de Laravel/Symfony, banco de dados, filas e serviços externos. Sem E2E, você corre o risco de deixar passar bugs que vão destruir a experiência do usuário.
\n\nFerramentas para Testes E2E em Projetos PHP
\n\nNo ecossistema PHP, existem dois grandes players. Não vou enrolar — aqui estão eles:
\n\n- \n
- Codeception — o framework mais popular, que une testes unitários, funcionais e E2E. Já vem com suporte nativo para Selenium WebDriver, PHPBrowser e REST API. \n
- PHPUnit + Selenium WebDriver — a combinação clássica, onde o PHPUnit cuida da execução e o Selenium da emulação do navegador. Exige mais configuração manual, mas oferece controle total. \n
Pessoalmente, recomendo o Codeception para começar: ele é compatível com CMS populares (WordPress, Drupal) e frameworks (Laravel, Yii2), e a configuração leva apenas 10 minutos.
\n\nInstalação do Codeception para E2E
\n\nCrie um arquivo composer.json na raiz do projeto (se não existir) e execute:
composer require --dev codeception/codeception codeception/module-webdriver codeception/module-phpbrowser\n\nEm seguida, inicialize o framework:
\n\nvendor/bin/codecept init\n\nSerá perguntado qual tipo de teste criar. Escolha Acceptance (E2E). Depois disso, a pasta tests/acceptance e o arquivo de configuração codeception.yml serão criados.
Escrevendo o Primeiro Teste E2E: Cadastro de Usuário
\n\nO cenário mais comum é o cadastro. Vamos verificar se o formulário funciona corretamente e se, após o envio, o usuário vê uma mensagem de boas-vindas.
\n\nConfiguração para Trabalhar com o Navegador
\n\nAbra o arquivo tests/acceptance.suite.yml e configure o módulo WebDriver (para Chrome):
actor: AcceptanceTester\nmodules:\n enabled:\n - WebDriver:\n url: 'http://localhost:8000' # URL do seu 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: não se esqueça de iniciar o Selenium Server (ou ChromeDriver) em um terminal separado:
\n\njava -jar selenium-server-standalone.jar\n\nCódigo do Teste
\n\nCrie o arquivo 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. Preenchemos o formulário\n $I->fillField('input[name="name"]', 'João Silva');\n $I->fillField('input[name="email"]', 'joao@exemplo.com');\n $I->fillField('input[name="password"]', 'SenhaForte123!');\n \n