我总是有强烈的欲望去追求更高代码质量,而代码覆盖率是衡量代码质量的指标之一,它意味着你编写的单元测试、回归测试是否有完整执行到所有代码行。
对于 C/C++ 这种需要 “小心翼翼” 的编程语言,内存泄漏、越界、野指针等问题防不胜防,这些问题也是破坏代码质量的重要元凶,提早发现并修正此类问题可以帮助我们提升代码质量。我喜欢使用 AddressSanitizer 来发现这些问题,它很好用,我很喜欢。
高代码覆盖率 + AddressSanitizer ,意味着我们几乎所有代码都进行内存方面的监控和检查,这让我们更加安心。
基于上述目的,可以得出:高质量代码需要高覆盖率。那么如何提高代码覆盖率呢?我们需要做好两件事情:良好的编程习惯和做好代码覆盖率监控。
对于编程习惯,自然是要多些单元测试,推荐使用测试驱动开发,详细参考 测试驱动开发(TDD)实践与技巧,这里不再赘述。
如何做好代码覆盖率监控,是我们今天要讨论的主题。更加限定一点,讨论如何在 github 上使用 Codecov 对 C/C++ 项目监控代码覆盖率。
Github Actions 是 Github 推出的持续集成服务,与 Gitlab CI 类似。这部分参考 GitHub Actions 入门教程。
这部分参考 关于代码覆盖lcov的使用,总结下来想要使用 lcov 获得代码覆盖率,你需要:
-fprofile-arcs -ftest-coverage
,编译可执行文件具体的,你可以参考 codecov_cpp_test 这个仓库的代码,它在 CMakeLists.txt 中添加 -fprofile-arcs -ftest-coverage
进行编译,在 tests/test_hellocov.cpp
中使用 googletest 进行单元测试。你可以这样编译并运行它:
git submodule update --init --recursive
cmake -S . -B build
cmake --build build
cd build
ctest --verbose
运行完单元测试后,你会发现在 build/tests/CMakeFiles 中多出来一些 .gcda 和 .gcno 文件,lcov 就是利用它们来生成代码覆盖率报告的。具体命令为:
# 收集 gcda 和 gcno,生成 cover.info
lcov -c -d ./ -o cover.info
# 利用 cover.info 生成 html 报告
genhtml -o cover_report --legend --title "lcov" --prefix=./ cover.info
Codecov 是一个测试结果的展示平台,你可以上传 lcov 生成的 cover.info
到 Codecov,它就可以为你可视化这些结果,比 genhtml
生成的 html 页面更加友好。此外,你还可以获取 codecov 的小徽章放在你的仓库页面中。
在 Github Actions 中配置 Codecov 相当的容易,步骤为:
codecov/codecov-action@v2
上传 .info 文件实际例子请参考 codecov_cpp_test/codecov.yml,对于 codecov 为 codecov_cpp_test-codecov
如果你的仓库是私有的,需要额外设置 TOKEN,具体步骤为:
本文首先介绍了 C/C++ 项目中可以利用 lcov 来监控代码覆盖啦,接着我们对 Github Actions 和 Codecov 做了分别介绍,并通过 codecov_cpp_test 向大家说明了如何在 github 中使用 codecov