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

简介: 对于持续开发的大型工程而言,足够的测试是保证软件行为符合预期的有效手段,而不是仅仅依靠 code review 或者开发者自己的技术素质。测试覆盖率就是检验测试覆盖软件行为的情况,通过检查测试覆盖情况可以帮助开发人员发现没有被覆盖到的代码

image

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

测试覆盖信息搜集

Nebula Graph 主要是由 C++ 语言开发的,支持大部分 Linux 环境以及 gcc/clang 编译器,所以通过工具链提供的支持,我们可以非常方便地统计Nebula Graph的测试覆盖率。

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

  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,然后通过浏览器查看测试覆盖率,如下图所示:

image

但是这样是非常不方便的,因为在持续的开发过程,如果每次都要手动进行这样一套操作,那必然带来极大的人力浪费,所以现在的常用做法是将测试覆盖率写入 CI 并且和第三方平台(比如 CodecovCoveralls)集成,这样开发人员完全不必关心测试覆盖信息的收集整理和展示问题,只需要发布代码后直接到第三方平台上查看覆盖情况即可,而且现在的第三方平台也支持直接在 PR 上评论覆盖情况使得查看覆盖率的变更情况更加方便。

集成 CI Github Action

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

而 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 信息的收集。比如在开发人员在正常的开发编译测试过程中通常不会开启这项功能以避免编译测试运行的额外开销。

- 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平台。

这里用户给自己的 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 的研发工程师,希望本文对你有所帮助,如果有错误或不足也请与我交流,不甚感激!

声明:本文采用 CC BY-NC-ND 4.0 协议进行授权 署名-非商业性使用-禁止演绎 4.0 国际

