图数据库 Nebula Graph 的代码变动测试覆盖率实践

image

对于一个持续开发的大型工程而言,足够的测试是保证软件行为符合预期的有效手段,而不是仅仅依靠 code review 或者开发者本身的技术素质。测试的编写理想状况下应该彻底定义软件的行为,可是一般状况都是很难达到这样理想的程度。而测试覆盖率就是检验测试覆盖软件行为的状况,经过检查测试覆盖状况能够帮助开发人员发现没有被覆盖到的代码。html

测试覆盖信息搜集

Nebula Graph 主要是由 C++ 语言开发的,支持大部分 Linux 环境以及 gcc/clang 编译器,因此经过工具链提供的支持,咱们能够很是方便地统计Nebula Graph的测试覆盖率。前端

gcc/clang 都支持 gcov 式的测试覆盖率功能,使用起来也是很是简单的,主要有以下几个步骤:react

  1. 添加编译选项 --coverage -O0 -g 
  2. 添加连接选项 --coverage 
  3. 运行测试
  4. 使用 lcov,整合报告,例如 lcov --capture --directory . --output-file coverage.info 
  5. 去掉外部代码统计,例如 lcov --remove coverage.info '*/opt/vesoft/*' -o clean.info 

到这里测试覆盖信息已经搜集完毕,接下能够经过 genhtml 这样的工具生成 html,而后经过浏览器查看测试覆盖率,以下图所示:git

image

可是这样是很是不方便的,由于在持续的开发过程,若是每次都要手动进行这样一套操做,那必然带来极大的人力浪费,因此如今的经常使用作法是将测试覆盖率写入 CI 而且和第三方平台(好比 CodecovCoveralls)集成,这样开发人员彻底没必要关心测试覆盖信息的收集整理和展现问题,只须要发布代码后直接到第三方平台上查看覆盖状况便可,并且如今的第三方平台也支持直接在 PR 上评论覆盖状况使得查看覆盖率的变动状况更加方便。github

集成 CI Github Action

如今主流的 CI 平台很是多,好比 Travisazure-pipelines 以及 GitHub Action 等。Nebula Graph 选用的是 GitHub Action,对于 Action 咱们在以前的《使用 Github Action 进行前端自动化发布》这篇文章里已经作过介绍。centos

而 GitHub Action 相对于其余 CI 平台来讲,有和 GitHub 集成更好,Action 生态强大简洁易用以及支持至关多的操做系统和 CPU 等优点。Nebula Graph 有关测试覆盖的 CI 脚本片断以下所示:浏览器

- name: CMake with Coverage
  if: matrix.compiler == 'gcc-9.2' && matrix.os == 'centos7'
  run: |
    cmake -DENABLE_COVERAGE=ON -B build/

能够看到这里咱们将前文介绍的 coverage 相关的编译选项经过一个 cmake option 进行管理,这样能够很是方便地启用和禁止 coverage 信息的收集。好比在开发人员在正常的开发编译测试过程当中一般不会开启这项功能以免编译测试运行的额外开销。bash

- name: Testing Coverage Report
  working-directory: build
  if: success() && matrix.compiler == 'gcc-9.2' && matrix.os == 'centos7'
  run: |
    set -e
    /usr/local/bin/lcov --version
    /usr/local/bin/lcov --capture --gcov-tool $GCOV --directory . --output-file coverage.info
    /usr/local/bin/lcov --remove coverage.info '*/opt/vesoft/*' -o clean.info
    bash <(curl -s https://codecov.io/bash) -Z -f clean.info

这里主要是测试报告的收集、合并以及上传到第三方平台,这个在前文中已经比较详细地叙述过,CI 的运行状况以下图所示:微信

image

集成测试覆盖率平台 Codecov

Nebula Graph 选择的测试覆盖平台是 Codecov——一个测试结果分析工具,对于 GitHub Action 而言,主要是在 CI 中执行上述的测试覆盖信息搜集脚本以及将最终的测试覆盖文件上传到 Codecov平台。curl

这里用户给本身的 repo 注册 Codecov 后能够获取一个访问的 token,经过这个 token 和 Codecov 的 API 能够将测试覆盖文件上传到 Codecov 这个平台上,具体的 API 能够参考 https://docs.codecov.io/reference#upload ,除了上传报告外还有列出 pr,commit 等 API 可让用户开发本身的 bot 作一些自动化的工具,而后就可查看各类测试覆盖的信息,好比 Nebula Graph 的测试覆盖状况能够查看 https://codecov.io/gh/vesoft-inc/nebula 。

好比能够经过这个饼状图查看不一样目录代码的覆盖状况:

image

也能够点开一个具体的文件,查看哪些行被覆盖那些行没有被覆盖:

image

固然咱们通常不会直接使用 Codecov 的 API,而是使用他提供的一个 cli 工具,好比上传报告使用 bash <(curl -s https://codecov.io/bash) -Z -t <token> -f clean.info ,这里的 token 就是 Codecov 提供的认证 token,通常来讲做为环境变量 CODECOV_TOKEN 使用,而不是输入明文。

经过上述操做呢就能够在 Codecov 平台上查看你的工程的测试覆盖状况,而且能够看到每次 pr 增长减小了多少覆盖率,方便逐渐提升测试覆盖率。最后的话还能够在你的 README 上贴上 Codecov 提供的测试覆盖率 badge,就像 Nebula Graph 同样:https://github.com/vesoft-inc/nebula

image

本文中若有错误或疏漏欢迎去 GitHub:https://github.com/vesoft-inc/nebula issue 区向咱们提 issue 或者前往官方论坛:https://discuss.nebula-graph.com.cn/建议反馈 分类下提建议 👏;加入 Nebula Graph 交流群,请联系 Nebula Graph 官方小助手微信号:NebulaGraphbot

推荐阅读

做者有话说:Hi,我是 shylock,是 Nebula Graph 的研发工程师,但愿本文对你有所帮助,若是有错误或不足也请与我交流,不甚感激!

相关文章
相关标签/搜索