写点什么

网易严选的精准测试实践

  • 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:0314645

评论 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
回复
没有更多了
发现更多内容

Nova for Mac:现代开发者的代码编辑器

小玖_苹果Mac软件

FastScripts for Mac:高效脚本管理与快捷操作工具

小玖_苹果Mac软件

学习机哪个牌子好?如何提升孩子学习成绩

妙龙

学习机

隐形的守护者(风控技术篇)-时序流异常检测(Self-Isolation-Stream)

京东零售技术

低代码加速智能制造,兰之天的选择是 NocoBase

NocoBase

开源 低代码 数字化转型 制造业 中小企业

每日一题(源码+文档+讲解+演示)

深圳亥时科技

怎么测试网站是否通过IPv6改造?IPv6检测指标有哪些?

国科云

周边生态 | WAL-G 与 DBeaver 新版增加 Cloudberry 支持

酷克数据HashData

AI 搜索开放平台 × DeepSeek,面向企业及开发者的首选解决方案

阿里云大数据AI技术

人工智能 搜索 rag AI搜索 DeepSeek

LED显示屏:多功能与创新应用

Dylan

LED显示屏 全彩LED显示屏 户外LED显示屏 led显示屏厂家 户内led显示屏

linux有哪些常用命令?

秃头小帅oi

百万级群聊的设计实践

vivo互联网技术

后端 IM 群聊

java中如何实现单链表反转

秃头小帅oi

淘宝直播间弹幕API接口(淘宝API系列)

tbapi

淘宝API 淘宝直播间弹幕接口

阿里万相重磅开源,人工智能平台PAI一键部署教程来啦

阿里云大数据AI技术

人工智能 AIGC PAI 万相

评测 步步高家教机和科大讯飞学习机哪个更适合中小学生

妙龙

科大讯飞 学习机 步步高 家教机

基于Kerberos认证对接华为云Elasticsearch

大河

elasticsearch 华为云 bboss

和鲸科技受邀出席全球开发者先锋大会,共话数智驱动下的医疗健康语料

ModelWhale

人工智能 大数据 #AI 全球开发者大会 GDC

新能源汽车续航大提升:参数选型与能量回收

DevOps和数字孪生

电机 仿真建模

如何用学习工具提升成绩 如何用学习机提升成绩?

妙龙

学习 学习机

个人开发者也能训练推理模型?GRPO 技术详解

Baihai IDP

AI 强化学习 推理模型 LLMs DeepSeek

淘宝淘口令转换API接口(淘宝API系列)

tbapi

淘宝API 淘宝淘口令API 淘宝口令接口 淘口令转换接口

Text Workflow for mac(文本格式转换工具)v2.2.2直装激活版

小玖_苹果Mac软件

2025小学生买哪个牌子学习机比较好?小学生学习机排名

妙龙

学习机

合合信息与中科曙光签署合作协议,助力加速信创国产化进程

合合技术团队

人工智能 AI 算法 #大数据

PullTube for Mac:轻松下载与转换在线视频

小玖_苹果Mac软件

智能生产管控数字化平台(源码+文档+讲解+演示)

深圳亥时科技

黑龙江等保测评到底哪些企业必须做?一文详解,避免踩坑!

黑龙江陆陆信息测评部

高中生必备学习机推荐2025? 哪款学习机适合高中生使用

妙龙

学习机

QCN9274 & QCN6274 Wi-Fi 7 with Multi-Link Operation (MLO) on X86 Devices: A New Era of Connectivity

wallyslilly

qcn9274 qcn6274

Svelte 最新中文文档教程(21)—— 自定义元素

冴羽

vue.js 前端 React Svelte SvelteKit

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