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

如何在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%:
测试覆盖率为0%的截图

问询

如何配置GitHub Actions中的SonarCloud,使其能够正确统计Googletest的测试覆盖率?


解决步骤

要让SonarCloud正确识别Googletest的测试覆盖率,需要补充覆盖率数据生成逻辑并配置SonarScanner读取数据,具体操作如下:

  1. 修改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)
  1. 在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
  1. 配置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
  1. 关键注意事项
  • 构建类型建议使用Debug或Coverage,Release模式的编译优化会导致覆盖率数据失真
  • 调整lcov的--remove参数,匹配你的项目目录结构,确保只统计业务代码的覆盖率
  • 确认测试目标的名称与CMake配置中的一致,避免链接gcov失败

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.03 23:05:21