PHPUnit Test Code Coverage mit Xdebug, phpdbg oder PCOV

Vielleicht habt ihr schon einmal mit PHPUnit und Xdebug die Code Coverage für eure automatisierten Tests ermittelt (also die Information, wie viel von eurem Code durch Tests abgedeckt ist).

Dann habt ihr wahrscheinlich bemerkt, dass die Ausführung der Tests wesentlich länger dauert, wenn man Xdebug aktiviert hat.

Update für Xdebug 3!

Die Angaben in diesem Artikel stammen aus dem Juni 2020 und beziehen sich noch auf Xdebug 2, Mit Xdebug 3, das am 25.11.2020 veröffentlicht wurde, hat sich die Performance laut diesem Test um 10 bis 38% Prozent verbessert.

Das liegt unter anderem daran, dass Xdebug zwar auch für diese Art von Analyse verwendet werden kann, aber in erster Linie ein Debugging-Tool ist, das einen gewissen Overhead mit sich bringt.

Was weniger Devs wissen ist, dass es zwei schnellere Alternativen zu Xdebug gibt, die sich ohne viel Aufwand und durchaus auch mit älteren PHPUnit-/PHP-Versionen verwenden lassen: phpdbg und PCOV.

Sehen wir uns die drei Möglichkeiten an. Ihr könnt ausprobieren, was für euch die beste Lösung ist.

Code Coverage mit PHPUnit messen

Vorab ein kurzer Exkurs: die offizielle PHPUnit Dokumentation erklärt euch, wie man die Code Coverage für einen Testlauf ermittelt. Das ist für alle drei Tools gleich.

Details findet ihr unter dem Link, aber wichtig ist:

  1. Ihr müsst im <logging>-Element von phpunit.xml einige Parameter definieren. Vor allem die Whitelist, für welche Verzeichnisse und Dateien die Code Coverage ermittelt werden soll.
  2. ihr müsst PHPUnit mitteilen, dass die Code Coverage berechnet werden soll. Das geht über Kommandozeilen-Parameter oder über Settings in phpunit.xml.

Unterstützung von PHP-/PHPUnit-Versionen

Hier seht ihr, ab welchen Versionen von PHP und PHPUnit ihr die Tools einsetzen könnt:

Tool / VersionenPHPPHPUnit
Xdebug>= 5.x>= 4.x
phpdbg>= 5.6>= 4.8
PCOV>= 7.1>=8.0
PCOV mit pcov-clobber>= 7.1>= 5.x
Übersicht: mit welcher PHP/PHPUnit-Version kann man die Tools einsetzen? Anmerkung: die ersten unterstützten Versionen von PHPUnit und PHP sind wohl noch älter.

Xdebug

Die PHP-Extension Xdebug von Derick Rethans ist sicherlich die populärste Art, die Code Coverage in PHP zu messen. Wahrscheinlich auch deswegen, weil es Xdebug gefühlt schon immer gab. (Tatsächlich existiert es seit 2002.) Ich traue mich zu wetten, dass es PHPUnit und Xdebug für jede PHP-Version gibt, die ihr im Einsatz habt – auch wenn ihr dabei gelegentlich auf eine „End of Life“ Version von PHPUnit zurückgreifen müsst.

Ihr könnt Xdebug zum Beispiel über PECL oder unter Ubuntu über apt installieren:

sudo apt install php-xdebug

Sobald man sich überzeugt hat, dass Xdebug installiert ist, kann man auch schon loslegen.

Wie erwähnt: Xdebug ist ein super Debugging-Tool. Man muss sich aber berücksichtigen, dass die Ausführung der Test-Suite mit Xdebug um ein Vielfaches langsamer sein kann als ohne. Deswegen ist es wert, sich die Alternativen anzusehen.

phpdbg

phpdbg ist ein Debugging-Modul, das mit PHP 5.6 veröffentlicht wurde. PHPUnit unterstützt die Verwendung von phpdbg seit PHPUnit 4.8. Falls ihr eine Version>= 4.8 verwendet, kommt phpdbg also in Frage.

phpdbg könnt ihr unter Ubuntu ebenfalls über apt installieren, indem ihr die gewünschte PHP-Version angebt, zum Beispiel:

sudo apt-get install php7.2-phpdbg

Wenn die Installation fertig ist, habt ihr einen extra Befehl „phpdbg“, über den ihr PHPUnit aufruft:

phpdbg -qrr ./vendor/bin/phpunit --coverage-html build/

PHPUnit erkennt selbstständig, dass phpdbg verwendet wird. Ihr müsst also nichts extra konfigurieren.

Mit phpdbg sollten eure Tests gegenüber Xdebug um ein Vielfaches schneller ablaufen. Der Memory-Bedarf ist hingegen etwas größer.

PCOV

Eine weitere Alternative ist PCOV. PCOV ist ebenfalls ein PHP-Modul, das ab PHP 7.1 und PHPUnit 8 verwendet werden kann.

Auch PCOV kann unter Ubuntu über apt installiert werden:

sudo apt-get install php7.2-pcov

Weitere Installations-Möglichkeiten findet ihr im Manual.

PHPUnit 8+ erkennt selbstständig, dass PCOV installiert ist. Ihr müsst also nichts extra konfigurieren.

PCOV sollte noch einmal ein wenig schneller als phpdbg sein und benötigt nicht nur weniger RAM als phpdbg, sondern in der Regel auch etwas weniger als Xdebug.

Kompatibilität mit Xdebug und phpdbg

Beachtet: wenn PCOV aktiviert ist, könnt ihr weder Xdebug noch phpdbg verwenden. Deaktiviert PCOV in der PHP-Konfiguration, wenn ihr diese Module verwenden müsst.

Code Coverage Unterschiede zwischen Xdebug und PCOV

Auch mit PCOV erzielt ihr einen großen Performance-Gewinn gegenüber Xdebug. Beachtet, dass ihr mit PCOV andere Code Coverage Ergebnisse als mit Xdebug erhaltet. Die Ergebnisse von Xdebug sind etwas genauer. Falls ihr auf den kleinen Unterschied verzichten könnt, erhaltet ihr dafür wesentlich schnellere Ergebnisse.

PCOV für ältere PHPUnit Versionen

Wollt ihr PCOV mit älteren PHPUnit-Versionen einsetzen, dann könnt ihr das Composer-Package pcov-clobber in eurem Projekt hinzufügen. Es stellt die Kompatibilität mit PHPUnit 5, 6 und 7 her.

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht.