E2E-Testing für PHP-Anwendungen: Bugs vermeiden leicht gemacht

Online Python-Trainer für Anfänger

Lernen Sie Python einfach ohne theoretische Überlastung. Lösen Sie praktische Aufgaben mit automatischer Überprüfung und schreiben Sie Code direkt im Browser.

Kurs starten

Warum Unit-Tests allein nicht reichen – und was E2E-Tests bringen

\n\n

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

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

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

Tools für E2E-Tests in PHP-Projekten

\n\n

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

Codeception für E2E-Tests installieren

\n\n

Erstellen Sie im Projekt-Root eine Datei composer.json (falls nicht vorhanden) und führen Sie aus:

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

Initialisieren Sie dann das Framework:

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

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

\n\n

Den ersten E2E-Test schreiben: Benutzerregistrierung

\n\n

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

Konfiguration für die Browser-Arbeit

\n\n

Öffnen Sie tests/acceptance.suite.yml und konfigurieren Sie das WebDriver-Modul (für Chrome):

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

Wichtig: Vergessen Sie nicht, den Selenium Server (oder ChromeDriver) in einem separaten Terminal zu starten:

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

Der Test-Code

\n\n

Erstellen Sie die Datei 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. 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                

Blogs

Buchempfehlungen