Sonarqube for Typescript 上未显示代码覆盖率

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)

She*_*n F 5

您是否尝试过像这样 指定lcov.info文件的路径:sonar.javascript.lcov.reportPaths=coverage/lcov.info

这些参数记录在此处


Dav*_*arr 0

我不能确定,但​​你的症状与我在 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)