Facebook
Twitter
Google+
Kommentare
2

Pfadabdeckung vs. Codeabdeckung

Da ich ja in meinem gestrigen Beitrag über 100% Pfad- bzw. Codeabdeckung geredet habe, möchte ich heute doch noch mal genauer erklären, wo denn überhaupt der Unterschied zwischen den beiden liegt. Als erstes möchte ich noch mal eines wiederholen. Beide Abdeckungen sind in „lebenden“ Projekten leider kaum zu finden und sehr auch sonst schwer herzustellen. Aber fangen wir doch einfach an. Wenn wir hier über Abdeckung reden, dann gilt dies immer nur für den Kontext des Testens und in unserem speziellen Beispiel um Unit Tests.

Jetzt aber endlich zu der offiziellen meinen Definitionen:

  • Codeabdeckung (Code Coverage)
    Wenn wir über eine 100% Codeabdeckung reden, dann wissen wir, dass jede Zeile Code in unserem Projekt oder unserer Klasse nach dem Durchlauf aller Tests mindestens ein Mal durchlaufen wurde.
  • Pfadabdeckung
    Bei einer 100% Pfadabdeckung wurde jeder mögliche Pfad durch eine Methode durchlaufen. Da es immer einen Pfad gibt, der eine bestimmte Zeile im Code durchläuft (falls die Methode Sinn macht), folglich hat man bei einer vollständigen Pfadabdeckung auch eine vollständige Codeabdeckung.

Wie ihr sehen könnt ähneln sich die beiden Definitionen schon sehr. Deswegen will ich einfach ein kleines Beispiel bringen, damit klar wird, dass es einen Unterschied gibt. Ich bin einfach mal so frech und schreibe kein PHPDoc, ich hoffe ihr habt mich trotzdem noch lieb.

function doStd( $a, $b )
{
  $c = 2;
  if ( $a ) {
   $c = 1;
   $result = $a  * $c;
    // do sth
  }
  if ( $b ) {
    $result = $b / ( 1 - $c );
    // do sth else
  }
  return $result;
}

Wenn ich jetzt anfangen würde meine Tests zu schreiben, dann würde ich erst mal einen schreiben, der prüft, ob $a = true etwas sinnvolles bewirkt, danach folgt einer der auf $b = 0 testet. Wenn ich mir jetzt meine Codeabdeckung anschaue, dann bin ich bereits bei 100%. Alle möglichen Zeilen wurden durchlaufen. Was passiert aber, wenn $a und $b beide true sind? Dummerweise würde ich dann durch Null teilen und mein Code würde mit einem Error abbrechen. Ok ich weiß, eine noch blöderes beispiel gibt es kaum, aber denke trotzdem, dann klar wurde, dass nicht alles gezwungendermaßen mit einer vollständigen Codeabdeckung entdeckt hat.

Ach ja wo ich gerade dran denke: soviel ich weiß gibt es momentan kein besseres Tool für die Codeabdeckung als PHP Unit in Kombination xdebug.

Über den Autor

Nils Langner

Nils Langner ist der Gründer von "the web hates me" und auch der Hauptautor. Im wahren Leben leitet er das Qualitätsmanagementteam im Gruner+Jahr-Digitalbereich und ist somit für Seiten wie stern.de, eltern.de und gala.de aus Qualitätssicht verantwortlich. Nils schreibt seit den Anfängen von phphatesme, welches er ebenfalls gegründet hat, nicht nur für diverse Blogs, sondern auch für Fachmagazine, wie das PHP Magazin, die t3n, die c't oder die iX. Nebenbei ist er noch ein gern gesehener Sprecher auf Konferenzen. Herr Langner schreibt die Texte über sich gerne in der dritten Form.
Kommentare

2 Comments

  1. Ein allgemeines Beispiel für Pfadabdeckung ist folgendes:

    if($a == 1 || $b == 2) {}

    Man wird mit einem $a = 1 schon eine 100% Codeabdeckung haben, aber es sind eben nicht alle Pfade (Möglichkeiten) abgedeckt, denn das 2. Statement wird dank der Oder-Bedingung nie betreten, da die Code Coverage Tests aber nur zeilenweise die Coverage anzeigen, wissen wir nicht was bei $b = 2 passiert.

    Reply
  2. Danke Tobias, ich wollte in meinem Beispiel gleich konkret einen Fall zeigen, der 100% Codeabdeckung besitzt, aber trotzdem einen gravierenden Fehler beinhaltet.
    Ein Punkt, den man bei dir schön sehen kann ist die Definition von Pfad. Durch diese kurze Methode gibt es nämlich bereits zwei Pfade.

    Reply

Leave a Comment.

Link erfolgreich vorgeschlagen.

Vielen Dank, dass du einen Link vorgeschlagen hast. Wir werden ihn sobald wie möglich prüfen. Schließen