Cobertura de código com Mocha

288

Estou usando o Mocha para testar meu aplicativo NodeJS. Não consigo descobrir como usar seu recurso de cobertura de código. Tentei pesquisar no Google, mas não encontrei nenhum tutorial adequado. Por favor ajude.

Tusharmath
fonte

Respostas:

410

Você precisa de uma biblioteca adicional para cobertura de código e ficará impressionado com o quão fácil e poderoso é Istambul . Tente o seguinte, depois de passar nos testes de mocha:

npm install nyc

Agora, basta colocar o comando nyc na frente do comando de teste existente, por exemplo:

{
  "scripts": {
    "test": "nyc mocha"
  }
}
Dan Kohn
fonte
30
E se você estiver executando uma versão instalada localmente do mocha, tente istanbul cover node_modules/mocha/bin/_mocha.
Eric McCarthy
102
Ou instale o istanbul e o mocha localmente e adicione o seguinte à seção de scripts do seu package.json e, em seguida, apenas npm execute o cover: "cover": "./node_modules/istanbul/lib/cli.js cover ./node_modules/ mocha / bin / _mocha - --ui bdd -R especificação -t 5000
Dan Kohn
6
Eu tive problemas para executar esse comando no Windows, mas especificando o caminho completo para o mocha bin, consegui fazê-lo funcionar. istanbul.cmd cover C:\Users\{UserName}\AppData\Roaming\npm\node_modules\mocha\bin\_mocha
Jason Jarrett
4
$(npm bin)é um atalho canônico para ./node_modules/.bin/e istanbul/lib/cli.jsestá aliasado istanbulna pasta bin. Então, aqui está um comando mais curto:$(npm bin)/istanbul cover $(npm bin)/_mocha -- --ui bdd -R spec -t 5000
Henry Blyth
19
Usuários do Windows:istanbul cover node_modules/mocha/bin/_mocha -- -R spec
Pier-Luc Gendreau
150

Agora ( 2020 ) a maneira preferida de usar Istambul é através de sua "interface de linha de comando de última geração" nyc .

Configuração

Primeiro, instale-o no seu projeto com

npm i nyc --save-dev

Então, se você tiver um projeto baseado em npm, basta alterar o script de teste dentro do scriptsobjeto do seu arquivo package.json para executar a cobertura do código dos seus testes mocha :

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

Corre

Agora execute seus testes

npm test

e você verá uma tabela como esta em seu console, logo após a saída dos testes:

Cobertura do código Istanbul Nyc Mocha

Costumização

Relatório HTML

Apenas use

nyc --reporter=html

em vez de text. Agora ele produzirá um relatório dentro ./coverage/index.html.

Formatos de relatório

Istambul suporta uma ampla variedade de formatos de relatório. Basta olhar para a biblioteca de relatórios para encontrar o mais útil para você. Basta adicionar uma --reporter=REPORTER_NAMEopção para cada formato desejado. Por exemplo, com

nyc --reporter=html --reporter=text

você terá o console e o relatório html.

Não execute a cobertura com o teste npm

Basta adicionar outro script no seu package.jsone deixar o testscript apenas com o seu executor de teste (por exemplo, mocha):

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

Agora execute esse script personalizado

npm run test-with-coverage

para executar testes com cobertura de código.

Falha no teste de força se a cobertura do código for baixa

Falha se a cobertura total do código estiver abaixo de 90%:

nyc --check-coverage --lines 90 

Falha se a cobertura do código de pelo menos um arquivo estiver abaixo de 90%:

nyc --check-coverage --lines 90 --per-file
lifeisfoo
fonte
2
Isso funciona perfeitamente para o jasmim também: "nyc --reporter = html jasmine" #
Sandip Subedi
12
Obrigado por adicionar "agora (2017)" - realmente útil neste movimento rápido mundo javascript
Kamahl
2
Caso alguém mais estivesse confuso - o repositório npm istanbul parece ter sido substituído pelo nyc . Por suas dependências listados, Istambul foi dividiu em vários pacotes que estão todos mantidos em seus istanbuljs monorepo
aaaaaa
1
Estou tendo o --reporter=htmlhabilitado, mas o arquivo html é esvaziar sempre, não há nada mostrado sobre blocos descobertos ou% coberto etc cabeçalhos apenas da tabela
TGW
1
Então ... uma estrutura chamada Istambul cujo comando CLI é NYC? err ... Eu não confio nisso!
Tivie 27/10/19
19

O Blanket.js também funciona perfeitamente.

npm install --save-dev blanket

na frente do seu test / tests.js

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

corre mocha -R html-cov > coverage.html

jsan
fonte
require ('cobertor') ({pattern: function (filename) {return! /node_modules/.test (filename);}});
JSAN
4
A partir de 2015, o cobertor.js não é mais mantido e não suporta o ES6. Istambul é altamente recomendada.
teroi