Покрытие кода с Мокко

289

Я использую Mocha для тестирования моего приложения NodeJS. Я не могу понять, как использовать функцию покрытия кода. Я попытался найти его, но не нашел подходящего учебника. Пожалуйста помоги.

tusharmath
источник

Ответы:

411

Вам нужна дополнительная библиотека для покрытия кода, и вы будете поражены тем, насколько мощным и простым является Стамбул . Попробуйте выполнить следующее, после того как пройдете тесты мокко:

npm install nyc

Теперь просто поместите команду nyc перед существующей тестовой командой, например:

{
  "scripts": {
    "test": "nyc mocha"
  }
}
Дэн Кон
источник
30
И если вы используете локально установленную версию mocha, попробуйте istanbul cover node_modules/mocha/bin/_mocha.
Эрик Маккарти
102
Или установите istanbul и mocha локально и добавьте следующее в раздел сценариев вашего package.json, а затем просто запустите npm runwell: "охват": "./node_modules/istanbul/lib/cli.js cover ./node_modules/ mocha / bin / _mocha - --ui BDD -R spec -t 5000
Дэн Кон
6
У меня были проблемы с запуском этой команды в Windows, но, указав полный путь к корзине мокко, я смог заставить ее работать. istanbul.cmd cover C:\Users\{UserName}\AppData\Roaming\npm\node_modules\mocha\bin\_mocha
Джейсон Джарретт
4
$(npm bin)является каноническим ярлыком для ./node_modules/.bin/и istanbul/lib/cli.jsимеет псевдоним istanbulв папке bin. Итак, вот более короткая команда:$(npm bin)/istanbul cover $(npm bin)/_mocha -- --ui bdd -R spec -t 5000
Генри Блит
19
@ Пользователи Windows:istanbul cover node_modules/mocha/bin/_mocha -- -R spec
Pier-Luc Gendreau
151

Теперь ( 2020 г. ) предпочтительным способом использования Стамбула является его «современный интерфейс командной строки» nyc .

Настроить

Во-первых, установите его в свой проект с

npm i nyc --save-dev

Затем, если у вас есть проект на основе npm, просто измените тестовый скрипт внутри scriptsобъекта вашего файла package.json, чтобы выполнить покрытие кода ваших тестов mocha :

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

Бегать

Теперь запустите ваши тесты

npm test

и вы увидите такую ​​таблицу в консоли сразу после вывода результатов тестов:

Стамбул Nyc Мокко покрытие кода

настройка

HTML отчет

Просто используйте

nyc --reporter=html

вместо text. Теперь он выдаст отчет внутри ./coverage/index.html.

Форматы отчетов

Стамбул поддерживает широкий спектр форматов отчетов. Просто посмотрите на его библиотеку отчетов, чтобы найти наиболее полезную для вас. Просто добавьте --reporter=REPORTER_NAMEопцию для каждого формата, который вы хотите. Например, с

nyc --reporter=html --reporter=text

у вас будет и консоль, и html отчет.

Не запускайте покрытие с тестом npm

Просто добавьте другой скрипт в ваш package.jsonи оставьте testскрипт только с вашим бегуном (например, мокко):

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

Теперь запустите этот пользовательский скрипт

npm run test-with-coverage

запускать тесты с покрытием кода.

Принудительный тест не пройден, если охват кода низкий

Сбой, если общий охват кода ниже 90%:

nyc --check-coverage --lines 90 

Ошибка, если охват кода хотя бы одного файла ниже 90%:

nyc --check-coverage --lines 90 --per-file
lifeisfoo
источник
2
Это прекрасно работает и для жасмина: "nyc --reporter = html jasmine"
Сандип Субеди
12
спасибо за добавление «сейчас (2017)» - действительно полезно в этом быстро
меняющемся
2
В случае, если кто-то еще был сбит с толку - хранилище npm istanbul, похоже, было заменено nyc . В соответствии со своими перечисленными зависимостями, Стамбул был разделен на различные пакеты, которые все хранятся в их моносто
aaaaaa
1
У меня --reporter=htmlвключен, но html-файл всегда пуст, ничего не показано о непокрытых блоках или% покрытия и т. Д., Только заголовки таблицы
TGW,
2
Итак ... структура под названием Стамбул, чья команда CLI - Нью-Йорк эээ ... я не верю этому!
Тиви
19

Blanket.js тоже отлично работает.

npm install --save-dev blanket

перед вашим test / tests.js

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

бегать mocha -R html-cov > coverage.html

JSAN
источник
require ('blanket') ({pattern: function (filename) {return! /node_modules/.test (filename);}});
JSAN
4
По состоянию на 2015 г. blanket.js больше не поддерживается и не поддерживает ES6. Стамбул очень рекомендуется.
teroi