C++ 代码覆盖率 - gitlab 运行程序、cmake 和绝对路径

问题描述 投票:0回答:1

当一个项目集成到 gitlab CI 管道中时,该管道通常分为几个步骤:

  • 编译
  • 单元测试
  • 集成测试

这些测试可以在运行器池上执行,每个步骤可能在不同的服务器/运行器上

我的问题是代码覆盖率。 据我了解,代码覆盖率分析遵循以下步骤:

  • 使用 --coverage 编译项目:它将生成 .gcno 文件
  • 运行您的测试:它将生成 .gcda 文件
  • 运行您选择的报告器 lcov 或 gcovr,为 gitlab/sonarqube 生成覆盖率报告

当所有这些都在单个运行器上的单个作业中完成时,一切都会顺利进行。 然而,当您开始在不同的作业之间分割步骤时,您会遇到路径问题。

CMake 在 .gcno 文件中生成绝对路径。因此,当您去运行测试时,引用的绝对路径可能不存在,并且您将无法生成覆盖率报告。

您如何解决这个问题?

我尝试使用

  • 使用 sed 命令手动修补 .gcno 文件。还不够
  • 使cmake生成相对路径:找不到简单的方法
c++ cmake gitlab code-coverage
1个回答
0
投票

万一有人偶然发现这个问题,我们终于找到了解决这个问题的方法,到目前为止已经在一个小项目上进行了测试

  • 修补 cmake 生成的 makefile 以使用 cpp 文件的相对路径:您的 .gcno 文件也将使用相对路径
build:
  stage: build
  artifacts:
    paths:
      - ./build/
  script:
    - PROJECT_DIR=$PWD
    - mkdir build && cd build
    - cmake ../ -DCMAKE_BUILD_TYPE=COVERAGE
    # Kludge : Patch absolute paths into relative paths
    - find . -name build.make -exec sed "s|-c $PROJECT_DIR|-c ..|g" -i {} \;
    - make -j8  
  • 使用 GCOV_PREFIX 和 GCOV_PREFIX_STRIP 覆盖您的 .gcna 文件位置
unit_tests:
  stage: test
  coverage: '/^TOTAL.*\s+(\d+\%)$/'
  artifacts:
    reports:
      coverage_report:
        coverage_format: cobertura
        path: coverage.xml
  script:
    - export GCOV_PREFIX=$PWD
    # Typical shell runner path is /home/runner/builds/<runner_id>/0/<group>/<project>
    - export GCOV_PREFIX_STRIP=7
    - cd build
    - ./tests
    - gcovr -r ../ . --txt --cobertura ../coverage.xml
© www.soinside.com 2019 - 2024. All rights reserved.