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:
- 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.
- 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 / Versionen | PHP | PHPUnit |
---|---|---|
Xdebug | >= 5.x | >= 4.x |
phpdbg | >= 5.6 | >= 4.8 |
PCOV | >= 7.1 | >=8.0 |
PCOV mit pcov-clobber | >= 7.1 | >= 5.x |
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.