CMake生成覆盖率报告仅包含测试文件,如何统计业务源文件覆盖率
问题根因
- 覆盖率编译标志位仅作用于测试目标,业务代码
tcpstream编译时未添加--coverage等覆盖率相关编译、链接选项,无法生成覆盖率统计所需的.gcno、.gcda文件 - 当前配置的
COVERAGE_LCOV_EXCLUDES是lcov工具的排除参数,你使用的是gcovr生成HTML报告,该参数不生效 - 生成覆盖率报告时未指定业务代码路径过滤规则,导致只扫描到了测试文件的覆盖率数据
修改方案
第一步:调整主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
相关产品推荐
相关产品推荐

