Pra*_*and 6 unit-testing typescript sonarqube nestjs
我正在为我的 Nestjs 项目使用 Sonarqube 分析。当我用 jest 运行单元测试时,它们全部通过,代码覆盖率约为 80%。在 Sonarqube 上它仍然显示为 0%。
我的sonar-project.properties文件如下
sonar.projectKey=<project-key>
sonar.projectName=
sonar.sources=src
sonar.tests=src
sonar.inclusions=**
sonar.test.inclusions=src/**/*.spec.ts
sonar.testExecutionReportPaths=test-report.xml
sonar.exclusions=node_modules
Run Code Online (Sandbox Code Playgroud)
我的jest.json如下
{
"moduleFileExtensions": [
"ts",
"tsx",
"js",
"json"
],
"transform": {
"^.+\\.tsx?$": "ts-jest"
},
"testRegex": "/src/.*\\.(test|spec).(ts|tsx|js)$",
"collectCoverageFrom" : ["src/**/*.{js,jsx,tsx,ts}", "!**/node_modules/**", "!**/vendor/**"],
"coverageReporters": ["json", "lcov"]
}
Run Code Online (Sandbox Code Playgroud)
我的package.json的相关部分
"devDependencies": {
"@nestjs/cli": "^7.5.4",
"@nestjs/schematics": "^7.2.7",
"@nestjs/testing": "^7.6.11",
"@types/jest": "^26.0.20",
"@types/node": "^14.14.25",
"@types/supertest": "^2.0.10",
"@typescript-eslint/eslint-plugin": "^4.14.2",
"@typescript-eslint/parser": "^4.14.2",
"eslint": "^7.19.0",
"eslint-config-prettier": "^7.2.0",
"eslint-plugin-prettier": "^3.1.4",
"jest": "^26.6.3",
"jest-sonar-reporter": "^2.0.0",
"prettier": "^2.2.1",
"serverless": "^2.23.0",
"supertest": "^6.1.3",
"ts-jest": "^26.5.0",
"ts-loader": "^8.0.15",
"ts-node": "^9.1.1",
"tsconfig-paths": "^3.9.0",
"typescript": "^4.1.3"
},
"jest": {
"testResultsProcessor": "jest-sonar-reporter",
"moduleFileExtensions": [
"js",
"json",
"ts"
],
"rootDir": "src",
"testRegex": ".*\\.spec\\.ts$",
"transform": {
"^.+\\.(t|j)s$": "ts-jest"
},
"collectCoverageFrom": [
"**/*.(t|j)s"
],
"coverageDirectory": "../coverage",
"testEnvironment": "node"
}
Run Code Online (Sandbox Code Playgroud)
我的源代码及其各自的单元测试位于同一位置。测试文件的扩展名为 .spec.ts
在本地运行测试时,所有测试都会通过,并在本地存储库上生成 test-report.xml。我们还在 Jenkins 上运行单元测试,作为运行声纳扫描仪之前的一个阶段。
Sonarqube 代码覆盖率对我们来说是一个重要的指标,没有它,管道就不会进一步发展。这里有什么建议吗?
Sonarqube 企业版版本 7.9.5(内部版本 38598)
我不能确定,但你的症状与我在 SonarTS 插件中发现错误时所看到的相符。我们使用的是较旧版本的 SonarQube (7.9.2)。你还没说你用的是什么版本。
我从随机实验中发现,如果“lcov.info”文件中的文件路径跨越符号链接,SonarTS 插件将无法打开该文件,从而发现该文件的覆盖率为零。如果 lcov.info 文件中的单个文件跨越符号链接,则很可能所有文件都会跨越符号链接。
我通过编写一个处理 lcov.info 文件的脚本来修复此问题,将所有文件路径替换为其“绝对”文件路径,并遵循符号链接。
我们的 Jenkins 共享库中的代码如下所示:
shterse "cat coverage/lcov.info | " +
"while IFS= read -r line; do if [[ \"\$line\" == \"SF:\"* ]]; then line=\"SF:\$(realpath \"\${line#SF:}\")\"; fi; echo \"\$line\"; done > /tmp/lcov.info"
sh "mv /tmp/lcov.info coverage/lcov.info"
Run Code Online (Sandbox Code Playgroud)
其中“shterse”是这样的:
// This will turn off verbose output.
def shterse(cmd) {
sh('#!/bin/sh -e\n' + cmd)
}
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
15563 次 |
| 最近记录: |