使用 Github Actions 和 Codecov 监控 C/C++ 仓库的代码覆盖率

文章目录

  • 前言
  • 一、Github Actions
  • 二、使用 Lcov 获取代码覆盖率
  • 三、Github Actions 配置 Codecov
  • 总结
  • 参考


前言

我总是有强烈的欲望去追求更高代码质量,而代码覆盖率是衡量代码质量的指标之一,它意味着你编写的单元测试、回归测试是否有完整执行到所有代码行。

对于 C/C++ 这种需要 “小心翼翼” 的编程语言,内存泄漏、越界、野指针等问题防不胜防,这些问题也是破坏代码质量的重要元凶,提早发现并修正此类问题可以帮助我们提升代码质量。我喜欢使用 AddressSanitizer 来发现这些问题,它很好用,我很喜欢。

高代码覆盖率 + AddressSanitizer ,意味着我们几乎所有代码都进行内存方面的监控和检查,这让我们更加安心。

基于上述目的,可以得出:高质量代码需要高覆盖率。那么如何提高代码覆盖率呢?我们需要做好两件事情:良好的编程习惯做好代码覆盖率监控

对于编程习惯,自然是要多些单元测试,推荐使用测试驱动开发,详细参考 测试驱动开发(TDD)实践与技巧,这里不再赘述。

如何做好代码覆盖率监控,是我们今天要讨论的主题。更加限定一点,讨论如何在 github 上使用 Codecov 对 C/C++ 项目监控代码覆盖率。


一、Github Actions

Github Actions 是 Github 推出的持续集成服务,与 Gitlab CI 类似。这部分参考 GitHub Actions 入门教程。

二、使用 Lcov 获取代码覆盖率

这部分参考 关于代码覆盖lcov的使用,总结下来想要使用 lcov 获得代码覆盖率,你需要:

  1. 安装 lcov
  2. 在 c/c++ 编译选项中添加 -fprofile-arcs -ftest-coverage,编译可执行文件
  3. 运行可执行文件
  4. 使用 lcov 收集代码覆盖率信息

具体的,你可以参考 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

使用 Github Actions 和 Codecov 监控 C/C++ 仓库的代码覆盖率_第1张图片
运行完单元测试后,你会发现在 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

三、Github Actions 配置 Codecov

Codecov 是一个测试结果的展示平台,你可以上传 lcov 生成的 cover.info 到 Codecov,它就可以为你可视化这些结果,比 genhtml 生成的 html 页面更加友好。此外,你还可以获取 codecov 的小徽章放在你的仓库页面中。

在 Github Actions 中配置 Codecov 相当的容易,步骤为:

  1. 编译、运行你的代码
  2. 安装 lcov,使用 lcov 生成 .info 文件
  3. 使用 codecov/codecov-action@v2 上传 .info 文件

实际例子请参考 codecov_cpp_test/codecov.yml,对于 codecov 为 codecov_cpp_test-codecov

如果你的仓库是私有的,需要额外设置 TOKEN,具体步骤为:

  1. 在 Codecov 的仓库 Setting 页面中,复制 Repository Upload Token
    使用 Github Actions 和 Codecov 监控 C/C++ 仓库的代码覆盖率_第2张图片
  2. 在 github 仓库中设置 CODECOV_TOKEN 为 Actions secrets
    使用 Github Actions 和 Codecov 监控 C/C++ 仓库的代码覆盖率_第3张图片
    使用 Github Actions 和 Codecov 监控 C/C++ 仓库的代码覆盖率_第4张图片
  3. 在 codecov.yml 中使用 CODECOV_TOKEN
    使用 Github Actions 和 Codecov 监控 C/C++ 仓库的代码覆盖率_第5张图片

总结

本文首先介绍了 C/C++ 项目中可以利用 lcov 来监控代码覆盖啦,接着我们对 Github Actions 和 Codecov 做了分别介绍,并通过 codecov_cpp_test 向大家说明了如何在 github 中使用 codecov

参考

  • AddressSanitizer
  • 测试驱动开发(TDD)实践与技巧
  • How to Set Up Codecov with C and GitHub Actions
  • codecov_cpp_test

你可能感兴趣的:(c++,codecov,github,actions,代码覆盖率,lcov)