Wie lese ich einen Istanbul Coverage Report?

131

Ich habe Jasmine immer für meine Unit-Tests verwendet, aber seit kurzem benutze ich Istanbul, um mir Berichte zur Codeabdeckung zu geben. Ich meine, ich verstehe, was sie mir zu sagen versuchen, aber ich weiß nicht wirklich, was jeder dieser Prozentsätze darstellt (Stmts, Branches, Funcs, Lines). Bisher konnte ich beim Googeln keine solide Erklärung / Ressource finden.

Frage : Wie gesagt, ich verstehe das Wesentliche, aber kann jemand entweder eine richtige Erklärung oder einen Link zu einer richtigen Erklärung posten?

Tertiäre Frage : Gibt es eine Möglichkeit festzustellen, welche spezifischen Teile Ihres Codes nicht abgedeckt sind? Bisher, ohne diesen Bericht wirklich zu kritisieren, schätze ich im Grunde.

-------------------|-----------|-----------|-----------|-----------|
File               |   % Stmts |% Branches |   % Funcs |   % Lines |
-------------------|-----------|-----------|-----------|-----------|
   controllers/    |      88.1 |     77.78 |     78.57 |      88.1 |
      dashboard.js |      88.1 |     77.78 |     78.57 |      88.1 |
-------------------|-----------|-----------|-----------|-----------|
All files          |      88.1 |     77.78 |     78.57 |      88.1 |
-------------------|-----------|-----------|-----------|-----------|
Scott Schwert
quelle
3
Wenn Sie Istanbul ausführen, sollte auch eine HTML-Datei für den Bericht erstellt werden (sollte sich im Coverage-Ordner befinden). Dieser HTML-Code sollte Ihnen Drilldown-Informationen geben, wenn Sie auf Dateien / Ordner klicken
Yaron Schwimmer
Danke @yarons. Dies hilft definitiv dabei, die Abdeckung zu untersuchen und festzustellen, was speziell nicht abgedeckt wird. Ich weiß immer noch nicht wirklich verstehen , in der Tiefe , was die Prozentsätze bedeuten = /.
Scott Sword

Antworten:

217

Es gibt eine Reihe von Abdeckungskriterien, die wichtigsten sind:

  • Funktionsabdeckung Wurde jede Funktion (oder Unterroutine) im Programm aufgerufen?
  • Anweisungsabdeckung Wurde jede Anweisung im Programm ausgeführt?
  • Zweigabdeckung Wurde jeder Zweig (auch DD-Pfad genannt) jeder Kontrollstruktur (z. B. in if- und case-Anweisungen) ausgeführt? Wurden beispielsweise bei einer if-Anweisung sowohl der wahre als auch der falsche Zweig ausgeführt? Eine andere Art, dies zu sagen, ist, wurde jede Kante im Programm ausgeführt?
  • Zeilenabdeckung Wurde jede ausführbare Zeile in der Quelldatei ausgeführt?

In jedem Fall stellt der Prozentsatz den ausgeführten Code gegenüber dem nicht ausgeführten Code dar , der jedem Bruch im Prozentformat entspricht (z. B. 50% Verzweigungen, 1/2).

Im Dateibericht:

  • 'E' steht für 'sonst Pfad nicht genommen', was bedeutet, dass für die markierte if / else-Anweisung der 'if'-Pfad getestet wurde, nicht jedoch der' else '.
  • 'I' steht für "wenn der Weg nicht genommen wird", was der umgekehrte Fall ist: das "wenn" wurde nicht getestet.
  • Die xNlinke Spalte gibt an, wie oft diese Zeile ausgeführt wurde.
  • Nicht ausgeführte Zeilen oder Codeteile werden rot hervorgehoben.

Dies wurde für Istanbul v0.4.0 überprüft. Ich bin mir nicht sicher, ob dies für nachfolgende Versionen noch gilt. Da die Bibliothek jedoch auf soliden theoretischen Prinzipien basiert, sollte sich das Verhalten für neuere Versionen nicht zu stark ändern.

Es bietet auch einige Farbcodes -

Pink : Aussagen nicht abgedeckt.

Orange : Funktionen nicht abgedeckt.

Gelb : Zweige nicht bedeckt.

Vollständige Istanbul-Dokumente hier:

https://istanbul.js.org

Für eine detailliertere Theorie zur Codeabdeckung:

https://en.wikipedia.org/wiki/Code_coverage

Ich hoffe es hilft!

Amy Pellegrini
quelle
8

Wenn Sie Istanbul ausführen, sollte auch eine HTML-Datei für den Bericht erstellt werden (sollte sich im Coverage-Ordner befinden). Dieser HTML-Code sollte Ihnen Drilldown-Informationen geben, wenn Sie auf Dateien / Ordner klicken.

Der Prozentsatz der abgedeckten Funktionen wird durch die Anzahl der Funktionen berechnet, die während der Tests aufgerufen wurden, geteilt durch die Gesamtzahl der Funktionen. Gleiches gilt für Zeilen und Anweisungen (die normalerweise nahe beieinander liegen, es sei denn, Sie haben sehr lange Anweisungen). Zweige bedeuten Entscheidungspunkte wie if-elseBlöcke. Angenommen, Ihr Code enthält nur eine if-elseAnweisung, und Ihre Tests durchlaufen nur das ifTeil, nicht jedoch das elseTeil. Dann sollte der Prozentsatz Ihrer Zweige 50% betragen.

Hoffe das macht die Dinge klarer.

Yaron Schwimmer
quelle
Ich lief Istanbul durch Angabe "test" : "nyc mocha"in package.json. Mein Coverage-Ordner ist leer. Gedanken?
TheCrazyProgrammer
1
Ich habe HTML-Reporter hinzugefügt. Es funktioniert jetzt. "test" : "nyc --reporter=html mocha"
TheCrazyProgrammer
Beispiel: Wenn Sie einen großen if-Zweig und einen winzigen else-Zweig haben und nur der if-Zweig ausgeführt wurde, sieht die Leitungsabdeckung gut aus, aber die Zweigabdeckung beträgt immer noch nur 50%. Sie können auch mehrere Anweisungen pro Zeile haben, wenn die Anweisungen durch Semikolons getrennt sind oder wenn die Zeile eine Funktionsdefinition enthält (die ihre eigenen Anweisungen enthält). Sie können mehrere Zeilen pro Anweisung verwenden, wenn die Anweisung vor dem letzten Semikolon Zeilenumbrüche enthält.
Hew Wolff
0

Hinzufügen zu den vorherigen Antworten

Die% -Anweisungen werden berechnet, indem ein Prozentsatz der Anzahl der von Ihrem Test abgedeckten Anweisungen verwendet wird, z. B. 12/18 * 100 = 66,67%. Dies bedeutet, dass Ihr Test nur 66,67% abdeckte.

Auf die gleiche Weise wird auch der% -Zweig berechnet. Gleiches gilt für Ihre% Funktionen und% Zeilen.

In Ihrem Projektstammverzeichnis befindet sich ein Coverage-Ordner, der die HTML-Ausgabe Ihres Tests enthält. Klicken Sie darauf und zeigen Sie es im Browser an. Sie sollten so etwas sehen

Bild zeigt die Ausgabe Ihrer Testergebnisse

Ich hoffe, das hilft Ihnen, es besser zu verstehen.

Samuel Pinheiro
quelle