Слияние покрытия для Sonarqube с istabuljs / nyc - PullRequest
1 голос
/ 25 июня 2019

У меня есть проект машинописного текста, который проходит через конвейер Jenkins и выполняет все функциональные тесты параллельно (после сборки основного контейнера).В конце конвейера - мы создаем проверку покрытия кода, а затем отправляем результат в sonarqube.

вот мой package.json:

"test": "npm run test:unit && npm run test:component && npm run test:functional",
"test:component": "mocha --reporter mocha-sonarqube-reporter --reporter-options output=tests/coverage/component/test-xcomponent.xml --recursive -r ts-node/register tests/component/*.ts",
"test:functional": "mocha --reporter mocha-sonarqube-reporter --reporter-options output=tests/coverage/functional/test-xfunctional.xml --recursive -r ts-node/register tests/functional/*.ts",
"test:unit": "mocha --reporter mocha-sonarqube-reporter --reporter-options output=tests/coverage/unit/test-xunit.xml --recursive -r ts-node/register tests/unit/*.ts",
"test:unit:nosq": "mocha --recursive -r ts-node/register tests/unit/*.ts",
"lint": "tslint -t verbose --project tsconfig.json -c tslint.json",
"cover": "nyc --report-dir tests/coverage/all npm run test",
"cover:unit": "nyc --report-dir tests/coverage/unit npm run test:unit",
"cover:functional": "nyc --report-dir tests/coverage/functional -x 'app/repositories' -x 'app/entities' -x 'app/utils' --no-clean npm run test:functional"

my sonar-project.properties isкак следующее:

sonar.exclusions=**/node_modules/**,**/*.spec.ts,app/entities/**,dependency-check-report/*,tests/coverage/**/*
sonar.tests=tests
sonar.test.inclusions=tests/**/*
sonar.ts.tslintconfigpath=tslint.json
sonar.typescript.lcov.reportPaths=tests/coverage/all/lcov.info

У меня есть две проблемы с этой настройкой:

  • Я не могу найти способ объединить различные файлы покрытия.Я проверил официальный istanbuljs / nyc GitHub, и он заявляет, что он может объединяться с помощью команды nyc merge, но на выходе получается .json, а sonarqube требует xml.Я застрял с половиной покрытия кода, так как отправляю только один файл, а не файл объединения.

  • В настоящее время у меня есть ошибки запаха кода из папки tests / cover / allпоскольку считалось, что отсутствующие шрифты из сгенерированного покрытия отсутствуют.Я исключил эту папку в файле sonar-project.properties и включил ее также в .gitignore, но sonarqube по-прежнему сообщает о ней как о маленьком коде.

1 Ответ

1 голос
/ 25 июня 2019

SonarQube не требует XML-файлов для покрытия JavaScript, он требует, чтобы отчет был в формате lcov .Пожалуйста, ознакомьтесь с документацией SonarQube: Импорт результатов покрытия JavaScript .

Чтобы создать этот отчет lcov, вы можете сделать следующее:

  1. Поместите все свои JSONданные о покрытии (что записывает браузер / проводка глобально __coverage__) в каталог, по умолчанию .nyc_output
  2. Запустите команду nyc report --reporter=lcov --report-dir=.nyc_coverage
  3. Это говорит nyc, чтовы хотите сгенерировать отчет, используя все файлы в каталоге, указанном --report-dir (.nyc_coverage в данном случае), и что вам нужен отчет в формате, указанном --reporter (lcov в данном случае)
  4. nyc создаст папку (.nyc_output по умолчанию) и запишет туда файл lcov

Если вы хотите, вы также можете добавить дополнительных репортеров для здравомыслия.Я обычно добавляю --reporter=text, чтобы он также распечатывал покрытие.

Таким образом, ваша последняя команда может быть:

nyc report \
  --reporter=lcov \
  --reporter=text \
  --report-dir=.nyc_coverage

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

nyc --reporter lcov --reporter text --report-dir .nyc_coverage report

Кроме того, вы сообщаете SonarQube, где находится отчет, указав его в командной строке:

sonar-scanner \
  -Dsonar.projectKey=whatever \
  -Dsonar.javascript.lcov.reportPaths=coverage/lcov.info

Или вы можете установить его в настройках проекта:

Project -> Administration -> JavaScript -> Tests and Coverage -> LCOV Files
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...