Codeabdeckung durch Tests in JavaScript: Tools und Metriken
\n\nStellen Sie sich vor, Sie sind der Kapitän eines riesigen Ozeandampfers. Ihr Team überprüft gewissenhaft die Motoren, die Navigation und die Sicherheitssysteme. Doch eines Tages entscheiden Sie sich, das Kühlsystem nicht zu überprüfen, weil „es gestern noch funktioniert hat“. Das Ergebnis ist vorhersehbar: Überhitzung, Panne, und Sie treiben auf offener See. In der Welt von JavaScript nennt man diese Sorglosigkeit „fehlende Codeabdeckung durch Tests“.
\n\nSie schreiben Tests – das ist großartig. Aber wie können Sie sicher sein, dass Sie wirklich alles überprüft haben und nicht nur eine Illusion von Sicherheit geschaffen haben? Die Antwort sind Codeabdeckungsmetriken. Sie zeigen, welcher Teil Ihrer Anwendung während der Tests ausgeführt wurde. Ohne diese Metriken riskieren Sie, einen kritischen Fehler zu übersehen, der sich in einem ungetesteten Bedingungszweig versteckt.
\n\nIn diesem Artikel werden wir uns ansehen, wie man die Codeabdeckung durch Tests in JavaScript richtig misst, welche Tools es dafür gibt und wie man die Metriken interpretiert, um sich selbst nicht zu schaden. Tauchen wir ein in die Welt des Code Coverage – ohne Langeweile!
\n\nWas ist Codeabdeckung und warum ist sie wichtig?
\n\nCodeabdeckung (Code Coverage) ist eine Metrik, die angibt, wie viele Zeilen, Funktionen oder Verzweigungen Ihres Codes bei der Ausführung der Tests durchlaufen wurden. Einfach ausgedrückt ist es der Prozentsatz des „geprüften“ Codes.
\n\nViele Entwickler betrachten 100% Abdeckung als den heiligen Gral. Das ist aber nicht ganz richtig. Abdeckung ist ein Werkzeug, kein Ziel. Sie hilft dabei:
\n\n- \n
- „Toten“ Code zu finden, der nie ausgeführt wird (und möglicherweise nicht benötigt wird). \n
- Zu verstehen, welche Codebereiche ohne Tests geblieben sind, und das Risiko einzuschätzen. \n
- Das Vertrauen in Refactorings zu stärken: Wenn die Abdeckung nicht gesunken ist, haben Sie nichts kaputt gemacht. \n
Es gibt jedoch auch Fallstricke. 100% Abdeckung garantiert nicht die Abwesenheit von Fehlern. Sie können alle Zeilen überprüfen, aber einen logischen Fehler in den Geschäftsregeln übersehen. Daher sollte die Testabdeckung von JavaScript immer im Zusammenhang mit der Qualität der Tests selbst betrachtet werden.
\n\nDie wichtigsten Metriken der Codeabdeckung
\n\nBevor wir ein Tool auswählen, schauen wir uns an, welche Metriken es gibt. Codeabdeckungsmetriken werden in verschiedene Typen unterteilt, und jeder beantwortet eine eigene Frage.
\n\nZeilenabdeckung (Line Coverage)
\nDie einfachste Metrik. Sie zeigt, wie viele Zeilen des Quellcodes mindestens einmal ausgeführt wurden. Wenn Sie 100 Zeilen haben und die Tests 80 ausführen, beträgt die Zeilenabdeckung 80%.
\n\nVerzweigungsabdeckung (Branch Coverage)
\nEine tiefere Metrik. Sie analysiert alle möglichen Ausführungspfade des Codes (if/else-Zweige, ternäre Operatoren, switch). Wenn Sie zum Beispiel eine Bedingung if (a > 5) haben, gibt es zwei Zweige: true und false. Wenn Ihr Test nur den Fall prüft, in dem a > 5 ist, beträgt die Verzweigungsabdeckung 50%.
Funktionsabdeckung (Function Coverage)
\nZeigt an, wie viele Funktionen (oder Methoden) während der Tests aufgerufen wurden. Wenn eine Funktion deklariert, aber nie aufgerufen wird, ist sie nicht abgedeckt.
\n\nAnweisungsabdeckung (Statement Coverage)
\nÄhnlich der Zeilenabdeckung, arbeitet aber nicht mit Zeilen, sondern mit einzelnen Anweisungen (Ausdrücken). In JavaScript überschneiden sich diese Konzepte oft, formal sind sie jedoch unterschiedlich.
\n\nFür reale Projekte umfasst die JS-Abdeckungsanalyse in der Regel alle vier Metriken. Das Hauptaugenmerk sollte jedoch auf der Verzweigungsabdeckung liegen, da sie übersehene Szenarien aufdeckt.
\n\nTools zur Messung der Abdeckung in JavaScript
\n\nGlücklicherweise ist das JavaScript-Ökosystem reich an Tools. Wir betrachten die beliebtesten: von einfachen bis hin zu fortgeschrittenen.
\n\nIstanbul (nyc) – der Goldstandard
\nIstanbul ist das beliebteste Tool zur Messung der Codeabdeckung durch Tests in JavaScript. Es funktioniert mit praktisch jedem Test-Runner: Jest, Mocha, Ava, Cypress. Nach der Installation starten Sie die Tests einfach mit dem Wrapper nyc.
Beispiel für Installation und Start: