Testen in PHP: Unit, Integration, E2E – das vollständige Handbuch

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

Einleitung: Warum PHP-Anwendungen testen?

Das Testen von Code ist nicht nur ein modischer Trend, sondern eine grundlegende Praxis professioneller Entwicklung. In der PHP-Welt, in der eine Vielzahl von Projekten mit Datenbanken, externen APIs und komplexer Geschäftslogik arbeitet, beeinflusst die Codequalität direkt die Stabilität und Sicherheit des Produkts. Ohne Tests kann selbst eine kleine Änderung eine Funktionalität zerstören, die jahrelang funktioniert hat.



In diesem Artikel werden wir drei wichtige Testebenen behandeln: unit (Modultests), integration (Integrationstests) und e2e (End-to-End-Tests). Sie erfahren, wie sie sich unterscheiden, wann Sie welche anwenden, und sehen reale Codebeispiele in PHP. Unabhängig davon, ob Sie Laravel, Symfony oder reines PHP verwenden, dieses Wissen hilft Ihnen, zuverlässige Anwendungen zu erstellen.



Unit-Testing: Überprüfung isolierter Komponenten

Unit-Tests (Komponententests) sind die unterste und schnellste Testebene. Ihr Ziel ist es, die Arbeit einer einzelnen Methode oder Funktion in vollständiger Isolation von externen Abhängigkeiten (Datenbanken, Dateisystem, HTTP-Anfragen) zu überprüfen.



Werkzeuge für Unit-Testing in PHP

  • PHPUnit — der De-facto-Standard. Leistungsstark, flexibel, von den meisten Frameworks unterstützt.
  • Pest — eine moderne Alternative mit prägnanterer Syntax. Ideal für Anfänger und Teams, die Lesbarkeit schätzen.


Beispiel mit PHPUnit

Angenommen, wir haben eine einfache Klasse zur Berechnung von Rabatten:

<?phpclass DiscountCalculator{    public function calculate(float $price, float $percent): float    {        if ($percent < 0 || $percent > 100) {            throw new \\InvalidArgumentException('Der Rabattprozentsatz muss zwischen 0 und 100 liegen');        }        return $price - ($price * $percent / 100);    }}?>


Der Test für diese Klasse sieht wie folgt aus:

<?phpuse PHPUnit\\Framework\\TestCase;

class DiscountCalculatorTest extends TestCase{ public function testCalculateWithValidDiscount(): void { $calculator = new DiscountCalculator(); $result = $calculator->calculate(1000, 20); $this->assertEquals(800.0, $result); }

public function testCalculateWithZeroPercent(): void { $calculator = new DiscountCalculator(); $result = $calculator->calculate(500, 0); $this->assertEquals(500.0, $result); }

public function testCalculateThrowsExceptionForInvalidPercent(): void { $this->expectException(\\InvalidArgumentException::class); $calculator = new DiscountCalculator(); $calculator->calculate(100, 150); }}?>


Wichtige Prinzipien von Unit-Tests:

  • Ein Test — eine Überprüfung (ein assert).
  • Tests sollten nicht voneinander abhängen.
  • Verwenden Sie Mocks zur Isolierung externer Dienste. Zum Beispiel mit createMock() in PHPUnit.
  • Decken Sie Grenzfälle ab: null, leere Zeichenketten, negative Werte.


Integration-Testing: Überprüfung der Komponenteninteraktion

Integrationstests überprüfen, wie verschiedene Teile der Anwendung zusammenarbeiten: Klassen, Datenbanken, externe Dienste. Im Gegensatz zu Unit-Tests verwenden wir hier reale (oder nahezu reale) Abhängigkeiten.



Wann schreibt man Integrationstests?

  • Überprüfung der Interaktion mit der Datenbank (ORM, Abfragen).
  • Arbeit mit dem Dateisystem (Hochladen/Lesen von Dateien).
  • Interaktion mit externen APIs (über Test-Stubs).
  • Überprüfung der korrekten Funktion von Repositories und der Service-Schicht.


Beispiel in PHP mit PDO (ohne Framework)

<?phpuse PHPUnit\\Framework\\TestCase;

class User

Blogs

Buchempfehlungen