Couverture du code avec Mocha

288

J'utilise Mocha pour tester mon application NodeJS. Je ne suis pas en mesure de comprendre comment utiliser sa fonction de couverture de code. J'ai essayé de le googler mais je n'ai trouvé aucun tutoriel approprié. Veuillez aider.

tusharmath
la source

Réponses:

410

Vous avez besoin d'une bibliothèque supplémentaire pour la couverture du code, et vous allez être époustouflé par la puissance et la simplicité d' Istanbul . Essayez ce qui suit, après avoir réussi vos tests de moka:

npm install nyc

Maintenant, placez simplement la commande nyc devant votre commande de test existante, par exemple:

{
  "scripts": {
    "test": "nyc mocha"
  }
}
Dan Kohn
la source
30
Et si vous utilisez une version de mocha installée localement, essayez istanbul cover node_modules/mocha/bin/_mocha.
Eric McCarthy
102
Ou, installez à la fois istanbul et mocha localement, et ajoutez ce qui suit à la section scripts de votre package.json, puis juste la couverture de npm run: "coverage": "./node_modules/istanbul/lib/cli.js cover ./node_modules/ mocha / bin / _mocha - --ui bdd -R spec -t 5000
Dan Kohn
6
J'ai eu du mal à exécuter cette commande sur Windows, mais en spécifiant le chemin d'accès complet au bac mocha, j'ai pu le faire fonctionner. istanbul.cmd cover C:\Users\{UserName}\AppData\Roaming\npm\node_modules\mocha\bin\_mocha
Jason Jarrett
4
$(npm bin)est un raccourci canonique vers ./node_modules/.bin/et istanbul/lib/cli.jsest aliasé istanbuldans le dossier bin. Voici donc une commande plus courte:$(npm bin)/istanbul cover $(npm bin)/_mocha -- --ui bdd -R spec -t 5000
Henry Blyth
19
@ Utilisateurs Windows:istanbul cover node_modules/mocha/bin/_mocha -- -R spec
Pier-Luc Gendreau
150

Maintenant ( 2020 ), la meilleure façon d'utiliser istanbul est via son "état de l'art interface de ligne de commande" nyc .

Installer

Tout d'abord, installez-le dans votre projet avec

npm i nyc --save-dev

Ensuite, si vous avez un projet basé sur npm, changez simplement le script de test à l'intérieur de l' scriptsobjet de votre fichier package.json pour exécuter la couverture de code de vos tests mocha :

{
  "scripts": {
    "test": "nyc --reporter=text mocha"
  }
}

Courir

Maintenant, lancez vos tests

npm test

et vous verrez un tableau comme celui-ci dans votre console, juste après la sortie de vos tests:

Couverture du code Istanbul Nyc Mocha

Personnalisation

Rapport HTML

Utilisez simplement

nyc --reporter=html

au lieu de text. Il va maintenant produire un rapport à l'intérieur ./coverage/index.html.

Formats de rapport

Istanbul prend en charge un large éventail de formats de rapport. Il suffit de regarder sa bibliothèque de rapports pour trouver le plus utile pour vous. Ajoutez simplement une --reporter=REPORTER_NAMEoption pour chaque format souhaité. Par exemple, avec

nyc --reporter=html --reporter=text

vous aurez à la fois la console et le rapport html.

Ne pas exécuter la couverture avec le test npm

Ajoutez simplement un autre script dans votre package.jsonet laissez le testscript uniquement avec votre lanceur de test (par exemple mocha):

{
  "scripts": {
    "test": "mocha",
    "test-with-coverage": "nyc --reporter=text mocha"
  }
}

Maintenant, exécutez ce script personnalisé

npm run test-with-coverage

pour exécuter des tests avec une couverture de code.

Échec du test de force si la couverture du code est faible

Échec si la couverture totale du code est inférieure à 90%:

nyc --check-coverage --lines 90 

Échec si la couverture du code d'au moins un fichier est inférieure à 90%:

nyc --check-coverage --lines 90 --per-file
lifeisfoo
la source
2
Cela fonctionne parfaitement pour le jasmin aussi: "nyc --reporter = html jasmine"
Sandip Subedi
12
merci d'avoir ajouté "maintenant (2017)" - vraiment utile dans ce monde javascript en évolution rapide
kamahl
2
Au cas où quelqu'un d'autre serait confus - le référentiel npm istanbul semble avoir été remplacé par nyc . Selon ses dépendances répertoriées, istanbul a été divisé en plusieurs packages qui sont tous maintenus dans leur monorepo istanbuljs
aaaaaa
1
J'ai --reporter=htmlactivé mais le fichier html est toujours vide, rien n'est montré sur les blocs non couverts ou% couverts, etc. juste les en-têtes du tableau
TGW
1
Alors ... un framework appelé Istanbul dont la commande CLI est NYC? euh ... je n'y crois pas!
Tivie
19

Blanket.js fonctionne également parfaitement.

npm install --save-dev blanket

devant votre test / tests.js

require('blanket')({
    pattern: function (filename) {
        return !/node_modules/.test(filename);
    }
});

courir mocha -R html-cov > coverage.html

jsan
la source
require ('blanket') ({pattern: function (filename) {return! /node_modules/.test (filename);}});
jsan
4
Depuis 2015, blanket.js n'est plus maintenu et ne prend pas en charge ES6. Istanbul est fortement recommandé.
teroi