如何修改CMake配置使gcov覆盖率报告在Google Test用例失败时仍生成
解决方案
该问题本质是CTest默认在测试用例失败时返回非零退出码,触发构建系统的终止逻辑,中断了后续的覆盖率报告生成步骤,可通过以下几种方式修改CMake配置解决:
方案1:给CTest添加忽略失败参数
CTest自带参数可跳过测试失败的中断逻辑,哪怕有用例执行失败也会正常走完测试流程并返回成功状态,不会中断后续步骤。
如果使用CMake 3.22及以上版本,修改覆盖率自定义目标的CTest调用参数即可:
add_custom_target(coverage # 原有依赖保持不变,仅修改CTest命令 COMMAND ${CMAKE_CTEST_COMMAND} --no-stop-on-failure -C $<CONFIG> # 后续生成覆盖率报告的命令保持原有逻辑不变 COMMAND gcovr -r ${PROJECT_SOURCE_DIR} . --html-details -o coverage.html DEPENDS your_test_target )
如果是更低版本的CMake,替换为-i(--ignore-errors)参数即可:
COMMAND ${CMAKE_CTEST_COMMAND} -i -C $<CONFIG>
方案2:显式忽略CTest命令的错误返回值
如果不想修改CTest运行行为,也可以强制让CTest命令的返回值始终为成功,让构建系统继续执行后续的报告生成命令,跨平台写法如下:
add_custom_target(coverage COMMAND ${CMAKE_CTEST_COMMAND} -C $<CONFIG> || ${CMAKE_COMMAND} -E true # 后续生成覆盖率报告的命令保持原有逻辑不变 COMMAND gcovr -r ${PROJECT_SOURCE_DIR} . --html-details -o coverage.html DEPENDS your_test_target )
方案3:拆分测试执行和覆盖率生成目标
你也可以把两个逻辑拆成独立的自定义目标,完全解耦:
# 测试执行目标,仅负责跑用例 add_custom_target(run_tests COMMAND ${CMAKE_CTEST_COMMAND} -C $<CONFIG> DEPENDS your_test_target ) # 覆盖率生成目标,不依赖测试执行的结果,只要测试跑过就可以生成报告 add_custom_target(coverage COMMAND gcovr -r ${PROJECT_SOURCE_DIR} . --html-details -o coverage.html DEPENDS your_test_target )
使用时哪怕make run_tests执行失败,只要用例已经运行过生成了gcda统计文件,直接执行make coverage就可以正常生成覆盖率报告。
说明:gcov覆盖率统计只依赖测试运行过程中生成的gcno、gcda文件,不管测试用例是否通过,只要用例执行过,对应代码的覆盖率统计数据就已经生成,不会影响报告的准确性。
内容的提问来源于stack exchange,提问作者Shital Jadhav
相关产品推荐
相关产品推荐

