Как сделать Стамбул источником покрытия для всего моего исходного кода?
В настоящее время в Стамбуле генерируется только покрытие для файлов, которые используются в моих тестах, и это нормально, но, похоже, преследует цель иметь покрытие несколько.
У меня нет конфигурации в Стамбуле, и я вызываю ее через npm test
со следующей строкой script:
$ istanbul cover _mocha -- -R dot --check-leaks --recursive test/
Есть ли способ создать покрытие для всего моего исходного кода?
Ответы
Ответ 1
Нашел ответ, я думаю, что мне отчасти повезло, что выбранная мной структура каталогов позволяет мне использовать эту опцию, но теперь моя тестовая команда:
$ istanbul --include-all-sources cover _mocha -- -R dot --recursive test/
--include-all-sources
является важной частью.
Ответ 2
В Стамбуле рекомендуется использовать nyc, чтобы проверить покрытие кода. Он предлагает такой подход:
nyc mocha
После выполнения этой команды мы получим отчет о покрытии. Но есть пара подводных камней.
Прежде всего, по умолчанию mocha
ищет тесты в папке test
. Чтобы переопределить его, мы должны установить собственный путь в файле mocha.opts
следующим образом:
nyc mocha --opts ./mocha.opts
И mocha.opts
содержит такой код, например:
spec/unit/back-end/**/*.spec.js
Другая проблема заключается в том, что по умолчанию nyc
проверяет наличие только требуемых файлов, о чем идет речь. Решение состоит в том, чтобы установить два параметра для nyc
(я запускаю тест как npm script, поэтому я устанавливаю параметры в 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
глубоко, и я основываюсь только на собственном опыте.
Ответ 3
Для создания покрытия для всех файлов, есть следующее в вашем package.json
"istanbulCoverage": " nyc --reporter = lcov --reporter = text-lcov --all -x \"./node_modules/\ "-x \"./охват/\ "проверка-покрытие --functions 90 npm run test "
Здесь флаг --all выбирает все файлы в вашем проекте. Если вы хотите исключить определенные файлы или папки, вы можете использовать опцию -x.
Помимо этого, если вы хотите указать уровень покрытия для своего приложения, используйте опцию проверки покрытия, чтобы указать пороговое значение. В моем случае я указал функции с порогом покрытия 90%. В противном случае создание отчета о покрытии завершится неудачно (я запускаю тест кармы после создания отчета о покрытии).
Надеюсь, это помогло :)
Ответ 4
В моем случае --include-all-sources
у меня не сработало. Файлы, которые не require
-d, все еще были исключены из окончательного отчета о покрытии.
В конце концов, я столкнулся с этой проблемой на GitHub istanbul
где сопровождающий заявил:
Да, это ожидаемое поведение. Стамбул работает, перехватывая require, поэтому, если файл никогда не требует -d, он как будто его не существует.
Единственное надежное решение, которое я нашел, - вручную require
все файлы, которые я хотел включить в свой отчет о покрытии. Я создаю файл include-all.test.js
вместе с другими моими тестовыми сценариями и добавляю следующий 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
.