Copertura del codice con Mocha


289

Sto usando Mocha per testare la mia applicazione NodeJS. Non sono in grado di capire come utilizzare la sua funzione di copertura del codice. Ho provato a cercarlo su Google ma non ho trovato alcun tutorial adeguato. Per favore aiuto.

Risposte:


411

Hai bisogno di una libreria aggiuntiva per la copertura del codice e rimarrai sorpreso da quanto sia potente e facile Istanbul . Prova quanto segue, dopo aver superato i test del caffè:

npm install nyc

Ora posiziona semplicemente il comando nyc davanti al comando di test esistente, ad esempio:

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

30
E se stai utilizzando una versione di mocha installata localmente, prova istanbul cover node_modules/mocha/bin/_mocha.
Eric McCarthy,

102
Oppure, installa sia istanbul che mocha localmente e aggiungi quanto segue alla sezione script del tuo pacchetto.json e poi esegui la copertura di npm: "copertura": "./node_modules/istanbul/lib/cli.js cover ./node_modules/ mocha / bin / _mocha - --ui bdd -R spec -t 5000
Dan Kohn

6
Ho avuto problemi a far funzionare questo comando su Windows, ma specificando il percorso completo del cestino della moka sono stato in grado di farlo funzionare. istanbul.cmd cover C:\Users\{UserName}\AppData\Roaming\npm\node_modules\mocha\bin\_mocha
Jason Jarrett,

4
$(npm bin)è un collegamento canonico a ./node_modules/.bin/, ed istanbul/lib/cli.jsè alias istanbulnella cartella bin. Quindi, ecco un comando più breve:$(npm bin)/istanbul cover $(npm bin)/_mocha -- --ui bdd -R spec -t 5000
Henry Blyth,

19
@ Utenti Windows:istanbul cover node_modules/mocha/bin/_mocha -- -R spec
Pier-Luc Gendreau il

151

Ora ( 2020 ) il modo preferito di usare Istanbul è tramite la sua "interfaccia a riga di comando all'avanguardia" nyc .

Impostare

Innanzitutto, installalo nel tuo progetto con

npm i nyc --save-dev

Quindi, se si dispone di un progetto basato su npm, è sufficiente modificare lo script di test all'interno scriptsdell'oggetto del file package.json per eseguire la copertura del codice dei test mocha :

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

Correre

Ora esegui i tuoi test

npm test

e vedrai una tabella come questa nella tua console, subito dopo l'output dei test:

Copertura del codice di Istanbul Nyc Mocha

Personalizzazione

Rapporto HTML

Basta usare

nyc --reporter=html

invece di text. Ora produrrà un rapporto all'interno ./coverage/index.html.

Formati di report

Istanbul supporta un'ampia gamma di formati di report. Basta guardare la sua libreria di rapporti per trovare il più utile per te. Aggiungi --reporter=REPORTER_NAMEun'opzione per ogni formato che desideri. Ad esempio, con

nyc --reporter=html --reporter=text

avrai sia la console che il rapporto html.

Non eseguire la copertura con test npm

Basta aggiungere un altro script nel tuo package.jsone lasciare lo testscript solo con il tuo test runner (ad esempio mocha):

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

Ora esegui questo script personalizzato

npm run test-with-coverage

per eseguire test con copertura del codice.

Forza il test fallito se la copertura del codice è bassa

Fallimento se la copertura totale del codice è inferiore al 90%:

nyc --check-coverage --lines 90 

Fallire se la copertura del codice di almeno un file è inferiore al 90%:

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

2
Funziona perfettamente anche con il gelsomino: "nyc --reporter = html jasmine"
Sandip Subedi

12
grazie per aver aggiunto "now (2017)" - davvero utile in questo mondo javascript in rapido movimento
kamahl

2
Nel caso in cui qualcun altro fosse confuso, il repository npm di istanbul sembra essere stato sostituito da nyc . Secondo le sue dipendenze elencate, Istanbul è stata suddivisa in vari pacchetti che sono tutti mantenuti nel loro monorepo di Istanbul
aaaaaa,

1
Sto --reporter=htmlabilitando ma il file html è sempre vuoto, non viene mostrato nulla sui blocchi scoperti o% coperto ecc. Solo le intestazioni della tabella
TGW

2
Quindi ... un framework chiamato Istanbul il cui comando CLI è New York? err ... Non mi fido!
Tivie,

19

Blanket.js funziona anche perfettamente.

npm install --save-dev blanket

davanti al tuo test / tests.js

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

correre mocha -R html-cov > coverage.html


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

4
A partire dal 2015, blanket.js non è più gestito e non supporta ES6. Istanbul è altamente raccomandata.
Teroi,
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.