写点什么

网易严选的精准测试实践

  • 2020-10-18
  • 本文字数:3584 字

    阅读完需:约 12 分钟

网易严选的精准测试实践

精准测试是一个 2016 年就提出来的概念,现在越来越多进入到大多数测试工程师的视野内,其目的是为了使得测试过程更加可视化、智能化、精准化。在严选整个质量体系中,精准测试建设也占有一席之地。本文从概念、实践、设计、突破以及未来演进方向几个方面来介绍精准测试结合严选业务是如何设计和落地的。


作为测试同学,一定或多或少的在日常测试工作中碰到过以下“灵魂拷问”:


  • 我写的用例真的有效且全面吗,我的测试真的做到有效覆盖了吗?

  • 回归阶段我到底需要回归什么,回归验证充分吗?

  • 这次的改动到底影响范围有多大?

  • 上下游依赖服务的改动为什么不通知我,引起了无感知线上 bug?

  • 作为一个测试负责人,我怎么直观评估团队里的测试同学的测试覆盖情况?


精准测试于 2016 年应运而生,经过很长一段时间的方法论完善,业界对精准测试有了统一认知。

一、什么是精准测试

精准测试的概念

借助一定的技术手段、通过辅助算法对传统软件测试过程进行可视化、分析及优化的过程,使得测试过程更加可视化、智能、可信和精准。

精准测试的目标

精准测试的核心思想就是使用非常精确和智能的软件来解决传统软件测试过程中存在的问题,从根本上引领从经验型方法向技术型方法的转型。质量的评估不再完全靠个人经验和业务熟悉度,而是通过精准的数据来判定。在测试资源有限的前提下,将用例精简到更加有针对性,提高测试效率,有效的减少漏测风险。

精准测试的核心:双向追溯

正向追溯:开发人员可以看到测试人员执行用例的代码细节,以方便进行缺陷的修复,测试数据可以直接为开发调试提供依据,快速定位并修复缺陷。


逆向追溯:测试人员通过修改的源代码快速确定测试用例的范围,极大减少回归测试的盲目性和工作量,快速修订测试用例,达到测试覆盖率最大化。



在经过很长一段时间的方法论完善,不少互联网公司包括阿里、蚂蚁、腾讯、百度、有赞等均对精准测试进行了落地实操。我们也针对严选自身的情况和现状做了一些技术调研和可行性分析,开启了精准测试在严选的实践。

二、精准测试在严选的实践

严选的精准测试将贯穿需求生命周期,围绕“我要测什么”和“测的怎么样”两个关键字展开,支持手工测试场景和自动化测试场景,实现数字化的多维测试辅助。


提测阶段

版本提测后,通过手工执行触发【代码分析】获得本次提交版本中精确到接口维度的变更影响范围,为测试同学制定测试方案和测试范围方向上提供参考。同时针对变更接口去我们的自动化用例库筛选和匹配用例,解决我要测什么。

测试阶段

测试完成后通过手工执行【覆盖率分析】获取本次测试版本变更部分的测试覆盖情况,测试同学可以根据代码染色结果来分析本次测试的完成度并进行查漏补缺,同时驱动测试同学加强代码的阅读和分析,来提升测试深度,解决测得怎么样。

回归阶段

准入回归环境时,触发严选自研的质量平台进行测试用例集回归执行,除了测试用例的执行结果外,还有针对本次执行集的增量/全量代码的覆盖率结果分析。

发布阶段

在发布流程中,通过 CI 也会触发触发覆盖率卡点检测,如果未达到预期配置的卡点阈值,代表着存在质量风险,将会阻塞发布流程。


三、平台的设计架构


整体架构底层依赖一些开源的工具(如 Jacoco、Jgit、ASM、maven 等),上面结合业务特点做了一层封装,内部则采用工厂模式的设计模式来实现每个核心组件的独立使用和流程编排。最上层则对外提供一系列 Api,给质量平台以及其他调用方来使用。


代码处理

  • 拉工程代码:主要用于后续切换分支、编译、代码 Diff 计算、工程 ASM 扫描和代码染色等操作。

  • 代码 Diff 计算:主要是基于开源的 Jgit 和 JavaParser 来做代码 Diff 计算以及 AST 语法树分析,分析出变更的 class 以及内部相关信息。

  • 代码编译:会在当前版本的代码上做 mavn/Gradle 编译,主要用于下一步 ASM 代码扫描。

