Timon 覆盖率工具在知乎测试实践中的应用

简介: 结合代码设计测试用例能够有效提高测试精准度,为此我们研发了一种可以实时收集代码覆盖率的工具 Timon。Timon 与公司容器化构建系统 ZAE 打通;支持 Java、 Python 和 Golang 三种语言的覆盖率统计

云栖号资讯:【点击查看更多行业资讯
在这里您可以找到不同行业的第一手的上云资讯,还在等什么,快来!

背景

结合代码设计测试用例能够有效提高测试精准度,为此我们研发了一种可以实时收集代码覆盖率的工具 Timon。Timon 与公司容器化构建系统 ZAE 打通;支持 Java、 Python 和 Golang 三种语言的覆盖率统计;能够产出全量和增量代码覆盖率报告;支持合并覆盖率数据;可以在接口测试和集成测试等场景使用。Timon 工具支持 90% 以上自动化接口用例的覆盖率统计;使用 Timon 辅助功能测试的 QA,增量代码覆盖率平均达到 80% 以上。在以下的内容中,文章将介绍工具的原理和使用实践。

测试覆盖率工具选择

我们选择的测试覆盖率工具包括 Jacoco、Coverage.py 和 go test 命令。 各工具的详细介绍可以在官网中查看,文章不再赘述。表 2.1 对比了三种工具。 其中 Jacoco 使用 On-the-fly 的模式插桩已满足使用需求。 Coverage.py 和 go test 需要杀掉应用进程才能获取报告。 go test 需要在编译阶段进行插桩。

A37592BD_9080_4b4d_85BD_82F5B456AB0A

原理和模块设计

在编译阶段, 我们对代码进行插桩。部署阶段,Timon 客户端被部署到容器当中。 开启应用时,ZAE 将自动修改应用启动命令,以启动 Timon 客户端。Timon 工具包括两个大的模块: 客户端和服务端。 客户端又有三个子模块,分别对应三种语言。主要职责是上传容器信息、监听端口、请求配置文件、生成覆盖率原始数据文件、 上传代码 diff 信息等。服务端的主要功能包括增量代码覆盖率计算、生成配置文件、历史数据管理、报告展示界面等。详细的模块列表可以查看系统模块图 ( 图 3.1 )。 下面将介绍工具重点功能的实现方法。

8294428B_9DA7_412b_8872_260406E1CFDD

1、编译阶段插桩

Golang 应用需要在编译阶段进行代码插桩才可以统计覆盖率数据。开发在 CI 配置文件中加入如下配置后,ZAE 平台自动完成插桩过程。配置文件包含的信息包括项目源码、目标文件以及各服务入口的路径。ZAE 在检测到插桩配置后,首先将 Timon 客户端提供的 test 文件放到服务入口所在的目录中,然后在生成的 Jenkinsfile 中插入编译命令。Python 和 Java 语言的项目不需要在编译阶段插桩。

5E0A1875_DF6A_4497_B79D_92C76745F393

2、部署阶段初始化

Timon 客户端在启动的时候,会进行上传容器信息、监听端口、请求配置文件等操作。图 3.2 展示了客户端的初始化过程。

13CDA781_3FAD_48a9_B65C_B537A0BD9C44

Timon 客户端启动之后的主要任务是监听覆盖率报告请求、容器销毁信息并上传覆盖率报告。因为代码更新后,测试联调环境会自动部署新版本的代码并销毁当前容器,所以 Timon 客户端需要在容器销毁前上传覆盖率数据。Java 语言覆盖率检测工具采用的方案是每 10 分钟上传一次覆盖率数据。但是 Go 和 Python 语言的覆盖率检测工具需要重启应用才能上传,为了不让服务进程频繁重启,我们采用了另一种方案:Timon 客户端监听系统发给容器的销毁信号,收到信号后客户端上传覆盖率数据。除此之外用户请求生成覆盖率报告时,Timon 客户端也会实时上传覆盖率报告。

3、上传覆盖率数据

