381 votes

Couverture de code avec Mocha

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

517voto

dankohn Points 6999

Vous avez besoin d'une bibliothèque supplémentaire pour la couverture de code, et vous allez être époustouflé par la puissance et la facilité avec lesquelles istanbul est. Essayez ce qui suit, après avoir réussi vos tests mocha :

npm install nyc

Maintenant, il suffit de placer la commande nyc devant votre commande de test existante, par exemple :

{
  "scripts": {
    "test": "nyc mocha"
  }
}

33 votes

Et si vous exécutez une version de mocha installée localement, essayez istanbul cover node_modules/mocha/bin/_mocha .

105 votes

Ou bien, installez à la fois istanbul et mocha localement, et ajoutez ce qui suit à la section scripts de votre package.json, puis lancez simplement npm coverage : "coverage" : "./node_modules/istanbul/lib/cli.js cover ./node_modules/mocha/bin/_mocha -- --ui bdd -R spec -t 5000

0 votes

Merci, c'était vraiment utile.

252voto

lifeisfoo Points 11

Maintenant ( 2021 ) la manière préférée d'utiliser istanbul se fait par l'intermédiaire de son "interface de ligne de commande de pointe" nycole .

Configuration

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

npm i nyc --save-dev

Ensuite, si vous avez un projet basé sur npm, il suffit de modifier le test script à l'intérieur de la balise scripts l'objet de votre paquet.json pour exécuter la couverture de code de votre moka tests :

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

Exécuter

Maintenant, exécutez vos tests

npm test

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

Istanbul Nyc Mocha code coverage

Personnalisation

Rapport Html

Il suffit d'utiliser

nyc --reporter=html

au lieu de text . Maintenant, il produira un rapport dans ./coverage/index.html .

Formats des rapports

Istanbul prend en charge un large éventail de formats de rapports. Il suffit de regarder ses bibliothèque des rapports pour trouver le plus utile pour vous. Il suffit d'ajouter un --reporter=REPORTER_NAME pour chaque format que vous souhaitez. 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 npm test

Il suffit d'ajouter un autre script dans votre package.json et laisser le test script avec seulement votre exécuteur 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 couverture de code.

Forcer l'échec du test 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 de code d'au moins un fichier est inférieure à 90% :

nyc --check-coverage --lines 90 --per-file

3 votes

Cela fonctionne parfaitement pour jasmine aussi : "nyc --reporter=html jasmine"

0 votes

Le mien fonctionne mais je ne vois pas la couverture du code montrant quelles lignes sont couvertes par le vert / rouge dans le code lui-même.

14 votes

Merci d'avoir ajouté "now(2017)". - vraiment utile dans ce monde javascript qui évolue rapidement

24voto

Digicrat Points 115

La réponse acceptée (nyc) ne fonctionne pas si vous utilisez des modules ESM.

C8 semble être la meilleure solution actuellement, qui exploite les capacités intégrées de NodeJS et utilise istanbul (comme nyc, et partage les mêmes fichiers de configuration).

npm install -g c8
c8 mocha

Il utilisera le fichier .nycrc pour la configuration. Un exemple de configuration que j'utilise est :

{
    "all": true,
    "exclude": ["test"],
    "output": "reports",
    "reporter" : [
        "html",
        "text"
    ]
}

(Note : J'ai été dirigé vers c8 par une réponse à une autre question. https://stackoverflow.com/a/69846825/1949430 )

20voto

jsan Points 647

Blanket.js fonctionne aussi parfaitement.

npm install --save-dev blanket

devant votre test/tests.js

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

exécuter mocha -R html-cov > coverage.html

0 votes

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

7 votes

Depuis 2015, blanket.js n'est plus maintenu et ne supporte pas ES6. Istanbul est fortement recommandé.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X