首先启用gcov需添加-fprofile-arcs、-ftest-coverage、-g和-O0编译选项,运行测试生成.gcda文件;接着用gcov命令生成文本报告,或使用lcov收集数据并用genhtml生成HTML可视化报告,绿色为已覆盖,红色为未覆盖;建议将流程集成到Makefile或CI中,通过make coverage一键执行,便于持续跟踪测试覆盖率,提升TDD效率。

在C++测试驱动开发中,代码覆盖率是衡量测试完整性的关键指标。gcov 是 GCC 自带的代码覆盖率分析工具,配合编译器选项和 lcov 等前端工具,可以生成直观的 HTML 报告,帮助开发者识别未被测试覆盖的代码路径。
启用 gcov 所需的编译选项
要使用 gcov,必须在编译时添加特定的调试和插桩选项,使编译器生成用于覆盖率分析的辅助文件。
编译 C++ 代码时,加入以下标志:
- -fprofile-arcs:生成执行流程信息(.gcda 文件)
- -ftest-coverage:生成源码行覆盖数据(.gcno 文件)
- -g:包含调试信息
- -O0:关闭优化,避免代码重排影响覆盖率准确性
g++ -fprofile-arcs -ftest-coverage -g -O0 -c src/mycode.cpp -o build/mycode.o g++ -fprofile-arcs -ftest-coverage build/mycode.o test/test_mycode.cpp -o build/test_runner
运行测试并生成原始覆盖率数据
编译完成后,执行测试程序。运行过程中,gcov 会自动生成 .gcda 文件,记录每行代码的执行次数。
立即学习“C++免费学习笔记(深入)”;
运行测试:./build/test_runner
执行后,在目标目录中会出现对应的 .gcda 文件,与 .o 文件同名。此时可使用 gcov 命令生成单个源文件的文本覆盖率报告:
gcov build/mycode.cpp
该命令会输出 mycode.cpp.gcov 文件,其中每一行前的数字表示执行次数,##### 表示未被执行。
使用 lcov 生成可视化 HTML 报告
手动查看 .gcov 文件效率低,推荐使用 lcov 工具收集所有数据并生成图形化报告。
安装 lcov(Ubuntu/Debian):
sudo apt-get install lcov
常用 lcov 命令流程:
-
初始化数据收集:
lcov --capture --directory build/ --output-file coverage.info -
清除已有数据(如重新测试):
lcov --zerocounters --directory build/ -
生成 HTML 报告:
genhtml coverage.info --output-directory coverage_report
完成后,打开 coverage_report/index.html 即可在浏览器中查看带颜色标记的源码覆盖率,绿色为已覆盖,红色为未覆盖。
集成到测试工作流中的建议
为了在日常开发中持续关注覆盖率,可将 gcov 流程写入 Makefile 或 CI 脚本。
例如 Makefile 片段:
coverage:
g++ -fprofile-arcs -ftest-coverage -g -O0 -c src/*.cpp -o build/
g++ -fprofile-arcs -ftest-coverage build/*.o test/*.cpp -o build/test
./build/test
lcov --capture --directory . --output-file coverage.info
genhtml coverage.info --output-directory coverage_report
@echo "Coverage report generated in coverage_report/index.html"
这样只需运行 make coverage 即可一键生成报告。
基本上就这些。只要编译配置正确,运行测试后用 lcov 处理数据,就能清晰看到哪些代码被测到、哪些遗漏了。对推动测试驱动开发非常有帮助。不复杂但容易忽略细节,比如忘记关优化或没加 -g,会导致无法生成有效数据。











