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/phpunitBeispiel 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/pestVergleichen 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 LoginCestBeispiel 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 Auch in der Bibliothek
Konfiguration von PHP-Anwendungen: Bibliotheken und Werkzeuge zur Verwaltung von Einstellungen
Rate Limiting in Swift: Begrenzung der Anforderungsrate für iOS und macOS
Kotlin Standardbibliothek: vollständiger Überblick und Beispiele
Arbeit mit S3 und Cloud-Speichern in Java: AWS SDK und MinIO