SonarQube忽略Angular单元测试spec文件无覆盖率问题排查
Angular 13项目SonarQube覆盖率显示为空的修复方案
这个问题基本不是SonarQube服务端配置故障,核心原因是Sonar扫描器没有正确读取到可解析的单元测试覆盖率报告,和你把coverage文件夹加入.gitignore没有关系——Sonar扫描读取的是执行扫描时本地/流水线工作目录下的文件,不会拉取Git仓库里提交的内容,不用特意把coverage目录提交到仓库。
常见触发原因
- Angular默认生成的覆盖率报告格式不被SonarQube支持
- Sonar扫描配置里的覆盖率文件路径填写错误,扫描器找不到目标文件
- 任务执行顺序错误,先跑了Sonar扫描,后执行单测生成覆盖率,扫描时目录下还没有报告文件
- 极低概率:SonarQube安装的JS/TS语言插件和主版本不兼容,无法解析覆盖率文件
分步修复操作
- 调整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文件,这步就配置正确了。 - 修正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.infoangular.json里自定义过覆盖率输出目录,这里的路径要和你实际配置的输出路径完全对应,不要直接抄默认路径。 - 校验任务执行顺序
本地调试或者流水线执行时,必须严格按以下顺序跑任务:- 安装依赖:
npm install - 执行单测生成覆盖率:
npm test,注意不要加--watch参数,要等单测进程正常退出、coverage目录生成完整再走下一步 - 执行SonarQube扫描
不要把扫描步骤放在单测执行之前,否则扫描时拿不到生成好的报告,自然显示为空。
- 安装依赖:
- 低概率问题排查
如果以上三步都配置正确还是不显示覆盖率,登录SonarQube管理后台,在应用市场查看已安装的JavaScript/TypeScript插件版本,确认插件版本和当前部署的SonarQube主版本兼容,版本不匹配的话升级或降级对应插件即可,不需要修改服务端其他配置。
注意:不要为了让Sonar读到报告特意把coverage文件夹从.gitignore中移除,提交覆盖率目录到Git仓库完全是多余操作。
内容的提问来源于stack exchange,提问作者Drax
相关产品推荐
相关产品推荐

