Einführung in das Testen von PHP-Anwendungen
Testen ist ein wesentlicher Bestandteil der professionellen PHP-Entwicklung. Es ermöglicht die frühzeitige Erkennung von Fehlern, vereinfacht Refactoring und erhöht die Stabilität des Codes. Im PHP-Ökosystem hat sich ein leistungsstarkes Toolkit etabliert: vom klassischen PHPUnit über moderne Frameworks wie Pest bis hin zu spezialisierten Werkzeugen für Codeabdeckungsanalyse und Mutationstests.
In diesem Artikel betrachten wir die wichtigsten Frameworks und Tools, die Ihnen helfen, qualitativ hochwertige Tests für PHP-Projekte zu organisieren.
PHPUnit – die Grundlage des Testens
PHPUnit ist der De-facto-Standard für Unit-Tests in PHP. Es unterstützt alle modernen Funktionen: Assertions, Fixtures (setUp/tearDown), Data Provider, Exception-Tests, Stubs und Mocks.
Installation über Composer:
composer require --dev phpunit/phpunitBeispiel eines einfachen Tests für eine Rechner-Klasse:
<?phpuse PHPUnit\\Framework\\TestCase;
class CalculatorTest extends TestCase{ public function testAddition() { $calculator = new Calculator(); $this->assertEquals(4, $calculator->add(2, 2)); }
/** @dataProvider additionProvider */ public function testWithDataProvider($a, $b, $expected) { $calculator = new Calculator(); $this->assertEquals($expected, $calculator->add($a, $b)); }
public function additionProvider(): array { return [ [0, 0, 0], [1, 1, 2], [-1, 1, 0], ]; }}Wichtige Funktionen von PHPUnit:
- Assertions: assertEquals, assertTrue, assertCount, assertInstanceOf und Dutzende weitere.
- Fixtures: Methoden setUp() und tearDown() zur Vorbereitung und Bereinigung der Testumgebung.
- Data Provider: Annotation @dataProvider zum Ausführen eines Tests mit verschiedenen Datensätzen.
- Exception-Tests: expectException() und expectExceptionMessage().
- Stubs und Mocks: createMock() und getMockBuilder() zur Isolation des zu testenden Codes.
Pest – elegant und modern
Pest ist ein Test-Framework, das auf PHPUnit aufbaut, aber eine prägnantere und ausdrucksstärkere Syntax bietet. Es ist von Jest (JavaScript) inspiriert und eignet sich hervorragend für Projekte, bei denen die Lesbarkeit der Tests wichtig ist.
Installation:
composer require --dev pestphp/pestBeispiel desselben Tests in Pest:
<?php
use function Pest\\Faker\\fake;
test('addition works correctly', function () { $calculator = new Calculator(); expect($calculator->add(2, 2))->toBe(4);});
dataset('numbers', [ [0, 0, 0], [1, 1, 2], [-1, 1, 0],]);
test('addition with data provider', function ($a, $b, $expected) { $calculator = new Calculator(); expect($calculator->add($a, $b))->toBe($expected);})->with('numbers');Vorteile von Pest:
- Minimaler Boilerplate-Code – keine Testklassen erforderlich.
- Integrierte Funktionen expect(), test(), it() für natürlichsprachliche Beschreibungen.
- Automatische Registrierung von Tests aus globalen Funktionen.
- Unterstützung für verschachtelte Gruppen (describe) und Architekturtests.
Codeception – für Integrations- und BDD-Tests
Codeception ist ein universelles Framework, das Unit-, funktionale, Integrations- und Akzeptanztests vereint. Es ist besonders beliebt beim Testen von Webanwendungen (Laravel, Symfony, Yii) und APIs.
Installation:
composer require --dev codeception/codeceptionBeispiel eines Akzeptanztests für die Anmeldung auf einer Website:
<?php$I = new AcceptanceTester($scenario);$I->amO