C++代码覆盖率- gitlab runners、cmake和绝对路径

cuxqih21  于 2023-10-20  发布在  Git
关注(0)|答案(1)|浏览(150)

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

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

这些测试可以在运行程序池中执行,每一步都可能在不同的服务器/运行程序上执行
我的问题是代码覆盖率。根据我的理解,代码覆盖率分析遵循以下步骤:

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

当所有这一切都在一个单一的工作在一个单一的亚军,一切工作顺利。但是,当您开始在不同作业之间拆分步骤时,会遇到路径问题。
CMake在.gcno文件中生成绝对路径。因此,当您运行测试时,引用的绝对路径可能不存在,您将无法生成覆盖率报告。
你如何解决这个问题?
我尝试使用

  • 用sed命令手动修补.gcno文件。不够
  • 使cmake生成相对路径:找不到一个简单的方法
jjjwad0x

jjjwad0x1#

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

  • 修补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

相关问题