我有一个打字稿项目,该项目通过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"
我的sonar-project.properties如下:
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
此设置有两个问题:
我似乎找不到合并不同coverage文件的方法。我已经检查了官方的istanbuljs / nyc GitHub,并声明它可以通过nyc merge
命令进行组合,但是输出为.json,并且sonarqube需要xml。我只保留一半的代码覆盖范围,因为我只交付一个文件而不是合并文件。
我目前在tests / coverage / all文件夹中有代码气味错误,因为它认为缺少从生成的coverage中丢失的字体。我已将该文件夹排除在sonar-project.properties
文件中,而我也将其包含在.gitignore中,但sonarqube仍将其报告为小代码。
答案 0 :(得分:1)
SonarQube不需要XML文件来覆盖JavaScript,它要求报告采用 lcov 格式。请参阅SonarQube的文档:JavaScript Coverage Results Import。
要生成此lcov报告,您可以执行以下操作:
__coverage__
全局写入的内容)放置在目录中,默认值为.nyc_output
nyc report --reporter=lcov --report-dir=.nyc_coverage
nyc
您要使用--report-dir
指定的目录中的所有文件来生成报告(在这种情况下为.nyc_coverage
),并且您希望该报告采用以下格式:由--reporter
指定(在这种情况下为lcov
)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