Comment lire un rapport de couverture d'Istanbul?


131

J'ai toujours utilisé Jasmine pour mes tests unitaires, mais récemment, j'ai commencé à utiliser Istanbul pour me donner des rapports de couverture de code. Je veux dire que je comprends l' essentiel de ce qu'ils essaient de me dire, mais je ne sais pas vraiment ce que chacun de ces pourcentages représente (Stmts, Branches, Funcs, Lines). Jusqu'à présent, j'ai été incapable de trouver une explication / ressource solide sur Google.

Question : Comme je l'ai dit, j'en comprends l'essentiel, mais quelqu'un peut-il publier une explication correcte ou un lien vers une explication correcte?

Question tertiaire : existe-t-il un moyen d'identifier les parties spécifiques de votre code qui ne sont pas couvertes? Jusqu'à présent, sans vraiment grokking ce rapport, je devine en gros.

-------------------|-----------|-----------|-----------|-----------|
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'exécution d'istanbul devrait également produire un fichier HTML pour le rapport (devrait se trouver dans le dossier de couverture). Ce code HTML devrait vous donner des informations détaillées lorsque vous cliquez sur des fichiers / dossiers
Yaron Schwimmer

Merci @yarons. Cela aide certainement à explorer la couverture et à identifier ce qui n'est pas spécifiquement couvert. Je ne comprends toujours pas vraiment en profondeur ce que les pourcentages signifient = /.
Scott Sword

Réponses:


217

Il existe un certain nombre de critères de couverture, les principaux étant:

  • Couverture des fonctions Chaque fonction (ou sous-programme) du programme a-t-elle été appelée?
  • Couverture des relevés Chaque instruction du programme a-t-elle été exécutée?
  • Couverture de branche Chaque branche (également appelée chemin DD) de chaque structure de contrôle (comme les instructions if et case) a-t-elle été exécutée? Par exemple, étant donné une instruction if, les branches true et false ont-elles été exécutées? Une autre façon de dire cela est, est-ce que chaque bord du programme a été exécuté?
  • Couverture de la ligne Chaque ligne exécutable du fichier source a-t-elle été exécutée?

Pour chaque cas, le pourcentage représente le code exécuté par rapport au code non exécuté , ce qui équivaut à chaque fraction au format pour cent (par exemple: 50% de branches, 1/2).

Dans le rapport de fichier:

  • 'E' signifie 'else chemin non pris', ce qui signifie que pour l'instruction if / else marquée, le chemin 'if' a été testé mais pas le 'else'.
  • 'I' signifie «si le chemin n'est pas emprunté», ce qui est le cas contraire: le «si» n'a pas été testé.
  • La xNcolonne de gauche indique le nombre de fois que la ligne a été exécutée.
  • Les lignes ou morceaux de code non exécutés seront surlignés en rouge.

Cela a été vérifié pour Istanbul v0.4.0, je ne suis pas sûr que cela s'applique toujours aux versions ultérieures, mais comme cette bibliothèque est basée sur des principes théoriques solides, le comportement ne devrait pas trop changer pour les versions plus récentes.

Il fournit également des codes couleur -

Rose : déclarations non couvertes.

Orange : fonctions non couvertes.

Jaune : branches non couvertes.

Documentation complète d'Istanbul ici:

https://istanbul.js.org

Pour une théorie plus approfondie sur la couverture du code:

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

J'espère que ça aide!


8

L'exécution d'istanbul devrait également produire un fichier HTML pour le rapport (devrait se trouver dans le dossier de couverture). Ce code HTML devrait vous donner des informations détaillées lorsque vous cliquez sur des fichiers / dossiers.

Le pourcentage de fonctions couvertes est calculé par le nombre de fonctions appelées lors des tests, divisé par le nombre total de fonctions. Il en va de même pour les lignes et les instructions (qui seront généralement proches les unes des autres, sauf si vous avez de très longues instructions). Les branches signifient des points de décision comme des if-elseblocs. Par exemple, supposons que votre code ne contienne qu'une seule if-elseinstruction et que vos tests ne passent que par la ifpièce mais pas par la elsepièce, alors le pourcentage de vos branches doit être de 50%.

J'espère que cela rend les choses plus claires.


J'ai couru istanbul en spécifiant "test" : "nyc mocha"dans package.json. Mon dossier de couverture est vide. Pensées?
TheCrazyProgrammer

1
J'ai ajouté un journaliste html. Ça fonctionne maintenant. "test" : "nyc --reporter=html mocha"
TheCrazyProgrammer

Par exemple: si vous avez une grande branche if et une petite branche else, et que seule la branche if a été exécutée, la couverture de ligne aura fière allure mais la couverture de branche ne sera toujours que de 50%. En outre, vous pouvez avoir plusieurs instructions par ligne si les instructions sont séparées par des points-virgules ou si la ligne comprend une définition de fonction (qui contient ses propres instructions). Vous pouvez avoir plusieurs lignes par instruction si l'instruction comporte des sauts de ligne avant le point-virgule final.
Hew Wolff le

0

Ajout aux réponses précédentes

Le pourcentage d'énoncés est calculé en prenant un pourcentage du nombre d'énoncés couverts par votre test, par exemple 12/18 * 100 = 66,67%. Cela signifie que votre test n'a couvert que 66,67%.

Le% Branch est également calculé de la même manière. Idem pour vos% Functions et% lines.

Dans le répertoire racine de votre projet, il y a un dossier de couverture qui contient la sortie HTML de votre test. Cliquez dessus et visualisez-le dans le navigateur. Vous devriez voir quelque chose comme ça

Image montrant la sortie de vos résultats de test

J'espère que cela vous aidera à mieux le comprendre.

En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.