
Inhaltsverzeichnis
Paratest: PHPUnit Tests bis zu 10x schneller ausführen - Der ultimative Performance Guide 2024
Als erfahrene PHP Consulting Agentur kennen wir das Problem: Mit wachsenden Projekten werden auch die Testsuiten immer umfangreicher und langsamer. Paratest hat sich in unseren Enterprise-Projekten als Game-Changer erwiesen - es ermöglicht uns, PHPUnit-Tests parallel auszuführen und damit die Testdauer drastisch zu reduzieren. In unseren CI/CD-Pipelines konnten wir die Testzeiten durch Paratest teilweise um bis zu 90% verkürzen.
Installation und Einrichtung
Systemvoraussetzungen
- PHP 7.4 oder höher
- PHPUnit 9.0 oder höher
- Composer
Installation via Composer
composer require --dev brianium/paratest
Erste Schritte
Nach der Installation könnt ihr Paratest direkt nutzen:
# Basis-Ausführung
vendor/bin/paratest
# Mit 4 parallelen Prozessen
vendor/bin/paratest -p4
Grundlegende Verwendung
Die wichtigsten Kommandozeilenoptionen
# Spezifisches Testverzeichnis
vendor/bin/paratest tests/Unit
# Bestimmte Testdatei
vendor/bin/paratest tests/Unit/ExampleTest.php
# Mit eurer PHPUnit-Konfiguration
vendor/bin/paratest -c phpunit.xml
Test-Gruppierung
# Gruppierte Tests ausführen
vendor/bin/paratest --group slow
# Tests mit bestimmtem Suffix
vendor/bin/paratest --test-suffix Integration
Fortgeschrittene Konfiguration
Performance-Optimierung
# Maximale Prozesse basierend auf euren CPU-Kernen
vendor/bin/paratest -p$(nproc)
# Detaillierte Ausgabe für Debugging
vendor/bin/paratest --verbose
Runner-Optionen
# WrapperRunner für isolierte Prozesse
vendor/bin/paratest --runner WrapperRunner
# SqliteRunner für eure datenbankbasierten Tests
vendor/bin/paratest --runner SqliteRunner

