E2E Testing em PHP: Guia Completo para Não se Afogar em Bugs

Treinador Online de Python para Iniciantes

Aprenda Python facilmente sem sobrecarga teórica. Resolva tarefas práticas com verificação automática e escreva código diretamente no navegador.

Start Course

Por que os testes unitários comuns não salvam, e o que é E2E?

\n\n

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

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

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

Ferramentas para Testes E2E em Projetos PHP

\n\n

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

Instalação do Codeception para E2E

\n\n

Crie um arquivo composer.json na raiz do projeto (se não existir) e execute:

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

Em seguida, inicialize o framework:

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

Será 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.

\n\n

Escrevendo o Primeiro Teste E2E: Cadastro de Usuário

\n\n

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

Configuração para Trabalhar com o Navegador

\n\n

Abra o arquivo tests/acceptance.suite.yml e configure o módulo WebDriver (para Chrome):

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

Importante: não se esqueça de iniciar o Selenium Server (ou ChromeDriver) em um terminal separado:

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

Código do Teste

\n\n

Crie o arquivo 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. 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                

Blogs

Book Recommendations