一个用户从请求当前部署版本覆盖率报告到获得报告的时序图见图 3.3。 假设某个测试环境当中只有一个应用,这个应用有三个容器提供服务,Timon 服务器等待容器一和二上传原始数据后,向容器三发送原始数据集合,最后容器三合并数据后,生成 html 格式的全量代码覆盖率报告。如果测试环境有多个应用,那么时序图当中的过程是并行进行的。在容器销毁前,保存覆盖率原始数据的方案也是类似的。

1A511399_6AAB_4f1f_895B_A13558F01CF1

4、计算覆盖率数据

统计覆盖率的方式有分支覆盖率和可执行代码覆盖率等。在实践中通常通过可执行代码来计算覆盖率,Timon 也是如此。增量代码覆盖率的计算需要代码与主分支的 diff 数据和全量代码覆盖率报告。分子是增量代码且已经覆盖的执行代码行数,其中会去除测试文件等非业务代码文件。分母是增量代码部分执行代码的行数。为了能够帮助使用者及时找到增量代码,我们对第三方工具生成的报告做了一些修改。比如 Java 的增量代码覆盖率报告中只显示有增量代码的文件,在浏览器直接搜索 「新增代码」 即可跳转到增量代码位置。Golang 和 Python 语言的覆盖率报告也有类似的功能。

A254B329_14E0_4d5d_8A77_64CA81E778B6

如果是计算 MR 整体的增量代码覆盖率,那么还需要合并多个 Commit 的覆盖率数据。假设有 Commit A、Commit B、Commit C 三个版本的覆盖率报告,Commit C 是最后一次提交,Commit C 有增量代码的文件是 c。下面介绍一下合并过程。

  • 找到 Commit A 文件 c 中被执行的代码内容
  • 在 Commit C 中寻找相同的代码内容
  • 在 Commit C 的覆盖率报告中标注该行被执行
    重复以上三个过程,其他 Commit 代码与 Commit C 的代码比对

合并后生成的覆盖率报告能够辅助 QA 分析,未覆盖的部分是因为测试用例遗漏,还是测试环境无法覆盖,又或者冗余代码等其他问题。

用户使用流程

我们做到了零成本接入,用户在测试联调环境加入应用时,打开 「启动覆盖率检测环境」按钮即可。用户可以在工具的前端界面查看报告,也可以在 MR 中添加评论获取覆盖率数据报表。用户使用流程图( 图 2.1 ) 展示了使用覆盖率报告分析测试用例的流程 。如果使用自动化脚本进行测试,单版本的的代码覆盖率报告可以帮助分析。如果是手工测试,由于代码持续更新,MR 整体的增量代码覆盖率报告能够帮助查找遗漏的测试用例。

4E48F3E3_A0B6_4822_AACD_C3E4C99D15EC

B204BA64_1283_4265_A002_07BB24DB8D3C

A2DBFC58_57DE_476d_BDAE_E5356CBA7984

B07AE1C0_1FAC_4ebc_8DC8_43B1BAF6ED68

业务实践

在 Timon 工具出现之前,黑盒测试无从保证覆盖所有逻辑和异常情况;跟进自动化测试脚本的开发进度,一般是比较用例完成百分比;自动化测试用例的质量评估也大多靠测试经验。Timon 帮助测试人员快速找到遗漏测试场景,提高了工作效率,且推动测试人员更加关注代码本身。Timon 也为评估自动化测试用例提供了新的方法。除此以外,我们在实践过程中发现覆盖率工具也能够帮助测试人员发现其他问题,比如开发提交了非需求相关的代码,手工测试环境当中无法制造某些异常情况等。Timon 工具是知乎质量保障体系的一个模块,为精准测试舔砖加瓦。 QA 因为使用 Timon 工具改变了测试习惯。我们将持续寻找 Timon 覆盖率工具在产研体系中的最佳实践,同时与其他质量保障平台联动,发挥它的最大价值。

【云栖号在线课堂】每天都有产品技术专家分享!
课程地址:https://yqh.aliyun.com/zhibo

立即加入社群,与专家面对面,及时了解课程最新动态!
【云栖号在线课堂 社群】https://c.tb.cn/F3.Z8gvnK