Erreichen Sie unsere PHP Consultant Spezialisten
Wir sind Experten für PHP und helfen Ihnen, Ihre digitalen Herausforderungen zu meistern. Unser erfahrenes Team unterstützt Sie bei PHP Updates, PHP Refactoring und berät Sie remote zu allen Fragen rund um PHP. Mit unseren vollautomatischen CI/CD Deployments und einer robusten Docker-Infrastruktur bringen wir Ihre PHP-Projekte auf das nächste Level. Vertrauen Sie auf unsere Expertise für zuverlässige und skalierbare PHP-Lösungen.
Integration in CI/CD-Pipelines
GitLab CI/CD Beispiel
test:
stage: test
script:
- composer install --no-interaction
- vendor/bin/paratest -p$(nproc) --coverage-text
artifacts:
reports:
coverage_report:
coverage_format: cobertura
path: coverage/cobertura-coverage.xml
GitHub Actions Beispiel
name: Tests
on: [push, pull_request]
jobs:
test:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v2
- name: Run Tests
run: vendor/bin/paratest -p4 --coverage-clover=coverage.xml
Best Practices & Optimierung
Die optimale Prozessanzahl finden
Die ideale Anzahl paralleler Prozesse hängt von mehreren Faktoren ab:
- Verfügbare CPU-Kerne
- Euer Arbeitsspeicher
- Art eurer Tests (I/O- vs. CPU-lastig)
Tipp: Startet mit der Anzahl eurer CPU-Kerne und experimentiert von dort aus.
Test-Isolation sicherstellen
class ExampleTest extends TestCase
{
protected function setUp(): void
{
parent::setUp();
// Unique Identifiers für eure parallelen Tests
$this->identifier = uniqid('test_');
}
}
Datenbankzugriffe optimieren
// Separate Datenbank-Verbindung pro Prozess
protected function getConnection()
{
return new PDO(
sprintf(
'mysql:host=localhost;dbname=test_%s',
getenv('TEST_TOKEN')
),
'user',
'password'
);
}
FAQ Paratest für PHPUnit
Was ist die ideale Anzahl an Prozessen für Paratest?
Die ideale Prozessanzahl liegt typischerweise bei einem Prozess weniger als eure verfügbaren CPU-Kerne. Bei einem 8-Kern-System startet also am besten mit 7 Prozessen und passt die Zahl basierend auf eurer Performance an.
Warum laufen meine Tests mit Paratest manchmal langsamer?
Eine langsamere Ausführung entsteht meist durch Ressourcenkonflikte. Überprüft die Anzahl eurer Prozesse, stellt sicher, dass eure Tests wirklich isoliert sind und keine gemeinsamen Ressourcen wie Datenbanken oder Dateien verwenden.
Muss ich meine PHPUnit-Tests für Paratest anpassen?
Nein, Paratest ist vollständig kompatibel mit Standard-PHPUnit-Tests. Ihr könnt eure existierenden Tests ohne Änderungen weiterverwenden.
Wie gehe ich mit Datenbankabhängigen Tests um?
Nutzt für jeden Testprozess eine eigene Datenbankverbindung mit einem unique Identifier. Der SqliteRunner oder das Anlegen temporärer Testdatenbanken pro Prozess sind hierfür bewährte Strategien.
Kann ich Paratest in meiner CI/CD-Pipeline verwenden?
Ja, Paratest lässt sich hervorragend in CI/CD-Pipelines integrieren. Nutzt den Befehl -p$(nproc) um automatisch die optimale Prozessanzahl für euren CI-Server zu ermitteln.
Wie funktioniert das Coverage-Reporting mit Paratest?
Paratest unterstützt alle PHPUnit-Coverage-Formate. Aktiviert es einfach mit --coverage-clover oder --coverage-html. Beachtet aber, dass Coverage-Reports die Testausführung verlangsamen.
Was tun, wenn Tests sporadisch fehlschlagen?
Sporadische Fehler deuten meist auf nicht-isolierte Tests hin. Überprüft eure Test-Setups auf gemeinsam genutzte Ressourcen und stellt sicher, dass jeder Test seine eigene Umgebung hat.
Kann ich bestimmte Tests von der Parallelisierung ausschließen?
Ja, nutzt die --group oder --exclude-group Option um bestimmte Tests von der parallelen Ausführung auszunehmen. Dies ist besonders nützlich für Tests, die nicht thread-safe sind.
Wie debugge ich Probleme mit Paratest?
Aktiviert den verbose-Mode mit --verbose und nutzt den WrapperRunner für bessere Fehlermeldungen. Dies gibt euch detaillierte Einblicke in die Testausführung und mögliche Probleme.
Kann Paratest mit verschiedenen PHP-Versionen verwendet werden?
Ja, Paratest unterstützt alle PHP-Versionen ab 7.4. Stellt einfach sicher, dass ihr die kompatible Paratest-Version für eure PHP-Version verwendet.
Fazit
Paratest ist ein unverzichtbares Tool für eure moderne PHP-Entwicklung. Die Implementierung von Paratest führt besonders in größeren Projekten zu erheblichen Zeitersparnissen. Die anfängliche Einrichtungszeit wird durch die gewonnene Entwicklungsgeschwindigkeit mehr als kompensiert.
Weiterführende Ressourcen
Offizielles GitHub-Repository von ParaTest
Das offizielle Repository enthält den Quellcode, Dokumentation, Issues und Releases. Hier finden Sie alle technischen Details und können zur Entwicklung beitragen.
https://github.com/paratestphp/paratest
ParaTest-Dokumentation
Die offizielle Dokumentation bietet eine umfassende Anleitung zur Installation, Konfiguration und Verwendung von ParaTest.
https://github.com/paratestphp/paratest#documentation
Bilder zu ParaTest aus dem Internet Medium und GitHub
Images aus Präsentationen und Blog Posts der Open Source Community.

Präsentationsfolie mit der Hauptüberschrift "BOOST YOUR PHP TESTING SPEED WITH PARATEST" in dynamischer Typografie. Links der weiße und türkisfarbene Text auf dunkelblauem Hintergrund, rechts eine stilisierte Illustration von drei Zahnrädern in hellblau, verbunden durch türkisfarbene Pfeile, die einen parallelen Prozessablauf symbolisieren.

GitHub Issue #314 mit dem Titel "Excluded groups still appear to be run by default in paratest", zeigt eine Diskussion über Testgruppen-Konfiguration. Die Problemstellung ist mit einem roten X-Symbol gekennzeichnet.

Zwei-teiliger Terminal-Output: Oben ein erfolgreicher Test zur Überprüfung der Schreibrechte im /tmp Ordner mit grünem Häkchen. Darunter ein fehlgeschlagener Test mit roter Fehlermarkierung, der eine ParaTest\Coverage\EmptyCoverageFileException in CoverageMerger.php zeigt.

Terminal-Fenster mit Testergebnissen eines Laravel Artisan Befehls. Zeigt einen Fortschrittsbalken mit 85 von 85 Tests (100%), Ausführungszeit von 2,5 Sekunden und Speicherverbrauch von 20 MB. Grüne Erfolgsmeldung bestätigt 85 erfolgreiche Tests mit 5485 Assertions.

Verzeichnisstruktur eines PHP-Testordners mit fünf Testdateien: SlowFiveTest.php, SlowFourTest.php, SlowOneTest.php, SlowThreeTest.php und SlowTwoTest.php, alle innerhalb des paratest-sample/test Verzeichnisses.

Kommandozeilen-Hilfe für ParaTest mit violettem Hintergrund. Zeigt verfügbare Optionen wie -p (Prozessanzahl), -f (Funktionale Tests) und -c (Konfigurationsdatei). Die Dokumentation listet Standardwerte und Verwendungszweck jeder Option auf.
