Come posso leggere un rapporto sulla copertura di Istanbul?


131

Ho sempre usato Jasmine per i miei test unitari, ma recentemente ho iniziato a usare Istanbul per darmi rapporti sulla copertura del codice. Voglio dire, ho la sostanza di ciò che stanno cercando di dirmi, ma io non so davvero che cosa ciascuno di tali percentuali rappresentano (Stmts, Rami, funcs, linee). Finora su Google non sono stato in grado di trovare una spiegazione / risorsa solida.

Domanda : Come ho detto, ne ho un'idea, ma qualcuno può pubblicare una spiegazione corretta o un collegamento a una spiegazione corretta?

Domanda terziaria : esiste un modo per identificare quali parti specifiche del codice non sono coperte? Finora, senza davvero fare trekking su questo rapporto, sto praticamente indovinando.

-------------------|-----------|-----------|-----------|-----------|
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 |
-------------------|-----------|-----------|-----------|-----------|

3
L'esecuzione di istanbul dovrebbe anche produrre un file HTML per il rapporto (dovrebbe trovarsi nella cartella di copertura). Questo codice HTML dovrebbe fornirti informazioni dettagliate quando fai clic su file / cartelle
Yaron Schwimmer,

Grazie @yarons. Questo sicuramente aiuta a approfondire la copertura e identificare ciò che specificamente non viene coperto. Non capisco ancora in modo approfondito cosa significano le percentuali = /.
Scott Sword,

Risposte:


217

Esistono numerosi criteri di copertura, i principali sono:

  • Copertura delle funzioni È stata chiamata ciascuna funzione (o subroutine) nel programma?
  • Copertura delle dichiarazioni Ogni istruzione nel programma è stata eseguita?
  • Copertura dei rami Ogni ramo (chiamato anche DD-path) di ciascuna struttura di controllo (come in if e case case) è stato eseguito? Ad esempio, data un'istruzione if, sono stati eseguiti sia i rami vero che falso? Un altro modo di dire questo è: è stato eseguito ogni limite del programma?
  • La copertura della linea è stata eseguita ogni linea eseguibile nel file sorgente?

Per ogni caso, la percentuale rappresenta il codice eseguito rispetto al codice non eseguito , che equivale a ciascuna frazione in formato percentuale (ad esempio: 50% rami, 1/2).

Nel rapporto sul file:

  • 'E' sta per "altro percorso non preso", il che significa che per l'istruzione if / else contrassegnata, il percorso "if" è stato testato ma non "else".
  • 'I' sta per "if percorso non preso", che è il caso contrario: il "if" non è stato testato.
  • La xNcolonna di sinistra indica il numero di volte in cui la riga è stata eseguita.
  • Le righe non eseguite, o parti di codice, saranno evidenziate in rosso.

Questo è stato verificato per Istanbul v0.4.0, non sono sicuro che sia valido anche per le versioni successive, ma dato che la libreria si basa su solidi principi teorici, il comportamento non dovrebbe cambiare troppo per le versioni più recenti.

Fornisce anche alcuni codici colore -

Rosa : dichiarazioni non coperte.

Arancione : funzioni non coperte.

Giallo : rami non coperti.

Documenti completi di Istanbul qui:

https://istanbul.js.org

Per una teoria più approfondita sulla copertura del codice:

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

Spero che sia d'aiuto!


8

L'esecuzione di istanbul dovrebbe anche produrre un file HTML per il rapporto (dovrebbe trovarsi nella cartella di copertura). Questo HTML dovrebbe fornire informazioni dettagliate quando si fa clic su file / cartelle.

La percentuale di funzioni coperte è calcolata dal numero di funzioni chiamate durante i test, diviso per il numero totale di funzioni. Lo stesso vale per le righe e le istruzioni (che di solito saranno vicine tra loro a meno che tu non abbia dichiarazioni molto lunghe). I rami significano punti di decisione come if-elseblocchi. Ad esempio, supponiamo che il codice contenga solo if-elseun'istruzione e che i test passino solo attraverso la ifparte ma non la elseparte, quindi la percentuale dei rami dovrebbe essere del 50%.

Spero che questo renda le cose più chiare.


Ho gestito istanbul specificando "test" : "nyc mocha"in package.json. La mia cartella di copertura è vuota. Pensieri?
TheCrazyProgrammer il

1
Ho aggiunto reporter HTML. Ora funziona. "test" : "nyc --reporter=html mocha"
TheCrazyProgrammer,

Ad esempio: se si dispone di un grande if-branch e di un piccolo else-branch e viene eseguito solo l'if-branch, la copertura della linea sembrerà ottima ma la copertura della filiale sarà comunque solo del 50%. Inoltre, è possibile avere più istruzioni per riga se le istruzioni sono separate da punti e virgola o se la riga include una definizione di funzione (che contiene le proprie istruzioni). È possibile avere più righe per istruzione se l'istruzione presenta interruzioni di riga prima del punto e virgola finale.
Hew Wolff il

0

Aggiunta alle risposte precedenti

Le dichiarazioni% sono calcolate prendendo una percentuale del numero di dichiarazioni coperte dal test, ad es. 12/18 * 100 = 66,67%. Ciò significa che il test ha coperto solo il 66,67%.

Anche la diramazione% viene calcolata allo stesso modo. Lo stesso per le tue funzioni% e linee%.

Nella directory principale del progetto è presente una cartella di copertura che contiene l'output HTML del test. Cliccaci sopra e visualizzalo nel browser. Dovresti vedere qualcosa del genere

Immagine che mostra l'output dei risultati del test

Spero che questo ti aiuti a capirlo meglio.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.