Testen in PHP: Überblick über Frameworks und Tools (PHPUnit, Pest, Codeception)

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

Testen in PHP: Frameworks und Tools



Codequalität ist die Grundlage eines erfolgreichen Webprojekts. Für PHP-Entwickler ist das Testen keine Option mehr, sondern ein obligatorischer Entwicklungsschritt. In diesem Artikel betrachten wir drei Schlüsselwerkzeuge: PHPUnit (Industriestandard), Pest (moderner Minimalismus) und Codeception (Integrationstests). Sie erfahren, wie Sie Unit-Tests schreiben, mit Mock-Objekten arbeiten und TDD in PHP-Projekte integrieren.



1. PHPUnit – Fundament des PHP-Testens



PHPUnit ist der De-facto-Standard für Modultests in PHP. Es ist Bestandteil von Symfony, Laravel und anderen gängigen Frameworks.



Installation und Basistest

composer require --dev phpunit/phpunit


Beispiel eines einfachen Tests für eine Rechner-Klasse:

// src/Calculator.phpclass Calculator {    public function add($a, $b) {        return $a + $b;    }}

// tests/CalculatorTest.phpuse PHPUnit\\Framework\\TestCase;

class CalculatorTest extends TestCase { public function testAddition() { $calc = new Calculator(); $this->assertEquals(4, $calc->add(2, 2)); }}


Arbeiten mit Mock-Objekten

PHPUnit bietet einen integrierten Mechanismus zum Erstellen von Stubs (Mocks):

public function testUserRepository() {    $mockRepo = $this->createMock(UserRepository::class);    $mockRepo->method('findById')             ->willReturn(new User(1, 'Alice'));

$service = new UserService($mockRepo); $result = $service->getUser(1); $this->assertEquals('Alice', $result->getName());}


2. Pest – elegante Syntax für Tests



Pest ist ein Wrapper um PHPUnit, der eine prägnantere und lesbarere Syntax bietet. Ideal für Projekte, bei denen die Geschwindigkeit des Testschreibens wichtig ist.



Installation und Beispiel

composer require --dev pestphp/pest


Vergleichen Sie mit PHPUnit: Derselbe Test sieht in Pest so aus:

// tests/CalculatorTest.phpit('calculates addition', function () {    $calc = new Calculator();    expect($calc->add(2, 2))->toBe(4);});


Erweiterte Funktionen

  • Higher Order Tests – Aufrufketten ohne Verschachtelung
  • Architecture Testing – Überprüfung der Klassenstruktur
  • Snapshot Testing – Vergleich mit Referenzdaten


3. Codeception – für Integrations- und Funktionstests



Codeception vereint Unit-, Funktions- und Abnahmetests in einem Framework. Unterstützt Selenium, Symfony, Laravel, Yii und sogar WordPress.



Teststruktur

codecept generate:cest acceptance LoginCest


Beispiel eines Funktionstests für Laravel:

// tests/functional/UserCest.phpclass UserCest {    public function testLogin(FunctionalTester $I) {        $I->amOnPage('/login');        $I->fillField('email', 'user@example.com');        $I->fillField('password', 'secret');        $I->click('Login');        $I->see('Dashboard');    }}


4. Zusätzliche Werkzeuge



  • Mockery – flexible Bibliothek für Mock-Objekte (Alternative zu den integrierten Mocks von PHPUnit)
  • PHPStan / Psalm – statische Analyse, die Fehler vor dem Testlauf erkennt
  • Infection – Mutationstests: Überprüft die Qualität der Tests selbst
  • PHP CodeSniffer – Überwachung der Einhaltung von PSR-12


5. Praxisbeispiel: TDD für einen API-Service



Wir implementieren einen einfachen TDD-Zyklus (Test-Driven Development) für einen Bestellservice:



Schritt 1. Test schreiben

// tests/OrderServiceTest.phppublic function testCrea                    

Empfehlungen