相关实践学习
阿里云图数据库GDB入门与应用
图数据库(Graph Database,简称GDB)是一种支持Property Graph图模型、用于处理高度连接数据查询与存储的实时、可靠的在线数据库服务。它支持Apache TinkerPop Gremlin查询语言,可以帮您快速构建基于高度连接的数据集的应用程序。GDB非常适合社交网络、欺诈检测、推荐引擎、实时图谱、网络/IT运营这类高度互连数据集的场景。 GDB由阿里云自主研发,具备如下优势: 标准图查询语言:支持属性图,高度兼容Gremlin图查询语言。 高度优化的自研引擎:高度优化的自研图计算层和存储层,云盘多副本保障数据超高可靠,支持ACID事务。 服务高可用:支持高可用实例,节点故障迅速转移,保障业务连续性。 易运维:提供备份恢复、自动升级、监控告警、故障切换等丰富的运维功能,大幅降低运维成本。 产品主页:https://www.aliyun.com/product/gdb
目录
相关文章
|
3天前
|
敏捷开发 人工智能 Devops
探索自动化测试的高效策略与实践###
当今软件开发生命周期中,自动化测试已成为提升效率、保障质量的关键工具。本文深入剖析了自动化测试的核心价值,探讨了一系列高效策略,包括选择合适的自动化框架、设计可维护的测试脚本、集成持续集成/持续部署(CI/CD)流程,以及有效管理和维护测试用例库。通过具体案例分析,揭示了这些策略在实际应用中的成效,为软件测试人员提供了宝贵的经验分享和实践指导。 ###
|
3天前
|
机器学习/深度学习 人工智能 jenkins
软件测试中的自动化与持续集成实践
在快速迭代的软件开发过程中,自动化测试和持续集成(CI)是确保代码质量和加速产品上市的关键。本文探讨了自动化测试的重要性、常见的自动化测试工具以及如何将自动化测试整合到持续集成流程中,以提高软件测试的效率和可靠性。通过案例分析,展示了自动化测试和持续集成在实际项目中的应用效果,并提供了实施建议。
|
3天前
|
Java 测试技术 持续交付
探索自动化测试在软件开发中的关键作用与实践
在现代软件开发流程中,自动化测试已成为提升产品质量、加速交付速度的不可或缺的一环。本文深入探讨了自动化测试的重要性,分析了其在不同阶段的应用价值,并结合实际案例阐述了如何有效实施自动化测试策略,以期为读者提供一套可操作的实践指南。
|
3天前
|
Web App开发 敏捷开发 测试技术
探索自动化测试的奥秘:从理论到实践
【10月更文挑战第39天】在软件质量保障的战场上,自动化测试是提升效率和准确性的利器。本文将深入浅出地介绍自动化测试的基本概念、必要性以及如何实施自动化测试。我们将通过一个实际案例,展示如何利用流行的自动化测试工具Selenium进行网页测试,并分享一些实用的技巧和最佳实践。无论你是新手还是有经验的测试工程师,这篇文章都将为你提供宝贵的知识,帮助你在自动化测试的道路上更进一步。
|
3天前
|
敏捷开发 Java 测试技术
探索自动化测试:从理论到实践
【10月更文挑战第39天】在软件开发的海洋中,自动化测试是一艘能够带领团队高效航行的船只。本文将作为你的航海图,指引你理解自动化测试的核心概念,并分享一段实际的代码旅程,让你领略自动化测试的魅力和力量。准备好了吗?让我们启航!
|
10天前
|
消息中间件 资源调度 关系型数据库
如何在Flink on YARN环境中配置Debezium CDC 3.0,以实现实时捕获数据库变更事件并将其传输到Flink进行处理
本文介绍了如何在Flink on YARN环境中配置Debezium CDC 3.0,以实现实时捕获数据库变更事件并将其传输到Flink进行处理。主要内容包括安装Debezium、配置Kafka Connect、创建Flink任务以及启动任务的具体步骤,为构建实时数据管道提供了详细指导。
32 9
|
7天前
|
关系型数据库 MySQL Linux
Linux环境下MySQL数据库自动定时备份实践
数据库备份是确保数据安全的重要措施。在Linux环境下,实现MySQL数据库的自动定时备份可以通过多种方式完成。本文将介绍如何使用`cron`定时任务和`mysqldump`工具来实现MySQL数据库的每日自动备份。
22 3
|
8天前
|
测试技术 API Android开发
探索软件测试中的自动化框架选择与实践####
本文深入探讨了软件测试领域内,面对众多自动化测试框架时,如何依据项目特性和团队需求做出明智选择,并分享了实践中的有效策略与技巧。不同于传统摘要的概述方式,本文将直接以一段实践指南的形式,简述在选择自动化测试框架时应考虑的核心要素及推荐路径,旨在为读者提供即时可用的参考。 ####
|
20天前
|
NoSQL Cloud Native atlas
探索云原生数据库:MongoDB Atlas 的实践与思考
【10月更文挑战第21天】本文探讨了MongoDB Atlas的核心特性、实践应用及对云原生数据库未来的思考。MongoDB Atlas作为MongoDB的云原生版本,提供全球分布式、完全托管、弹性伸缩和安全合规等优势,支持快速部署、数据全球化、自动化运维和灵活定价。文章还讨论了云原生数据库的未来趋势,如架构灵活性、智能化运维和混合云支持,并分享了实施MongoDB Atlas的最佳实践。
|
19天前
|
机器学习/深度学习 人工智能 自然语言处理
探索软件测试的边界:从基础到高级的实践之旅
【10月更文挑战第21天】 在当今数字化时代,软件已成为我们生活和工作中不可或缺的一部分。随着技术的快速发展,对软件质量的要求也日益提高。本文旨在通过深入浅出的方式,带领读者踏上一场从基础到高级的软件测试实践之旅。我们将探讨软件测试的基本概念、重要性以及如何有效地进行测试规划和执行。通过具体案例分析,揭示常见错误及其解决方案,同时展望未来软件测试领域的发展趋势。无论你是软件开发新手还是经验丰富的测试工程师,这篇文章都将为你提供宝贵的见解和启发。
35 8