原文发布时间:2020-03-27
本文作者:小果果
本文来自:“InfoQ”,了解相关信息可以关注“InfoQ

相关文章
|
14天前
|
测试技术 C语言
网站压力测试工具Siege图文详解
网站压力测试工具Siege图文详解
23 0
|
23天前
|
安全 Linux 测试技术
提升龙蜥内核测试能力!探究持续性模糊测试优化实践
清华大学软件学院对Anolis OS使用靶向模糊测试方法将测试工作引向修改的代码,进而提高对业务代码的测试能力。
|
29天前
|
SQL 安全 测试技术
【软件设计师备考 专题 】测试要求说明书的编写和应用
【软件设计师备考 专题 】测试要求说明书的编写和应用
58 0
|
8天前
|
敏捷开发 监控 前端开发
深入理解自动化测试框架Selenium的架构与实践
【4月更文挑战第16天】 在现代软件开发过程中,自动化测试已成为确保产品质量和加快迭代速度的关键手段。Selenium作为一种广泛使用的自动化测试工具,其开源、跨平台的特性使得它成为业界的首选之一。本文旨在剖析Selenium的核心架构,并结合实际案例探讨其在复杂Web应用测试中的高效实践方法。通过详细解读Selenium组件间的交互机制以及如何优化测试脚本,我们希望为读者提供深入理解Selenium并有效运用于日常测试工作的参考。
14 1
|
8天前
|
自然语言处理 测试技术 API
深入理解自动化测试框架Selenium的设计理念与实践
【4月更文挑战第15天】 在现代软件开发过程中,自动化测试已成为确保产品质量和加速迭代的关键手段。Selenium作为一种广泛使用的自动化测试框架,提供了对多种浏览器和平台的支持,极大地促进了Web应用的功能测试。本文旨在剖析Selenium的核心设计理念,探讨其在实际项目中的应用,并指出常见的误区及最佳实践,以期帮助测试工程师更高效地利用Selenium进行测试工作。
|
14天前
|
测试技术 Linux Apache
网站压力测试工具webbench图文详解
网站压力测试工具webbench图文详解
12 0
|
17天前
|
安全 测试技术
深入理解白盒测试:方法、工具与实践
【4月更文挑战第7天】 在软件开发的质量控制过程中,白盒测试是确保代码逻辑正确性的关键步骤。不同于黑盒测试关注于功能和系统的外部行为,白盒测试深入到程序内部,检验程序结构和内部逻辑的正确性。本文将探讨白盒测试的核心技术,包括控制流测试、数据流测试以及静态分析等方法,同时介绍当前流行的白盒测试工具,并讨论如何在实际项目中有效实施白盒测试。文章的目标是为软件测试工程师提供一份综合性指南,帮助他们更好地理解和应用白盒测试技术。
|
23天前
|
Java 测试技术 API
软件测试中的自动化工具与策略
软件测试是确保软件质量的重要环节,而自动化测试工具和策略的应用在提高测试效率和准确性方面发挥着重要作用。本文将介绍几种常见的自动化测试工具,并探讨在软件测试中应用自动化测试的最佳实践和策略。
|
25天前
|
Web App开发 Java 测试技术
深入理解与应用软件自动化测试工具Selenium
随着软件开发的快速发展,软件测试在保证产品质量方面发挥着越来越重要的作用。其中,自动化测试以其效率高、成本低的特点受到了广大开发者的欢迎。本文主要介绍了自动化测试工具Selenium的基本概念、原理以及在实际开发中的应用,旨在帮助读者更好地理解和使用Selenium进行高效的自动化测试。
22 4
|
29天前
|
敏捷开发 测试技术 持续交付
深入探索软件测试自动化:框架与实践
在快速演进的软件行业中,测试自动化已成为确保产品质量和加快上市速度的关键因素。本文将深入分析测试自动化框架的构建要点,探讨其在实际应用中的效益,以及实施过程中可能面临的挑战。通过对比手动测试与自动化测试的优势与局限,本文旨在为读者提供一套系统化的测试自动化实践指南,以支持更高效、可靠的软件开发周期。
11 0