代码静态分析

  • 对于字节码扫描,目前一些常用的字节码操纵框架,ASM/Javassist/bcel 都可以实现(ASM 整体性能更优;Javassist 提供 API 更加丰富,可读性和上手更容易)。

  • 生成全局方法调用关系:在扫描分析中需要剔除掉一些不关注的方法,例如类的加载方法(、等)以及非本工程下的依赖包。ASM 这边的话可以通过解析字节码解析结果对象中的 instructions 属性中的 AbstractInsnNode 来筛选出方法的 MethodInsnNode,然后通过链表的解析处理最终可以形成所需要的调用链关系。

  • 递归寻找方法的调用关系:通过 Diff 出来的 class 中的方法信息在调用链中关系递归来找到最顶层的调用方法。

  • 接口和实现类的桥接:如果一个方法的上一层调用是接口的实现类,那么分析链路就会断掉,此时就需要通过接口实现类所对应的 interface 类来做桥接。

  • 内部类桥接:匿名内部类编译过程中会生成一个类似 A$1 的 class 文件,根据字节码文件中的 EnclosingMethod 字段可以判定上层调用方的类名和方法名,从而可以完成方法和匿名内部类方法的桥接

  • 结果处理:实际结果分析出来可能会存在大量业务上不关注的方法(比如已经废弃没有被调用的方法、实体类对象中的 get/set 方法,一些拦截器、日志、bean 的 config 注册等等),因为剔除的范围过大而且不可控,目前我们采用的方式是通过正向白名单配置类注解+方法注解的方式来筛选需要关注的 class(可动态配置扩展)。

上下游依赖分析

  • 通过严选的服务依赖平台,能够获取到变更接口上下游服务和接口的影响。

用例智能推荐和执行

  • 根据以上分析出的每个变更的单元,会从我们的自动化测试用例库来筛选和匹配合适的自动化用例推荐给测试人员。

  • 测试人员可以在可视化面板上看到每个变更单元的信息、依赖信息、用例推荐信息,如下图:


四、我们的突破

原生 Jacoco 不支持分支或版本之间的覆盖率计算,如何解决?


我们设计的方案是基于 JaCoCo 做相应改造,生成我们所需要的覆盖率模型,并通过 JaCoCo 开放的 API 实现相关功能。这里面主要需要解决的点在获取增量代码并解析生成覆盖率上。可以拆分成如下几个步骤:


  • 获取测试完成后的 exec 文件(二进制文件,里面有探针的覆盖执行信息)

  • 获取基线提交与被测提交之间的差异代码

  • 对差异代码进行解析,切割为更小的颗粒度,我们选择方法作为最小维度

  • 改造 JaCoCo ,使它支持仅对差异代码生成覆盖率报告




  • 覆盖率报告只会针对增量部分做展示



  • 对变更代码做出标记,以及展示对应方法的覆盖情况


原生 Jacoco 在服务重新部署后覆盖率数据无法继承,如何解决?


目前我们是通过改造原生 Jacoco agent,在 agent 监听的服务 TCP 连接断掉之后,自身会触发 shutdown,在 shutdown 的钩子里我们加入了触发通知精准平台来获取当前的覆盖率数据,dump 文件到本地,将这个片段的数据和历史老的已存在的片段数据做合并操作(未发生变更的 class 文件可以完成合并)。同时我们设定的是只有在强制清空覆盖率时(用户主动触发清空操作),才会删除本地历史的覆盖率 exec 文件。



ASM 对静态工程代码扫描,是无法支持到一些 Java 多态、AOP 方向的一些调用关系的,如何解决?


目前我们也已经发现了用静态扫描的方式确实无法支持到这个程度的,需要通过做一些动态的处理来分析真实业务的链路走向。目前行业内的一些成熟做法也是通过 Javaagent 的方式对内部方法做一些织入,例如当执行自动化或者功能测试时,可以记录一次请求经过的所有内部方法,这样形成的内部方法调用链将会记录 aop 和多态执行的真正的方法,静态的弱点会得到很大的补充。但是这样就会对性能和织入范围有比较高的要求,这个也是我们目前正在去研究和攻克的方向,整体架构如下图:



我们希望通过线上流量录制回放或自动化回归的方式,来记录每个 traceId 走过的内部方法路径轨迹。然后再进行每个流量的比对分析和去重的方式,最终计算出本次版本的真实测试流量,有哪些路径轨迹已经被测试所覆盖,哪些还未被覆盖,可能会存在质量风险,同时未覆盖的路径是否有用例能够匹配上,最终会将这份数据提供给测试同学做决策。

五、未来演进方向

易用性

目前我们精准平台的基本能力已在严选各业务线逐步开始使用。未来会在应用接入效率、工程的兼容性、执行分析的性能、代码染色的可视化效果、支持移动端以及底层基础能力封装对外提供等方向上去做优化和升级。

精准性

在精准性方面,也是平台最需要保障的事情。我们需要做的事情和攻克的技术难点还很多,比如代码染色更加的精准、支持使用真实流量来动态分析内部的代码走向轨迹、上下游依赖服务影响分析更加合理等等。

智能性

智能主要体现在用例智能推荐、驱动执行和每个被测单元的覆盖度可视化等方面,未来我们的目标是通过精准分析+自动化+覆盖率三大能力的配合形成闭环,有效的精简用例,准确的推荐用例,以提高测试销量和测试质量。


作者简介


陈逸青:网易资深测试开发工程师,专注于测试技术领域的探索和研究。目前主要负责严选测试服务化能力搭建和演进、测试效能提升以及质量架构规划建设等工作。


