You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

SonarQube忽略Angular单元测试spec文件无覆盖率问题排查

Angular 13项目SonarQube覆盖率显示为空的修复方案

这个问题基本不是SonarQube服务端配置故障,核心原因是Sonar扫描器没有正确读取到可解析的单元测试覆盖率报告,和你把coverage文件夹加入.gitignore没有关系——Sonar扫描读取的是执行扫描时本地/流水线工作目录下的文件,不会拉取Git仓库里提交的内容,不用特意把coverage目录提交到仓库。

常见触发原因

  • Angular默认生成的覆盖率报告格式不被SonarQube支持
  • Sonar扫描配置里的覆盖率文件路径填写错误,扫描器找不到目标文件
  • 任务执行顺序错误,先跑了Sonar扫描,后执行单测生成覆盖率,扫描时目录下还没有报告文件
  • 极低概率:SonarQube安装的JS/TS语言插件和主版本不兼容,无法解析覆盖率文件

分步修复操作

  1. 调整Angular单测配置,输出Sonar可解析的lcov格式报告
    打开项目根目录的karma.conf.js文件,找到coverageIstanbulReporter配置块,在reports数组中加入lcovonly选项,参考配置如下:
    coverageIstanbulReporter: {
      dir: require('path').join(__dirname, './coverage'),
      reports: ['html', 'lcovonly', 'text-summary'],
      fixWebpackSourcePaths: true
    }
    
    改完本地执行npm test,等单测运行结束后,去coverage/[你的项目名称]目录下确认存在lcov.info文件,这步就配置正确了。
  2. 修正Sonar扫描参数
    不管你是用根目录下的sonar-project.properties配置扫描规则,还是在CI流水线里传参启动扫描,必须准确填写lcov文件的路径:
    # JS/TS覆盖率报告路径,注意Angular 13默认会在coverage目录下生成和项目同名的子文件夹,路径要写到lcov.info所在的实际位置
    sonar.javascript.lcov.reportPaths=coverage/你的项目名/lcov.info
    sonar.typescript.lcov.reportPaths=coverage/你的项目名/lcov.info
    
    如果你之前在angular.json里自定义过覆盖率输出目录,这里的路径要和你实际配置的输出路径完全对应,不要直接抄默认路径。
  3. 校验任务执行顺序
    本地调试或者流水线执行时,必须严格按以下顺序跑任务:
    • 安装依赖:npm install
    • 执行单测生成覆盖率:npm test,注意不要加--watch参数,要等单测进程正常退出、coverage目录生成完整再走下一步
    • 执行SonarQube扫描
      不要把扫描步骤放在单测执行之前,否则扫描时拿不到生成好的报告,自然显示为空。
  4. 低概率问题排查
    如果以上三步都配置正确还是不显示覆盖率,登录SonarQube管理后台,在应用市场查看已安装的JavaScript/TypeScript插件版本,确认插件版本和当前部署的SonarQube主版本兼容,版本不匹配的话升级或降级对应插件即可,不需要修改服务端其他配置。

注意:不要为了让Sonar读到报告特意把coverage文件夹从.gitignore中移除,提交覆盖率目录到Git仓库完全是多余操作。

内容的提问来源于stack exchange,提问作者Drax

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.30 00:31:04