当前位置: 首页 > 知识库问答 >
问题:

Sonarqube上没有显示Typescript的代码覆盖率

姬飞昂
2023-03-14

我正在使用Sonarqube分析我的Nestjs项目。当我用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 

我的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"]
}

我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"
}

我的源代码和它们各自的单元测试在同一个位置。测试文件有扩展名。spec.ts

在本地运行测试时,所有测试都通过了,test-report.xml在本地存储库上生成。我们也在运行声纳扫描仪之前在詹金斯上运行单元测试。

Sonarqube代码覆盖率对我们来说是一个重要指标,没有它,管道就不会进一步发展。有什么建议吗?

Sonarqube企业版7.9.5(build 38598)

共有2个答案

弓磊
2023-03-14

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

这里的“shterse”是:

// This will turn off verbose output.
def shterse(cmd) {
    sh('#!/bin/sh -e\n' + cmd)
}
葛承教
2023-03-14

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

这些参数记录在这里:

 类似资料:
  • 问题内容: 我有一个Jenkins项目,对我的NodeJS项目进行SonarQube分析。我添加了对项目的依赖。在Jenkins构建配置中,首先运行一个shell脚本: 这将安装依赖项,运行测试并生成代码覆盖率报告,并生成cobertura-coverage.xml文件。 在shell脚本之后,我运行具有以下属性的代码覆盖: Jenkins作业通过SonarQube仪表板成功运行,该仪表板描述了项

  • Jenkins作业成功地运行了一个SonarQube仪表板,它描述了项目的各种内容,如代码行、技术债务、问题等等。但是单元测试的代码覆盖率并没有显示在SonarQube仪表板上。我确保仪表板有单元测试小部件。 我验证了工作区确实有文件。还检查了构建控制台日志,没有发现bug。我之前也尝试过使用LCOV格式推送代码覆盖率: 即使在Jenkins工作区中生成了覆盖率报告,该报告也不会发布到SonarQ

  • 我正在分析一个经过单元测试和Cobertura覆盖的Java项目。报告了xml。我正在使用SonarQube 4.1.1和最新的SonarRunner。我已经成功地将Cobertura覆盖率结果导入到Sonar 3.2和Ant analyzer,但在这个新版本中,我遇到了问题。在新的声纳分析执行(通过Jenkins)中,我在日志中没有看到它会启动任何Cobertura引擎或任何东西。我在Runne

  • 索纳库贝:8.2。0.32929 声纳扫描仪:3.0。3.778 雅科科:0.8。4 jdk:1.8 mvn:3.6。三, 你想达到什么目标 我试图通过使用sonar scanner实现代码覆盖率,但在sonarqube仪表板中获得代码覆盖率0。 到目前为止,您是如何实现这一目标的 我使用https://github.com/SonarSource/sonar-scanning-examples/

  • 我将sonarqube jacoco用于codecoverage,我有一个junit测试用例用于我的java代码,它采用的是下面的目录结构。 我希望在sonarqube仪表板上有一个代码覆盖率,我也在使用gradle。 我正在运行gradle sonarqube 我不知道我哪里做错了?如果有任何一个可以帮助从java代码中获得测试用例的覆盖面。

  • 我们有一个多模块maven项目。我们正在使用jacoco进行代码覆盖率分析。我准备了pom文件来运行测试用例并获取代码覆盖率。当我在本地构建项目时,我可以在sonar仪表板上看到代码覆盖率。 将更改推送到github之后,当jenkins构建触发时,sonar仪表板上的代码覆盖率不可用。我在jenkins构建日志中发现以下错误: 未收集覆盖范围信息。也许您忘记了在编译的类中包含调试信息? 在成功的