Невозможно получить покрытие кода с помощью Cypress + Istanbul

Я попытался настроить покрытие кода в проекте Angular 8 с помощью Cypress и istanbul nyc.

Мне удалось инструментировать код (глобальная переменная __coverage__ настроена правильно):

введите описание изображения здесь

и файл покрытия, созданный в .nyc_output после запуска cypress:open

введите описание изображения здесь

Но сгенерированный отчет о покрытии пуст:

$ cat coverage/coverage-final.json
{}

Тот же результат, когда я выполняю команду:

$ npx nyc report --report-dir ./coverage --temp-dir .nyc_output --reporter=text
----------|----------|----------|----------|----------|-------------------|
File      |  % Stmts | % Branch |  % Funcs |  % Lines | Uncovered Line #s |
----------|----------|----------|----------|----------|-------------------|
All files |        0 |        0 |        0 |        0 |                   |
----------|----------|----------|----------|----------|-------------------|

Вот мой package.json devDependencies:

"devDependencies": {
  "@angular-devkit/build-angular": "^0.803.3",
  "@angular-devkit/build-optimizer": "^0.803.3",
  "@angular/cli": "^8.3.3",
  "@angular/compiler-cli": "8.2.5",
  "@angular/language-service": "8.2.5",
  "@briebug/cypress-schematic": "^2.0.0",
  "@cypress/code-coverage": "^1.10.1",
  "@cypress/webpack-preprocessor": "^4.1.0",
  "@istanbuljs/nyc-config-typescript": "^0.1.3",
  "@types/jasmine": "^3.4.0",
  "@types/jasminewd2": "^2.0.6",
  "@types/node": "^12.7.4",
  "babel-plugin-istanbul": "^5.2.0",
  "codelyzer": "^5.1.0",
  "cypress": "^3.4.1",
  "istanbul-instrumenter-loader": "^3.0.1",
  "istanbul-lib-coverage": "^2.0.5",
  "jasmine-core": "^3.4.0",
  "jasmine-spec-reporter": "4.2.1",
  "karma": "^4.3.0",
  "karma-chrome-launcher": "^3.1.0",
  "karma-cli": "^2.0.0",
  "karma-coverage-istanbul-reporter": "^2.1.0",
  "karma-jasmine": "^2.0.1",
  "karma-jasmine-html-reporter": "^1.4.2",
  "mochawesome": "^4.1.0",
  "ngx-build-plus": "^8.1.4",
  "nyc": "^14.1.1",
  "protractor": "^5.4.2",
  "protractor-html-reporter-2": "^1.0.4",
  "protractor-http-client": "^1.0.4",
  "source-map-support": "^0.5.13",
  "ts-node": "^8.3.0",
  "tslib": "^1.10.0",
  "tslint": "^5.19.0",
  "typescript": "3.5.3"
}

И мой .nycrc.json:

{
    "cache": false,
    "extension": [
      ".ts",
      ".tsx"
    ],
    "exclude": [
      "**/*.d.ts",
      "coverage/**",
      "packages/*/test/**",
      "test/**",
      "test{,-*}.ts",
      "**/*{.,-}{test,spec}.ts",
      "**/__tests__/**",
      "**/node_modules/**"
    ],
    "all": true,
    "check-coverage": true,
    "require": [
      "ts-node/register"
    ],
    "temp-directory": ".nyc_output",
    "sourceMap": false,
    "instrument": false,
    "include": ["src/**/*.ts", "src/**/*.tsx"]
}

person Majid Laissi    schedule 10.09.2019    source источник
comment
У вас есть этот код в файле поддержки? // cypress / support / index.js import '@ cypress / code-cover / support'   -  person N..    schedule 10.09.2019
comment
@N .. нету извините   -  person Majid Laissi    schedule 10.09.2019
comment
извините, я неправильно понял вопрос (видел его до того, как он был отредактирован). да, у меня есть измененные файлы поддержки и плагинов, вы можете видеть, что задачи выполняются (resetCoverage, combCoverage, охватReport)   -  person Majid Laissi    schedule 10.09.2019
comment
проблема в том, что Нью-Йорк не генерирует правильный вывод   -  person Majid Laissi    schedule 10.09.2019


Ответы (3)


Кажется, проблема в nyc, когда excludeAfterRemap истинно.

установка значения false устранила проблему.

person Majid Laissi    schedule 10.09.2019

Вот подробное описание, шаг за шагом. https://docs.cypress.io/guides/tooling/code-coverage.html#E2E-code-coverage

Я думаю, что в index.js отсутствует файл покрытия кода / поддержки. Проследите за изменениями и запустите. Я думаю, у тебя должно быть хорошо.

    // cypress/support/index.js
       import '@cypress/code-coverage/support'

   // cypress/plugins/index.js   
      module.exports = (on, config) => {
      on('task', require('@cypress/code-coverage/task'))}

Когда вы запустите тесты Cypress сейчас, вы должны увидеть несколько команд после завершения тестов. Мы выделили эти команды зеленым прямоугольником ниже.

person N..    schedule 10.09.2019
comment
спасибо за ответ, однако у меня есть команды, как вы можете видеть в вопросе (первый снимок экрана) - person Majid Laissi; 10.09.2019
comment
Еще одна необходимая вещь, которую я упустил, - это вернуть конфиг. docs.cypress.io/guides/tooling/code-coverage# Установить плагин module.exports = (on, config) = ›{require ('@ cypress / code-extension / task') (on, config); / * прочее; * / return config;}; - person Steve Tomlin; 05.04.2021
comment
Есть еще одна скрытая проблема. Я использую машинописный текст. В одном из моих примеров я понял, что моя первая страница - src / index.js - это расширение .js. В течение дня я не мог понять, почему мое покрытие не рендерилось. Когда я изменил index.js на index.tsx, покрытие было восстановлено. - person Steve Tomlin; 16.05.2021

При использовании @ cypress / code-cover вы должны знать, что плагин не инструментирует ваш код. Для инструментов кода необходимо использовать подключаемый модуль babel-plugin-istanbul.

если вы уже используете babel, вам необходимо добавить плагин в свой .babelrc следующим образом:

{
  "plugins": ["istanbul"]
}

Для получения дополнительной информации проверьте https://github.com/cypress-io/code-coverage#instrument-your-application

person coolbeatz71    schedule 10.01.2021