如何在GitHub Actions中配置SonarCloud以获取Googletest测试覆盖率?
简介
我目前正在开发一个基于CMake和Googletest的C语言项目,代码托管在GitHub仓库。
已配置的GitHub工作流如下:
name: Build on: push: branches: - main pull_request: types: [opened, synchronize, reopened] jobs: build: name: Build runs-on: ubuntu-latest env: BUILD_WRAPPER_OUT_DIR: build_wrapper_output_directory # Directory where build-wrapper output will be placed steps: - uses: actions/checkout@v3 with: submodules: recursive fetch-depth: 0 # Shallow clones should be disabled for a better relevancy of analysis - name: Install sonar-scanner and build-wrapper uses: SonarSource/sonarcloud-github-c-cpp@v1 - name: Run build-wrapper run: | mkdir build cmake -S . -B build build-wrapper-linux-x86-64 --out-dir ${{ env.BUILD_WRAPPER_OUT_DIR }} cmake --build build/ --config Release - name: Run sonar-scanner env: GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} SONAR_TOKEN: ${{ secrets.SONARCLOUD_TOKEN }} # Put the name of your token here run: | sonar-scanner --define sonar.cfamily.build-wrapper-output="${{ env.BUILD_WRAPPER_OUT_DIR }}"
问题
执行该工作流后,SonarCloud显示测试覆盖率为0%:
问询
如何配置GitHub Actions中的SonarCloud,使其能够正确统计Googletest的测试覆盖率?
解决步骤
要让SonarCloud正确识别Googletest的测试覆盖率,需要补充覆盖率数据生成逻辑并配置SonarScanner读取数据,具体操作如下:
- 修改CMake配置,启用覆盖率编译选项
在项目根目录的CMakeLists.txt中添加编译参数,生成覆盖率追踪信息:
# 仅在Debug或自定义Coverage构建类型下启用覆盖率 if(CMAKE_BUILD_TYPE STREQUAL "Debug" OR CMAKE_BUILD_TYPE STREQUAL "Coverage") set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -fprofile-arcs -ftest-coverage") set(CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} -fprofile-arcs -ftest-coverage") endif() # 给测试目标链接gcov库(适配Googletest) target_link_libraries(你的测试目标名称 PRIVATE gcov)
- 在GitHub工作流中添加覆盖率数据收集步骤
在原工作流的Run build-wrapper步骤之后,新增测试执行与覆盖率数据生成步骤:
- name: Install lcov for coverage collection run: sudo apt-get install -y lcov - name: Run tests and generate coverage data run: | cd build # 执行所有测试 ctest --output-on-failure # 收集覆盖率原始数据 lcov --capture --directory . --output-file coverage.info # 过滤掉第三方依赖、测试代码等不需要统计的内容 lcov --remove coverage.info '/usr/*' '*/googletest/*' '*/tests/*' --output-file coverage.info.cleaned
- 配置SonarScanner读取覆盖率数据
修改Run sonar-scanner步骤,添加覆盖率相关参数:
- name: Run sonar-scanner env: GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} SONAR_TOKEN: ${{ secrets.SONARCLOUD_TOKEN }} run: | sonar-scanner \ --define sonar.cfamily.build-wrapper-output="${{ env.BUILD_WRAPPER_OUT_DIR }}" \ --define sonar.coverageReportPaths=build/coverage.info.cleaned \ --define sonar.cfamily.gcov.reportsPath=build
- 关键注意事项
- 构建类型建议使用Debug或Coverage,Release模式的编译优化会导致覆盖率数据失真
- 调整lcov的
--remove参数,匹配你的项目目录结构,确保只统计业务代码的覆盖率 - 确认测试目标的名称与CMake配置中的一致,避免链接gcov失败
内容的提问来源于stack exchange,提问作者ThrowsError
相关产品推荐
相关产品推荐

