Cobertura de código con Mocha

288

Estoy usando Mocha para probar mi aplicación NodeJS. No puedo entender cómo usar su función de cobertura de código. Intenté buscarlo en Google pero no encontré ningún tutorial adecuado. Por favor ayuda.

Tusharmath
fuente

Respuestas:

410

Necesitas una biblioteca adicional para la cobertura del código, y te sorprenderá lo poderosa y fácil que es Estambul . Intente lo siguiente, después de pasar sus pruebas de mocha:

npm install nyc

Ahora, simplemente coloque el comando nyc delante de su comando de prueba existente, por ejemplo:

{
  "scripts": {
    "test": "nyc mocha"
  }
}
Dan Kohn
fuente
30
Y si está ejecutando una versión de mocha instalada localmente, intente istanbul cover node_modules/mocha/bin/_mocha.
Eric McCarthy
102
O bien, instale Estambul y Mocha localmente, y agregue lo siguiente a la sección de scripts de su package.json y luego simplemente npm ejecute la cobertura: "cobertura": "./node_modules/istanbul/lib/cli.js cover ./node_modules/ mocha / bin / _mocha - --ui bdd -R spec -t 5000
Dan Kohn
66
Tuve problemas para ejecutar este comando en Windows, pero al especificar la ruta completa al mocha bin pude hacer que funcionara. istanbul.cmd cover C:\Users\{UserName}\AppData\Roaming\npm\node_modules\mocha\bin\_mocha
Jason Jarrett
44
$(npm bin)es un acceso directo canónico a ./node_modules/.bin/, y istanbul/lib/cli.jstiene un alias istanbulen la carpeta bin. Así que aquí hay un comando más corto:$(npm bin)/istanbul cover $(npm bin)/_mocha -- --ui bdd -R spec -t 5000
Henry Blyth
19
@ Usuarios de Windows:istanbul cover node_modules/mocha/bin/_mocha -- -R spec
Pier-Luc Gendreau
150

Ahora ( 2020 ), la forma preferida de utilizar Estambul es a través de su "interfaz de línea de comandos de última generación" de Nueva York .

Preparar

Primero, instálalo en tu proyecto con

npm i nyc --save-dev

Luego, si tiene un proyecto basado en npm, simplemente cambie el script de prueba dentro del scriptsobjeto de su archivo package.json para ejecutar la cobertura de código de sus pruebas de mocha :

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

correr

Ahora ejecuta tus pruebas

npm test

y verá una tabla como esta en su consola, justo después de la salida de sus pruebas:

Cobertura del código Istanbul Nyc Mocha

Personalización

Informe html

Solo usa

nyc --reporter=html

en lugar de text. Ahora producirá un informe dentro ./coverage/index.html.

Formatos de informe

Estambul admite una amplia gama de formatos de informes. Solo mire su biblioteca de informes para encontrar la más útil para usted. Simplemente agregue una --reporter=REPORTER_NAMEopción para cada formato que desee. Por ejemplo, con

nyc --reporter=html --reporter=text

tendrá tanto la consola como el informe html.

No ejecute cobertura con prueba npm

Simplemente agregue otro script en su package.jsony deje el testscript solo con su corredor de prueba (por ejemplo, mocha):

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

Ahora ejecuta este script personalizado

npm run test-with-coverage

ejecutar pruebas con cobertura de código.

La prueba de fuerza falla si la cobertura del código es baja

Falla si la cobertura total del código es inferior al 90%:

nyc --check-coverage --lines 90 

Falla si la cobertura del código de al menos un archivo es inferior al 90%:

nyc --check-coverage --lines 90 --per-file
lifeisfoo
fuente
2
Esto funciona perfectamente para jazmín también: "nyc --reporter = html jasmine"
Sandip Subedi
12
gracias por agregar "ahora (2017)" - realmente útil en este mundo de javascript en rápido movimiento
kamahl
2
En caso de que alguien más estuviera confundido, el repositorio npm de Estambul parece haber sido reemplazado por Nueva York . Según sus dependencias enumeradas, Estambul se dividió en varios paquetes que se mantienen en su monorepo de Estambul
aaaaaa
1
Tengo --reporter=htmlhabilitado pero el archivo html está vacío siempre, no se muestra nada sobre bloques descubiertos o% cubierto, etc. solo encabezados de la tabla
TGW
1
Entonces ... ¿un marco llamado Estambul cuyo comando CLI es NYC? err ... ¡no confío en eso!
Tivie
19

Blanket.js también funciona perfecto.

npm install --save-dev blanket

en frente de su prueba / tests.js

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

correr mocha -R html-cov > coverage.html

jsan
fuente
require ('blanket') ({patrón: función (nombre de archivo) {return! /node_modules/.test (nombre de archivo);}});
jsan 01 de
44
A partir de 2015, blanket.js ya no se mantiene y no es compatible con ES6. Estambul es muy recomendable.
teroi