Zum Hauptinhalt springen

Code-Coverage & Mutation-Testing — Treiber-Setup

Wie du einen Coverage-Treiber aktivierst, damit just test-coverage, just test-mutate und just all echte Coverage/Mutation laufen lassen statt sie zu überspringen. Mit Fokus auf Laravel Herd (Mac).


Wann braucht man einen Coverage-Treiber?

Ein Coverage-Treiber (Xdebug oder PCOV — eines reicht) ist nötig für:

  • php artisan test --coverage → Coverage-Report.
  • Mutation-Testing (composer mutate / just test-mutate) → Pflicht: Mutation misst, welche Code-Zeilen ein Test abdeckt, um nur abgedeckten Code zu mutieren.

Ohne Treiber bricht composer mutate mit Mutation testing requires code coverage to be enabled ab.

Verhalten der just-Rezepte (kein Treiber = kein Crash)

just test-coverage und just test-mutate — und damit auch just allerkennen automatisch, ob Xdebug oder PCOV aktiv ist:

  • Kein Treiber aktiv: Der Schritt wird sauber übersprungen (mit Warnung), just all läuft weiter (Tests/Browser kommen trotzdem dran).
  • Treiber aktiv: Die Rezepte setzen automatisch XDEBUG_MODE=coverage.

→ Du musst also nur einen Treiber aktivieren, den Rest erledigen die Rezepte.


Laravel Herd (Mac) — empfohlen: Xdebug

Wichtig: Herd bringt eine eigene, statisch gebaute PHP mit — nicht die von Homebrew. Deshalb:

  • brew install … / pecl install pcov greift nicht in Herds PHP. PCOV ist auf Herd der unbequeme Weg (siehe unten).
  • Herd liefert Xdebug bereits mit → das ist hier der richtige Coverage-Treiber.

Schritte

  1. Xdebug in Herd aktivieren — in der Herd-App bei der aktiven PHP-Version den Xdebug-Schalter einschalten (Herd hat dafür einen eingebauten Toggle; in Herd Pro prominent unter den PHP-Einstellungen).
  2. Prüfen (CLI, denn php artisan test nutzt die CLI-PHP):
    php -m | grep -i xdebug     # muss "xdebug" zeigen
    php -v # zeigt "with Xdebug ..."
  3. Coverage-Modus — machen die just-Rezepte automatisch (XDEBUG_MODE=coverage). Manuell wäre es:
    XDEBUG_MODE=coverage php artisan test --coverage
    XDEBUG_MODE=coverage composer mutate

    Xdebug 3 startet standardmäßig nicht im Coverage-Modus — deshalb ist XDEBUG_MODE=coverage nötig. Genau das setzen die Rezepte für dich.

  4. Danach laufen just test-coverage, just test-mutate und just all mit echter Coverage.

⚠️ Mutation-Testing mit Xdebug ist langsam (Xdebug ist als Debugger schwergewichtig). composer mutate nutzt --covered-only, trotzdem mit deutlicher Laufzeit rechnen. Die normale Suite (just test) bleibt die Hauptabsicherung; Mutation ist die Kür.

Alternative: PCOV über separate Homebrew-PHP (nur wenn wirklich gewünscht)

PCOV ist schneller als Xdebug, lässt sich aber nicht in Herds statische PHP einklinken. Nur sinnvoll, wenn du die Tests bewusst unter einer eigenständigen Homebrew-PHP (statt Herds PHP) laufen lässt — ein Parallel-Setup:

brew install php            # eigenständige Homebrew-PHP, neben Herd
pecl install pcov # installiert PCOV in die Homebrew-PHP
which php # MUSS auf die Homebrew-PHP zeigen, nicht auf Herd
php -m | grep pcov

Für die meisten Herd-Nutzer unnötig — bleib bei Xdebug.


Linux / CI (Referenz)

Dort ist PCOV (schnell, coverage-only) die beste Wahl:

# Debian/Ubuntu (PHP-Version anpassen):
sudo apt install php8.4-pcov
# oder generisch via PECL:
pecl install pcov && echo "extension=pcov.so" | sudo tee /etc/php/8.4/cli/conf.d/20-pcov.ini

# prüfen:
php -m | grep pcov # muss "pcov" zeigen

Schnell-Check

php -m | grep -iE 'xdebug|pcov'   # zeigt es einen Treiber? Dann läuft Coverage/Mutation.
just test-coverage # mit Treiber: echte Coverage; ohne: normale Suite
just test-mutate # mit Treiber: Mutation; ohne: sauber übersprungen