Never Code Alone Logo Never Code Alone
Handwerkertisch im Steampunk-Stil mit goldenen Messgeräten. Im Zentrum eine beleuchtete Testreihe mit grün, rot und gelb leuchtenden Anzeigen für PHP-Testergebnisse. An den Seiten viktorianische Messinstrumente mit digitalen Displays. Das Ganze wird von warmem Lampenlicht und grünem Testleuchten erhellt.

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

Code:
          

composer require --dev brianium/paratest

Erste Schritte

Nach der Installation könnt ihr Paratest direkt nutzen:

Code:
          

# Basis-Ausführung
vendor/bin/paratest

# Mit 4 parallelen Prozessen
vendor/bin/paratest -p4

Grundlegende Verwendung

Die wichtigsten Kommandozeilenoptionen

Code:
          

# 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

Code:
          

# Maximale Prozesse basierend auf euren CPU-Kernen
vendor/bin/paratest -p$(nproc)

# Detaillierte Ausgabe für Debugging
vendor/bin/paratest --verbose

Runner-Optionen

Code:
          

# WrapperRunner für isolierte Prozesse
vendor/bin/paratest --runner WrapperRunner

# SqliteRunner für eure datenbankbasierten Tests
vendor/bin/paratest --runner SqliteRunner

CYPRESS.IO Ambassador und IT Consultant für QA Engenieering und Qualität in PHP Projekten.

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

Code:
          

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

Code:
          

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

Code:
          

class ExampleTest extends TestCase
{
   protected function setUp(): void
   {
       parent::setUp();
       // Unique Identifiers für eure parallelen Tests
       $this->identifier = uniqid('test_');
   }
}

Datenbankzugriffe optimieren

Code:
          

// 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.

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.

Paratest excluded groups github issue