写点什么

网易严选的精准测试实践

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

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

uni-app跨端开发H5、小程序、IOS、Android(三):理解uni-app框架MVVM思想

程序员潘Sir

微信小程序 uni-app android iOS Developer 3月日更

论文免费开源:NB-IoT智慧路灯监控系统

不脱发的程序猿

28天写作 论文 3月日更 NB-IoT智慧路灯 大学生毕业

马特机器人系统开发(成品案例,快速上线)

系统开发咨询1357O98O718

Continue 玩转像素点,Python 图像处理学习的第 3 天

梦想橡皮擦

28天写作 3月日更

fil挖矿系统开发|fil挖矿系统软件APP开发

系统开发

使用“零信任”,不惧“内部威胁”!

龙归科技

管理 数据完整性 零信任 内部威胁

高频量化交易系统开发功能丨量化交易机器人系统开发详情

系统开发咨询1357O98O718

IPFS云矿机系统开发|IPFS云矿机APP软件开发

系统开发

万物摩尔定律

soolaugust

AI

Python if __name__ == ‘main’ 的作用介绍

HoneyMoose

干货 | 万字详解整个数据仓库设计体系

五分钟学大数据

大数据 数据仓库 28天写作 3月日更

【实战问题】-- 并发的时候分布式锁setnx细节

秦怀杂货店

Java 分布式 高并发

收藏!Linux常用命令合集

roseduan

Linux

跟我学ModelArts丨探索ModelArts平台个性化联邦学习API

华为云开发者联盟

AI 联邦学习 API 华为云 modelarts

华为云应用服务网格最佳实践之从Spring Cloud 到 Istio

华为云开发者联盟

微服务 Spring Cloud istio 华为云 服务网格

【LeetCode】设计停车系统Java题解

Albert

算法 LeetCode 28天写作 3月日更

共筑“新基建” 京东云全面开启渠道合作伙伴招募计划

京东科技开发者

云服务

MySQL的锁

一个大红包

3月日更

一文搞懂三级管和场效应管驱动电路设计及使用

不脱发的程序猿

28天写作 电路设计 三极管 3月日更 场效应管

一个合格的CloudNative应用:程序当开源软件编写,应用配置外置

华为云开发者联盟

云原生 华为云 Cloud Native CCE CSE

LeetCode题解:213. 打家劫舍 II,动态规划(不缓存偷盗状态),JavaScript,详细注释

Lee Chen

算法 大前端 LeetCode

「面试高频」秒杀架构的设计套路,你值得拥有

我爱娃哈哈😍

架构设计 架构设计实战 秒杀架构

「SaaS第一股」微盟集团财报业绩大涨,超预期财报揭示多元投资布局

ToB行业头条

SaaS 微盟

「 视频云大赛 — 大咖驾到 」下一代技术新浪潮,正由视频云驱动

阿里云CloudImagine

阿里云 音视频 intel

百度大脑开放日重庆站-智能物流专场报名啦

百度大脑

百度大脑 智能物流 智能物流开放日 重庆站

Python 打印回车换行

HoneyMoose

在线数据迁移,数字化时代的必修课 —— 京东云数据迁移实践

京东科技开发者

数据库 数据迁移

Java面试必看!阿里(嵩山版)分布式核心原理笔记来了

Java架构追梦

Java 阿里巴巴 架构 面试 架构分布式

小树系统开发案例(源码)丨小树机器人系统开发流程

系统开发咨询1357O98O718

uniapp实现音视频通讯

anyRTC开发者

uni-app 音视频 WebRTC 跨平台 sdk

Python 生成 QR 二维码

HoneyMoose

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