Как сделать так, чтобы Стамбул генерировал покрытие для всего моего исходного кода?

В настоящее время Стамбул создает покрытие только для файлов, которые используются в моих тестах, что нормально, но, похоже, несколько противоречит цели обеспечения покрытия.

У меня нет конфигурации Istanbul, и я вызываю ее через npm test со следующей строкой скрипта:

$ istanbul cover _mocha -- -R dot --check-leaks --recursive test/

Есть ли способ создать покрытие для всего моего исходного кода?


person Seer    schedule 22.12.2014    source источник
comment
Возможно, эта ветка поможет вам: stackoverflow. com/questions/22702578/ (но для этого требуется использование gulp). Также может помочь использование опции includeUntested без gulp (github.com/SBoudrias/gulp-istanbul#includeuntested).   -  person Anastasia    schedule 24.12.2014
comment
Это выглядит многообещающе, спасибо!   -  person Seer    schedule 24.12.2014


Ответы (4)


Нашел ответ, думаю, мне отчасти повезло, что выбранная мной структура каталогов позволяет использовать эту опцию, но теперь моя тестовая команда:

$ istanbul --include-all-sources cover _mocha -- -R dot --recursive test/

--include-all-sources является важной частью.

person Seer    schedule 24.12.2014
comment
Это заставляет меня думать, что это возможно, но --include-all-sources предназначен для мокко, верно? Какая у вас была структура каталогов? Я все еще пытаюсь заставить это работать.. :( - person Stretch; 31.03.2015
comment
Подсчитывает ли --include-all-sources все файлы .js в вашем проекте, а не только те, на которые повлияла среда выполнения? - person Alexander Mills; 17.02.2017
comment
Это работает для меня, но охватывает весь мой рабочий каталог. Кто-нибудь знает, как мне получить покрытие только для моей папки src? - person Matt Dell; 07.03.2017
comment
Только что понял это. Вам нужно объединить --include-all-sources с --root. Для моего кода это было просто --include-all-sources --root ./src. Я нашел эту команду здесь: github.com/gotwarlost/istanbul/issues/ - person Matt Dell; 07.03.2017

Стамбул рекомендует использовать nyc для проверки охвата кода. Он предлагает такой подход:

nyc mocha

После запуска этой команды мы получим отчет о покрытии. Но есть пара подводных камней.

Во-первых, по умолчанию mocha ищет тесты в папке test. Чтобы переопределить его, мы должны установить собственный путь в файле mocha.opts следующим образом:

nyc mocha --opts ./mocha.opts

А mocha.opts содержит такой код, например:

spec/unit/back-end/**/*.spec.js

Другая проблема в том, что по умолчанию nyc проверяет покрытие только необходимых файлов, о чем ваш вопрос. Решение состоит в том, чтобы установить два параметра для nyc (я запускаю тест как скрипт npm, поэтому я устанавливаю параметры в package.json). Вот код:

"nyc": {
  "all": true,
  "include": [
    "routes/*.js",
    "routes/**/*.js",
    "models/*.js"
  ]
},
"scripts": {
  "mocha": "nyc mocha --opts ./mocha.opts",
}

Еще один способ добиться этого — установить не include, а exclude опцию, чтобы исключить из проверки покрытия неподходящие файлы. Странно, но единственный вариант all не работает, нужны include или exclude варианты. Вы можете получить больше информации о nyc опциях через nyc --help.

P.S. Я не знаю nyc и mocha глубоко и основываюсь только на собственном опыте.

person Kirill Murashkin    schedule 29.01.2018

Для создания покрытия для всех файлов добавьте в свой package.json следующее:

"istanbulCoverage": "nyc --reporter=lcov --reporter=text-lcov --all -x \"./node_modules/\" -x \"./coverage/\ " check-coverage --functions 90 npm run test"

Здесь флаг --all выбирает все файлы в вашем проекте. Если вы хотите исключить определенные файлы или папки, вы можете использовать опцию -x.

Кроме того, если вы хотите указать уровень покрытия для своего приложения, используйте параметр check-coverage, чтобы указать пороговое значение. В моем случае я указал функции с порогом покрытия 90%. В противном случае генерация отчета о покрытии завершится ошибкой (я запускаю тест на карму после создания отчета о покрытии).

Надеюсь, это помогло :)

person Clinton Roy    schedule 21.06.2018

В моем случае --include-all-sources у меня не сработало. Файлы, которые не были require-d, по-прежнему исключались из окончательного отчета о покрытии.

В конце концов я наткнулся на эту проблему на istanbul GitHub, где сопровождающий заявил:

Да, это ожидаемое поведение. istanbul работает путем перехвата запроса, поэтому, если файл никогда не требуется, он как будто не существует.

Единственным надежным решением, которое я нашел, было вручную require все файлы, которые я хотел включить в свой отчет о покрытии. Я создаю файл include-all.test.js вместе с другими тестовыми сценариями и добавляю следующий фрагмент кода:

var glob = require( 'glob' )
var path = require( 'path' );

glob.sync( './path/to/js/code/*.js' ).forEach( function( file ) {
    // we don't care about errors here, we just want to require the file
    try {
        require( path.resolve( file ) );
    } catch(e) {}
});

Это гарантирует, что ваши непроверенные файлы будут включены в отчет о покрытии istanbul.

person Elliot B.    schedule 19.12.2018
comment
Я пробовал это также. Но, к сожалению, тоже не работает. Это моя команда: ./node_modules/.bin/istanbul cover --handle-sigint app.js - person iam thadiyan; 30.01.2019
comment
То же самое. Это определенно требует файлов, но они не отображаются в отчете. - person Eric Jorgensen; 17.12.2020