如何在SonarQube中获取C++库代码覆盖率报告(源文件无数据问题)
环境配置
- 多模块CMake构建的C++库
- 单元测试基于googletest
- 构建流水线运行在Jenkins服务器
已尝试操作
- 执行
gcovr --keep或gcov *.o,并在sonar-project.properties中配置my-module.sonar.cfamily.gcov.reportsPath=path-to-gcov-files,结果仅头文件显示覆盖率,日志中可见Sensor gcov [cpp]相关记录; - 执行
gcovr --sonarqube coverage.xml,配置my-module.sonar.coverageReportPaths=./coverage.xml,但SonarQube无任何覆盖率数据,日志也无相关内容;但直接运行gcovr能同时获取头文件和源文件的覆盖率结果。
问题排查与解决方案
针对第一种操作(生成gcov文件)
校验gcov文件路径与SonarQube配置匹配
确保path-to-gcov-files指向的目录下存在源文件对应的.gcov文件,而非只有头文件的。gcov默认可能将文件生成在编译目录而非源码目录,建议执行gcovr --root . --keep指定项目根目录,生成路径正确的gcov文件。确认SonarQube已扫描到源文件
在sonar-project.properties中检查my-module.sonar.sources是否正确包含C++源文件目录,例如my-module.sonar.sources=src/。如果SonarQube未扫描到源文件,自然无法显示其覆盖率数据。强制开启覆盖率编译选项
编译C++代码时必须添加-fprofile-arcs -ftest-coverage编译参数,链接阶段也要加上-fprofile-arcs,否则无法生成有效覆盖率数据。CMake中可全局配置:add_compile_options(-fprofile-arcs -ftest-coverage) add_link_options(-fprofile-arcs)
针对第二种操作(生成SonarQube格式XML)
修正SonarQube配置项
C项目需使用C/C插件专属的配置项sonar.cfamily.coverageReportPaths,而非通用的sonar.coverageReportPaths。修改配置为:my-module.sonar.cfamily.coverageReportPaths=./coverage.xml确保XML文件路径与SonarQube扫描路径一致
运行gcovr时需指定--root参数指向项目根目录,例如:gcovr --root . --sonarqube coverage.xml这样生成的XML中文件路径才会与SonarQube扫描到的源文件路径匹配,否则无法关联显示覆盖率。
对齐Jenkins工作目录
在Jenkins流水线中,确保gcovr生成XML的工作目录与SonarQube扫描的工作目录一致,避免因路径相对关系错误导致SonarQube无法识别XML中的文件。
内容的提问来源于stack exchange,提问作者tabs

