Warum Unit-Tests allein nicht reichen – und was E2E-Tests bringen
\n\nStellen Sie sich vor: Sie haben perfekten Code geschrieben. Unit-Tests sind grün, die Codeabdeckung liegt bei 90 %, die Architektur ist ein Traum. Sie bringen das Release raus... und die Nutzer beschweren sich, dass der „Bezahlen“-Button nicht funktioniert – obwohl alle Datenbankeinträge korrekt sind. Kommt Ihnen das bekannt vor?
\n\nDas Problem: Unit-Tests prüfen nur isolierte Code-Stücke. Sie sehen nicht, wie Ihre PHP-Methode mit dem JavaScript-Validator im Frontend interagiert, wie die Session per Cookie übertragen wird oder was passiert, wenn Redis plötzlich ausfällt. Genau hier kommt E2E (End-to-End) Testing ins Spiel – auch als End-to-End-Tests bekannt.
\n\nE2E-Tests simulieren das Verhalten eines echten Nutzers: Sie klicken auf Buttons, füllen Formulare aus, prüfen Weiterleitungen und API-Antworten. In der PHP-Welt ist das besonders wichtig, denn eine typische Anwendung ist ein komplexes Geflecht aus Laravel/Symfony, Datenbanken, Warteschlangen und externen Diensten. Ohne E2E-Tests riskieren Sie Bugs, die die User Experience zerstören.
\n\nTools für E2E-Tests in PHP-Projekten
\n\nIm PHP-Ökosystem gibt es zwei Hauptakteure. Ich mache es kurz:
\n\n- \n
- Codeception – das beliebteste Framework, das Unit-, Funktions- und E2E-Tests vereint. Es unterstützt out-of-the-box Selenium WebDriver, PHPBrowser und REST-APIs. \n
- PHPUnit + Selenium WebDriver – der klassische Verbund: PHPUnit übernimmt die Ausführung, Selenium die Browser-Emulation. Erfordert mehr manuelle Konfiguration, bietet aber volle Kontrolle. \n
Ich persönlich empfehle Codeception für den Einstieg: Es harmoniert mit gängigen CMS (WordPress, Drupal) und Frameworks (Laravel, Yii2), und die Einrichtung dauert nur 10 Minuten.
\n\nCodeception für E2E-Tests installieren
\n\nErstellen Sie im Projekt-Root eine Datei composer.json (falls nicht vorhanden) und führen Sie aus:
composer require --dev codeception/codeception codeception/module-webdriver codeception/module-phpbrowser\n\nInitialisieren Sie dann das Framework:
\n\nvendor/bin/codecept init\n\nSie werden gefragt, welchen Test-Typ Sie erstellen möchten. Wählen Sie Acceptance (E2E). Danach erscheinen der Ordner tests/acceptance und die Konfigurationsdatei codeception.yml.
Den ersten E2E-Test schreiben: Benutzerregistrierung
\n\nDas häufigste Szenario ist die Registrierung. Prüfen wir, ob das Formular korrekt funktioniert und der Nutzer nach dem Absenden eine Begrüßung sieht.
\n\nKonfiguration für die Browser-Arbeit
\n\nÖffnen Sie tests/acceptance.suite.yml und konfigurieren Sie das WebDriver-Modul (für Chrome):
actor: AcceptanceTester\nmodules:\n enabled:\n - WebDriver:\n url: 'http://localhost:8000' # URL Ihres lokalen Servers\n browser: chrome\n window_size: 1920x1080\n capabilities:\n chromeOptions:\n args: ["--headless", "--no-sandbox"] # headless für CI\n - Db:\n dsn: 'mysql:host=localhost;dbname=testdb'\n user: 'root'\n password: ''\n populate: true\n cleanup: true\n\n\nWichtig: Vergessen Sie nicht, den Selenium Server (oder ChromeDriver) in einem separaten Terminal zu starten:
\n\njava -jar selenium-server-standalone.jar\n\nDer Test-Code
\n\nErstellen Sie die Datei 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. Formular ausfüllen\n $I->fillField('input[name="name"]', 'Max Mustermann');\n $I->fillField('input[name="email"]', 'max@example.com');\n $I->fillField('input[name="password"]', 'SicheresPasswort123!');\n \n