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.
Bilder zu ParaTest aus dem Internet Medium und GitHub
Images aus Präsentationen und Blog Posts der Open Source Community.