周倩如:网易严选高级测试工程师,分销线测试负责人。在服务端测试、客户端测试的各项测试技术方面均有涉猎。


2020-10-18 16:0314091

评论 4 条评论

发布
用户头像
这一块没看明白,分析链路为什么会断掉,可以详细解释一下吗

接口和实现类的桥接:如果一个方法的上一层调用是接口的实现类,那么分析链路就会断掉,此时就需要通过接口实现类所对应的 interface 类来做桥接。

2021-11-23 14:57
回复
用户头像
测试金字塔底部面向技术的组件测试执行够快,基本不需要精准测试。金字塔顶部面向业务的功能测试执行慢,最需要精准测试。但你通过白盒的代码染色分析又判断不出覆盖了哪些黑盒的功能测试用例,只能分析出API测试用例(组件测试的一种,面向技术),这样的「精准测试」有啥意义呢?
2021-05-10 22:06
回复
[但你通过白盒的代码染色分析又判断不出覆盖了哪些黑盒的功能测试用例],关于这个问题,如果功能测试用例已经入库或者标准化存储了的话,其实也是可以判断出来的,简单比如获取变更调用链上的各个方法注释,通过分词后去匹配功能用例备注,超过相似度阈值的就推荐出来,然后通知干系人。精准是靠diff支撑的,如果精准有左移和右移的说法,那么通过对需求文档/测试需求文档/产品文档和对服务器/k8s集群的一些相似度匹配,是不是能提升一些测试前后的效率,甚至可以再通过需求文档反向预估出本次需求设计的代码改动点(服务/类/方法/甚至代码行)。
2023-07-06 17:01 · 北京
回复
用户头像
能把一个简单的双覆盖准则方法包装得如此高大上,有水平~
2020-10-26 09:30
回复
没有更多了
发现更多内容

云主机使用的硬盘类型及对应的存储类型详解

天翼云开发者社区

云计算 存储 硬盘

低代码平台的探究与分析

互联网工科生

软件开发 低代码 零代码 JNPF

VR虚拟现实应用——原型制作

3DCAT实时渲染

虚拟现实 实时云渲染 VR虚拟现实

恭喜我同事的论文被IEEE HPCC收录!

天翼云开发者社区

数据库 云计算 高性能计算

十大项目管理主流方法论介绍

爱吃小舅的鱼

项目管理 项目管理方法

量子计算和量子通信技术:引领潜力无限的未来

EquatorCoco

量子通信 量子计算 量子模拟

文心一言 VS 讯飞星火 VS chatgpt (131)-- 算法导论11.2 3题

福大大架构师每日一题

福大大架构师每日一题

2023 IoTDB Summit 正式“官宣”,邀您见证“从数据到洞察”的未来!

Apache IoTDB

数字政府!3DCAT实时云渲染助推上海湾区数字孪生平台

3DCAT实时渲染

实时渲染 实时云渲染

2023云栖大会的新鲜事

法医

8款好用的AI流程图软件推荐,高颜值流程图轻松绘制!

彭宏豪95

人工智能 流程图 在线白板 AIGC 流程图绘制

一文读懂 Fabarta ArcGraph 图数据库丨技术解读

Fabarta

人工智能 AI 图数据库 大模型 向量数据库

2023年的低代码:数字化、人工智能、趋势及未来展望

快乐非自愿限量之名

软件开发 低代码 低代码开发

外贸企业新手指南:谷歌SEO多久能带来流量增长?

九凌网络

EMQX ECP 2.0 工业互联数据平台产品发布会

EMQ映云科技

数字化转型 工业4.0 智慧工厂

网站引流绝技:如何通过外链持续给网站带来高质量流量

九凌网络

情感语音识别技术在心理健康领域的应用与挑战

来自四九城儿

极狐GitLab CI 助力 .Net 项目研发效率和质量双提升

极狐GitLab

.net ci 持续集成 代码规范 gitlab ci

快手SL200芯片获选2023世界互联网大会“创新发展典型案例”

Geek_2d6073

前三!前三!!前三!!!

天翼云开发者社区

云计算 公有云 云服务

定制开发APP软件和网站的优势在哪里?

Geek_16d138

软件

阿里面试:看过框架源码吗?举例说明一下

王磊

Java

智驾未来:自主创新才是真正握住了命脉

不在线第一只蜗牛

华为 智能驾驶 小鹏汽车 问界

九凌网络分享外贸快车实现迅速出口的目标

九凌网络

如何寻找优质的谷歌seo优化公司来提升你的外贸网站排名

九凌网络

如何使用 NFTScan NFT API 在 zkSync 网络上开发 Web3 应用

NFT Research

NFT\ NFTScan nft工具

向量数据库:释放数据潜能,重塑信息世界

熬夜磕代码、

向量数据库

低代码平台,业务开发的“银弹”

树上有只程序猿

软件开发 低代码平台 JNPF

强化您的应用安全,从app加固开始

雪奈椰子

网易严选的精准测试实践_架构_陈逸青_InfoQ精选文章