TDD in PHP: testgetriebene Entwicklung für ein reales Projekt

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 ist TDD zum Standard für PHP-Entwickler geworden?

Stellen Sie sich vor: Sie schreiben Code, führen ihn aus, sehen einen Fehler, beheben ihn – und das im Kreis. Kommt Ihnen bekannt vor? Und jetzt stellen Sie sich vor, Sie schreiben zuerst einen Test, der garantiert fehlschlägt, dann den minimalen Code, damit er besteht, und erst dann refaktorieren Sie. Das ist TDD in PHP – testgetriebene Entwicklung, die Chaos in ein geordnetes System verwandelt.

Viele Entwickler haben Angst vor TDD: „Das verlangsamt doch die Entwicklung!“, „Ich weiß nicht, wie ich Legacy-Code testen soll“, „PHPUnit ist kompliziert“. Aber in der Praxis spart TDD Stunden beim Debuggen und macht Code widerstandsfähig gegenüber Änderungen. In diesem Artikel analysieren wir TDD anhand realer PHP-Beispiele, zeigen, wie der „Rot-Grün-Refactoring“-Zyklus funktioniert, und geben fertige Vorlagen für die Einführung.



Was ist TDD und wie funktioniert es in PHP?

Testgetriebene Entwicklung (Test-Driven Development) ist eine Methodik, bei der Tests vor der Implementierung geschrieben werden. Der grundlegende Zyklus sieht so aus:

  • Rot – Wir schreiben einen Test, der nicht bestanden wird (wir erwarten einen Fehler).
  • Grün – Wir schreiben den minimalen Code, damit der Test bestanden wird.
  • Refactoring – Wir verbessern den Code, ohne das Verhalten zu ändern.

In PHP wird für TDD am häufigsten PHPUnit verwendet – ein leistungsstarkes Framework für Unit-Tests. Aber TDD geht nicht um Werkzeuge, sondern um Disziplin. Sehen wir uns an, wie das in der Praxis funktioniert.



Beispiel 1: Testen eines einfachen Taschenrechners

Angenommen, wir brauchen eine Funktion zum Addieren zweier Zahlen. Ohne TDD würden wir schreiben:

function add($a, $b) {    return $a + $b;}echo add(2, 3); // 5

Mit TDD schreiben wir zuerst den Test:

use PHPUnit\\Framework\\TestCase;

class CalculatorTest extends TestCase { public function testAdd() { $calculator = new Calculator(); $result = $calculator->add(2, 3); $this->assertEquals(5, $result); }}

Wir führen ihn aus – der Test schlägt fehl (rot). Wir schreiben die minimale Implementierung:

class Calculator {    public function add($a, $b) {        return $a + $b;    }}

Der Test wird bestanden (grün). Refactoring ist nicht nötig – der Code ist einfach. Aber wenn wir eine Verarbeitung negativer Zahlen hinzufügen wollten, würden wir zuerst einen Test für diesen Fall schreiben.



Beispiel 2: TDD für die Arbeit mit einer Datenbank

Oft heißt es: „TDD ist nicht für Datenbanken geeignet.“ Das ist ein Mythos. Verwenden Sie Mocks und Testdatenbanken. Betrachten wir ein Beispiel mit UserRepository:

class UserRepositoryTest extends TestCase {    public function testFindUserById() {        $pdoMock = $this->createMock(PDO::class);        $stmtMock = $this->createMock(PDOStatement::class);                $pdoMock->method('prepare')                ->willReturn($stmtMock);        $stmtMock->method('fetch')                 ->willReturn(['id' => 1, 'name' => 'Alex']);                $repository = new UserRepository($pdoMock);        $user = $repository->findById(1);                $this->assertEquals('Alex', $user['name']);    }}

Der Test prüft, ob das Repository das SQL korrekt aufruft und das Ergebnis verarbeitet. Der Implementierungscode wird minimal sein: einfach die Abfrage ausführen und die Daten zurückgeben.



Beliebte Werkzeuge für TDD in PHP

Damit TDD Teil Ihres Workflows wird, müssen Sie einige Werkzeuge beherrschen:

  • PHPUnit – das wichtigste Framework für Tests. Installation: composer require --dev phpunit/phpunit.
  • Mockery – eine Bibliothek zum Erstellen von Mocks mit einer flexiblen API.
  • Prophecy – eine Alternative zu Mockery, die oft mit Symfony verwendet wird.
  • PHPStan / Psalm – statische Analyse, die TDD ergänzt, indem sie Fehler vor der Testausführung findet.

Für Integrationstests können Sie Laravel Dusk oder Symfony Panther verwenden, aber für den Anfang reicht

Blogs

Buchempfehlungen