Eliminierung technischer Schulden mit PHPStan, Rector PHP und PHPUnit. Über 20 Jahre Praxiserfahrung in skalierbaren Backends.
- Aktualisiert:
- Autor:
- Roland Golla
Was ist otr-report?
otr-report ist ein Kommandozeilen Tool von Sebastian Bergmann, das aus den Open Test Reporting (OTR) XML Logs von PHPUnit lesbare HTML Reports erzeugt. PHPUnit schreibt diese Logs ab Version 13.2 über die Option --log-otr. Das Tool macht aus den maschinenlesbaren XML Daten genau die Auswertungen, die im Alltag zählen: welche Tests am langsamsten laufen, wie sich die Test Suite über viele CI Läufe entwickelt und wie ein einzelner Lauf im Detail ausgegangen ist.
OTR Logs sind präzise, aber für Menschen kaum lesbar. Sie protokollieren unter anderem Laufzeit, CPU Zeit und Speicherverbrauch pro Test sowie den Status jedes Testfalls. otr-report schließt diese Lücke zwischen Rohdaten und Erkenntnis: aus der XML Datei wird ein selbsterklärender Report, den Entwickler und Teams direkt im Browser auswerten können.
Das Tool ist Open Source unter BSD-3-Clause Lizenz und in der Version 1.0.1 vom 2. Juni 2026 verfügbar. Es ist bewusst auf die OTR XML Variante spezialisiert, die PHPUnit ab 13.2 schreibt und die zusätzliche PHP und PHPUnit spezifische Informationen enthält. Damit ist otr-report die natürliche Ergänzung zu PHPUnit für alle, die ihre Test Reports modernisieren wollen.
otr-report mit NCA: Schnelle Hilfe vom Testing Experten
Bei Never Code Alone arbeiten wir täglich mit PHPUnit und richten Test Suites in produktiven PHP und Symfony Projekten ein. Test Reporting ist für uns kein Randthema, sondern Teil jeder sauberen PHP Beratung: Wer weiß, welche Tests bremsen und wie sich die Suite über die Zeit entwickelt, trifft bessere Entscheidungen über Architektur, CI Laufzeit und Refactoring Prioritäten. otr-report ist dafür das passende Werkzeug, und wir ordnen es für euer Projekt ein.
Konkret helfen wir beim Aufbau moderner Test Workflows: vom Umstieg auf das OTR Format über die Integration in eure CI CD Pipeline bis zur Parallelisierung großer Suites mit Paratest. Wenn ein Legacy Projekt erst auf PHPUnit 13.2 gehoben werden muss, übernehmen das unsere Spezialisten im PHP Update und beim PHP Refactoring, automatisiert mit Rector PHP und abgesichert durch statische Analyse mit PHPStan. So wird aus einem Reporting Tool ein echter Hebel für Code Qualität.
PHP Test Reporting mit NCA professionell aufsetzen
Finde das passende Angebot für dein Projekt
Anfrage-Konfiguration
Starten Sie Ihre Anfrage
Gesetzliche Konformität & Inklusion. Optimierung von Performance und Conversion durch radikal nutzerzentriertes, universelles Design.
Skalierbare KI-Systeme mit echtem Code Ownership. CI/CD, Backup-Strategien und Infrastruktur, die mit deinem Team wächst.
Anfrage-Konfiguration
Worauf liegt dein Fokus?
Wähle die Expertise, die dein Projekt jetzt am dringendsten benötigt.
Open Test Reporting: der neue Standard für Test Logs
Jahrelang war JUnit XML das De facto Format für maschinenlesbare Test Reports. Das Problem: JUnit XML stammte ursprünglich gar nicht aus dem JUnit Projekt, sondern aus dem Ant Build Tool, und jedes Werkzeug interpretiert die Dateien etwas anders. Open Test Reporting (OTR) löst das. Das Format wurde vom JUnit Team als sprachunabhängiger und werkzeugunabhängiger Standard entworfen und protokolliert Tests als Event Stream XML.
PHPUnit hat OTR konsequent übernommen. Die Roadmap ist klar definiert und gibt die Richtung vor:
- PHPUnit 12.2 (Juni 2025): erste experimentelle Unterstützung für das OTR Format
- PHPUnit 13.1 (April 2026): OTR ist nicht mehr experimentell, JUnit XML wird deprecated
- PHPUnit 14 (Februar 2027, geplant): JUnit XML Erzeugung wird entfernt
Wer heute neue Pipelines aufsetzt, sollte direkt auf OTR setzen. Genau hier kommt otr-report ins Spiel: Es macht die OTR Logs nicht nur maschinen-, sondern menschenlesbar. Tools wie Codecov unterstützen OTR bereits, sodass der Umstieg ohne Bruch in bestehenden Pipelines möglich ist.
Die drei Befehle von otr-report im Überblick
otr-report bündelt drei Auswertungen, die im Test Alltag immer wieder gebraucht werden. Jeder Befehl liest die OTR XML Datei und beantwortet eine konkrete Frage: Welche Tests bremsen? Wie entwickelt sich die Suite über die Zeit? Und wie ist ein einzelner Lauf im Detail ausgegangen?
| Befehl | Funktion | Output |
|---|---|---|
| slowest | Listet die langsamsten Tests eines Laufs, sortierbar nach Zeit, CPU Zeit oder Speicher | Konsolen Ausgabe |
| trends | Wertet alle OTR Logs eines Verzeichnisses aus und zeigt Laufzeit und Testanzahl über viele Läufe | HTML Report |
| results | Visualisiert das Ergebnis jedes einzelnen Tests eines Laufs mit Status und Details | HTML Report |
OTR Logs erzeugen und auswerten
Damit otr-report arbeiten kann, braucht es zunächst eine OTR XML Datei. PHPUnit schreibt sie mit der Option --log-otr. Die Datei protokolliert unter anderem, wie lange jeder Test gelaufen ist.
phpunit --log-otr /tmp/otr/run.xml
Der Befehl slowest liest diese Datei und gibt die zehn langsamsten Tests aus, sortiert von langsam nach schnell. Das ist der schnellste Weg, die Tests zu finden, die die Laufzeit der Suite dominieren. Mit --limit ändert ihr die Anzahl, mit --sort wechselt ihr zwischen Laufzeit, CPU Zeit und Speicher.
otr-report slowest /tmp/otr/run.xml
# Anzahl anpassen:
otr-report slowest --limit 3 /tmp/otr/run.xml
# Nach Speicherverbrauch sortieren:
otr-report slowest --sort memory --limit 3 /tmp/otr/run.xml
Besonders praktisch ist die Option --above-mean. Sie berechnet zuerst die mittlere Laufzeit aller Tests und listet dann nur die Tests, die langsamer als der Durchschnitt sind. Jeder Test bekommt einen Faktor, der zeigt, wie viele Male langsamer als der Mittelwert er ist. So trennt ihr echte Ausreißer von der breiten Masse.
otr-report slowest --above-mean /tmp/otr/run.xml
Trends und Ergebnisse als HTML Report
Der Befehl trends liest alle OTR Logs in einem Verzeichnis und erzeugt einen einzigen HTML Report, der zeigt, wie sich eure Test Suite über mehrere Läufe entwickelt. Der Report enthält die Gesamtlaufzeit als Diagramm, die Anzahl der Tests als Diagramm, die zehn langsamsten Tests des jüngsten Laufs mit Sparkline und eine Tabelle aller Läufe. Ideal, wenn ihr pro CI Lauf ein OTR Log in ein gemeinsames Verzeichnis archiviert.
# Pro Lauf ein OTR Log sammeln:
phpunit --log-otr /tmp/otr/2026-02-02.xml
phpunit --log-otr /tmp/otr/2026-02-09.xml
phpunit --log-otr /tmp/otr/2026-02-16.xml
# Trend Report erzeugen:
otr-report trends /tmp/otr /tmp/trends.html
Der Befehl results erzeugt aus einem einzelnen Lauf einen in sich geschlossenen HTML Report, der das Ergebnis jedes Tests sichtbar macht. Er liefert eine Zusammenfassung des Laufs, eine Seitenleiste mit Baumstruktur nach Namespace, Klasse und Methode sowie pro Test den Status (SUCCESSFUL, FAILED, ERRORED, ABORTED oder SKIPPED), die Laufzeit und gemeldete Auffälligkeiten wie risky. Nicht bestandene Tests sind dabei standardmäßig aufgeklappt.
otr-report results /tmp/otr/run.xml /tmp/results.html
# Mit sprechenden TestDox Namen:
otr-report results --testdox /tmp/otr/run.xml /tmp/results.html
Mit der Option --testdox nutzt der Report die TestDox Informationen, also die lesbar aufbereiteten Klassen und Methodennamen, die PHPUnit im OTR Log mitschreibt. Fehlt diese Information bei einem Test, wird der ursprüngliche Name als Fallback verwendet.
Installation: Phive statt Composer
otr-report wird als PHP Archive (PHAR) verteilt. Ihr könnt das PHAR direkt herunterladen oder, empfohlen, über Phive verwalten. Phive ist der saubere Weg, um Tool Abhängigkeiten eines Projekts zu pflegen, ohne sie mit den Laufzeit Abhängigkeiten im Composer zu vermischen.
# Direkter PHAR Download:
wget https://phar.phpunit.de/otr-report-X.Y.phar
php otr-report-X.Y.phar --version
# Empfohlen ueber Phive:
phive install otr-report
./tools/otr-report --version
Sebastian Bergmann rät ausdrücklich davon ab, dieses Tool über Composer zu installieren. Der Grund: Tools wie otr-report sind keine Laufzeit Abhängigkeiten eurer Anwendung. Wandern sie in die composer.json, können ihre eigenen Abhängigkeiten mit denen eures Projekts kollidieren. Phive hält Werkzeuge und Projekt sauber getrennt, ein Prinzip, das wir auch in unseren Beratungsprojekten konsequent empfehlen.
otr-report in der CI CD Pipeline nutzen
Der größte Mehrwert entsteht in der Pipeline. Wenn ihr bei jedem Lauf in eurer Qualitäts Pipeline ein OTR Log mit eindeutigem Namen in ein gemeinsames Verzeichnis schreibt, könnt ihr daraus jederzeit einen Trend Report bauen. So wird Test Performance messbar statt gefühlt: Ihr seht schwarz auf weiß, wenn die Suite langsamer wird oder einzelne Tests aus dem Ruder laufen.
In Kombination mit Paratest für parallele Ausführung und sauber getrennter Patch Coverage ergibt sich ein vollständiges Bild der Test Qualität. Wer GitHub Actions oder GitLab CI nutzt, archiviert die OTR Logs einfach als Build Artefakt und generiert den Report im Anschluss. Auch funktionale Tests und Integrationstests mit dem Symfony KernelTestCase landen so in einer einheitlichen Auswertung.
Warum ein eigenes Tool für PHPUnit OTR Logs
OTR ist bewusst breit angelegt. Die offizielle otr-report README bringt es auf den Punkt:
"Open Test Reporting is language-agnostic and tool-agnostic."
– otr-report README, sebastianbergmann/phpunit-otr-report, Juni 2026
Genau deshalb braucht es ein spezialisiertes Werkzeug: Das generische OTR Format kennt keine PHP Eigenheiten. otr-report ist hingegen auf die OTR XML Variante zugeschnitten, die PHPUnit ab 13.2 schreibt und die zusätzliche Informationen wie CPU Zeit, Speicherverbrauch und TestDox Namen enthält. Aus einem universellen Standard wird so ein Report, der für PHP Teams wirklich nützlich ist.
otr-report aus der NCA Praxis
In Beratungsprojekten sehen wir regelmäßig Test Suites, die über Jahre gewachsen sind und deren Laufzeit niemand mehr im Blick hat. Genau hier setzt otr-report an: Statt zu raten, welcher Test die Pipeline ausbremst, liefert der slowest Befehl in Sekunden die Antwort. Häufig sind es wenige Ausreißer, die einen Großteil der Laufzeit verursachen, etwa weil sie ungewollt eine echte Datenbank oder externe Dienste ansprechen statt mit Test Doubles zu arbeiten.
Wir kombinieren die Auswertung gern mit Mutation Testing per Infection, um nicht nur schnelle, sondern auch aussagekräftige Tests sicherzustellen. Für die statische Absicherung setzen wir auf PHPStan und Psalm, für lokale Reproduzierbarkeit auf DDEV und Docker. Wenn ein Projekt erst auf PHPUnit 13.2 gehoben werden muss, läuft das über ein kontrolliertes PHP Update mit Rector PHP als Werkzeug. Wer tiefer in Test Reporting einsteigen will, findet im NCA PHP Glossar die passenden Bausteine von phpcov bis Patch Coverage.
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.
Häufige Fragen zu otr-report
Die wichtigsten Fragen zu otr-report, dem OTR Format und der Integration in PHPUnit und CI CD Pipelines 2026.
Was ist otr-report 2026?
otr-report ist ein Kommandozeilen Tool von Sebastian Bergmann, das aus den Open Test Reporting XML Logs von PHPUnit lesbare HTML Reports erzeugt. Es findet die langsamsten Tests, trackt Trends über mehrere Läufe und visualisiert das Ergebnis jedes einzelnen Tests. Die aktuelle Version ist 1.0.1 vom Juni 2026, lizenziert unter BSD-3-Clause.
Welche PHPUnit Version braucht otr-report 2026?
otr-report ist auf die OTR XML Variante spezialisiert, die PHPUnit ab Version 13.2 schreibt. Diese enthält zusätzliche PHP und PHPUnit spezifische Informationen wie CPU Zeit, Speicherverbrauch und TestDox Namen. Für ältere Projekte ist daher zunächst ein Update auf PHPUnit 13.2 nötig, bevor sich das Tool sinnvoll einsetzen lässt.
Wie installiere ich otr-report 2026?
otr-report wird als PHP Archive (PHAR) verteilt. Empfohlen ist die Installation über Phive mit dem Befehl phive install otr-report. Alternativ lässt sich das PHAR direkt von phar.phpunit.de herunterladen. Eine Installation über Composer wird vom Autor ausdrücklich nicht empfohlen, da Tool und Projekt Abhängigkeiten so sauber getrennt bleiben.
Was ist Open Test Reporting OTR 2026?
Open Test Reporting ist ein sprachunabhängiger und werkzeugunabhängiger Standard für Test Reports, der vom JUnit Team entworfen wurde. Tests werden als Event Stream XML protokolliert. PHPUnit unterstützt OTR seit Version 12.2 experimentell und seit 13.1 stabil. Das Format löst das in die Jahre gekommene JUnit XML als empfohlenes Logformat ab.
Löst OTR das JUnit XML Format 2026 ab?
Ja, schrittweise. Seit PHPUnit 13.1 vom April 2026 gilt OTR als nicht mehr experimentell und JUnit XML wurde deprecated. Für PHPUnit 14 im Februar 2027 ist geplant, die JUnit XML Erzeugung zu entfernen. Wer heute neue Pipelines aufsetzt, sollte deshalb direkt auf das OTR Format setzen.
Welche Befehle bietet otr-report?
Es gibt drei Befehle. slowest listet die langsamsten Tests eines Laufs, sortierbar nach Zeit, CPU Zeit oder Speicher. trends wertet alle OTR Logs eines Verzeichnisses aus und zeigt die Entwicklung über viele Läufe als HTML Report. results visualisiert das Ergebnis jedes Tests eines einzelnen Laufs als HTML Report.
Wie finde ich die langsamsten Tests in meiner Suite?
Mit dem Befehl otr-report slowest und einer OTR XML Datei bekommt ihr die zehn langsamsten Tests, sortiert von langsam nach schnell. Die Option --above-mean berechnet zusätzlich die mittlere Laufzeit und zeigt nur Tests oberhalb des Durchschnitts mit Faktor an. So trennt ihr echte Ausreißer schnell von der breiten Masse.
Was macht der trends Befehl genau?
trends liest alle OTR Logs in einem Verzeichnis und erzeugt einen HTML Report über die Entwicklung der Test Suite. Der Report zeigt Gesamtlaufzeit und Testanzahl als Diagramme, die zehn langsamsten Tests des jüngsten Laufs mit Sparkline und eine Tabelle aller Läufe. Ideal, wenn pro CI Lauf ein Log archiviert wird.
Warum sollte otr-report nicht über Composer installiert werden?
otr-report ist eine Tool Abhängigkeit, keine Laufzeit Abhängigkeit eurer Anwendung. Landet es in der composer.json, können seine eigenen Abhängigkeiten mit denen des Projekts kollidieren. Phive verwaltet solche Werkzeuge getrennt vom Projekt und vermeidet genau diese Konflikte. Deshalb empfiehlt Sebastian Bergmann Phive als saubere Installationsmethode.
Ist otr-report kostenlos und Open Source?
Ja. otr-report steht unter der BSD-3-Clause Lizenz und ist damit frei nutzbar, auch in kommerziellen Projekten. Der Quellcode liegt öffentlich auf GitHub im Repository sebastianbergmann/phpunit-otr-report. Wie PHPUnit selbst ist das Tool Teil des offenen PHP Ökosystems und wird von Sebastian Bergmann gepflegt.
Wie integriere ich otr-report in GitHub Actions oder GitLab CI?
Schreibt bei jedem Testlauf mit phpunit --log-otr ein OTR Log mit eindeutigem Namen und archiviert es als Build Artefakt in einem gemeinsamen Verzeichnis. Anschließend erzeugt otr-report trends daraus einen Trend Report über alle Läufe. So wird die Entwicklung der Test Performance über die Zeit in eurer Pipeline sichtbar und messbar.
Was ist der Unterschied zwischen results und trends?
results betrachtet einen einzelnen Testlauf und zeigt den Status jedes Tests im Detail, inklusive Fehlern, Laufzeit und Auffälligkeiten wie risky. trends betrachtet dagegen viele Läufe und zeigt die Entwicklung von Laufzeit und Testanzahl über die Zeit. results beantwortet wie lief dieser Lauf, trends beantwortet wie entwickelt sich die Suite.