You need to enable JavaScript to run this app. CMake生成覆盖率报告仅包含测试文件,如何统计业务源文件覆盖率
优惠活动
大模型
产品
解决方案
定价
更多

CMake生成覆盖率报告仅包含测试文件,如何统计业务源文件覆盖率

问题根因

  1. 覆盖率编译标志位仅作用于测试目标,业务代码tcpstream编译时未添加--coverage等覆盖率相关编译、链接选项,无法生成覆盖率统计所需的.gcno、.gcda文件
  2. 当前配置的COVERAGE_LCOV_EXCLUDES是lcov工具的排除参数,你使用的是gcovr生成HTML报告,该参数不生效
  3. 生成覆盖率报告时未指定业务代码路径过滤规则,导致只扫描到了测试文件的覆盖率数据

修改方案

第一步:调整主CMakeLists.txt配置,确保业务代码也加入覆盖率编译选项

把append_coverage_compiler_flags()的调用位置移到add_subdirectory(app)之前,保证业务目标编译时能拿到覆盖率编译参数,同时换成gcovr生效的排除配置:

# 调整主CMakeLists.txt的执行顺序如下
...
option(BUILD_TESTING "Build unit test cases" ON)

if(BUILD_TESTING)
  include(CodeCoverage)
  append_coverage_compiler_flags() # 移到add_subdirectory(app)之前,确保业务代码也加编译选项
endif()

add_subdirectory(app) # 业务代码目录放在append_coverage_compiler_flags之后执行

if(BUILD_TESTING)  
  find_package(GTest 1.8.0 EXACT REQUIRED COMPONENTS gtest gmock gtest_main)
  if(NOT GTest_FOUND)
    message(FATAL_ERROR "Couldn't find gtest")
  endif()
  enable_testing()
  set(COVERAGE_GCOVR_EXCLUDES "${CMAKE_CURRENT_LIST_DIR}/test/*") # 替换为gcovr的排除参数
  add_subdirectory(${CMAKE_SOURCE_DIR}/test)
endif()
...

第二步:调整test目录下覆盖率生成配置,指定业务代码路径

修改setup_target_for_coverage_gcovr_html参数,增加过滤规则,只统计app目录下的业务代码:

setup_target_for_coverage_gcovr_html(
    NAME coverage                 
    EXECUTABLE  TestTCPAcceptor  
    DEPENDENCIES  TestTCPAcceptor       
    EXCLUDE ${PROJECT_SOURCE_DIR}/test/* # 额外显式排除测试目录
    BASE_DIRECTORY ${PROJECT_SOURCE_DIR}/app # 仅统计app目录下的业务代码覆盖率
)

可选优化

如果不想全局加覆盖率编译选项(避免发布版本带调试类编译参数),可以去掉全局的append_coverage_compiler_flags()调用,单独给业务目标和测试目标加覆盖率参数:

# 在app/tcpstream/CMakeLists.txt中添加配置
if(BUILD_TESTING)
  target_compile_options(tcpstream PRIVATE --coverage)
  target_link_options(tcpstream PRIVATE --coverage)
endif()

修改完成后清空build目录重新编译生成覆盖率报告,即可正常统计TCPAcceptor.cpp的覆盖率数据。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.08 08:48:02