精准测试是一个2016年就提出来的概念,现在越来越多进入到大多数测试工程师的视野内,其目的是为了使得测试过程更加可视化、智能化、精准化。在严选整个质量体系中,精准测试建设也占有一席之地。本文从概念、实践、设计、突破以及未来演进方向几个方面来介绍精准测试结合严选业务是如何设计和落地的。
我写的用例真的有效且全面吗,我的测试真的做到有效覆盖了吗?
回归阶段我到底需要回归什么,回归验证充分吗?
这次的改动到底影响范围有多大?
上下游依赖服务的改动为什么不通知我,引起了无感知线上bug?
作为一个测试负责人,我怎么直观评估团队里的测试同学的测试覆盖情况?
......
精准测试于2016年应运而生,经过很长一段时间的方法论完善,业界对精准测试有了统一认知。
一、什么是精准测试
精准测试的概念
借助一定的技术手段、通过辅助算法对传统软件测试过程进行可视化、分析及优化的过程,使得测试过程更加可视化、智能、可信和精准。
精准测试的目标
精准测试的核心思想就是使用非常精确和智能的软件来解决传统软件测试过程中存在的问题,从根本上引领从经验型方法向技术型方法的转型。质量的评估不再完全靠个人经验和业务熟悉度,而是通过精准的数据来判定。在测试资源有限的前提下,将用例精简到更加有针对性,提高测试效率,有效的减少漏测风险。
精准测试的核心:双向追溯
正向追溯:开发人员可以看到测试人员执行用例的代码细节,以方便进行缺陷的修复,测试数据可以直接为开发调试提供依据,快速定位并修复缺陷。
逆向追溯:测试人员通过修改的源代码快速确定测试用例的范围,极大减少回归测试的盲目性和工作量,快速修订测试用例,达到测试覆盖率最大化。
在经过很长一段时间的方法论完善,不少互联网公司包括阿里、蚂蚁、腾讯、百度、有赞等均对精准测试进行了落地实操。我们也针对严选自身的情况和现状做了一些技术调研和可行性分析,开启了精准测试在严选的实践。
二、精准测试在严选的实践
整体架构底层依赖一些开源的工具(如Jacoco、Jgit、ASM、maven等),上面结合业务特点做了一层封装,内部则采用工厂模式的设计模式来实现每个核心组件的独立使用和流程编排。最上层则对外提供一系列Api,给质量平台以及其他调用方来使用。
拉工程代码:主要用于后续切换分支、编译、代码Diff计算、工程ASM扫描和代码染色等操作。
代码Diff计算:主要是基于开源的Jgit和JavaParser来做代码Diff计算以及AST语法树分析,分析出变更的class以及内部相关信息。
代码编译:会在当前版本的代码上做mavn/Gradle编译,主要用于下一步ASM代码扫描。
对于字节码扫描,目前一些常用的字节码操纵框架,ASM/Javassist/bcel都可以实现(ASM整体性能更优;Javassist提供API更加丰富,可读性和上手更容易)。
生成全局方法调用关系:在扫描分析中需要剔除掉一些不关注的方法,例如类的加载方法(<init>、<clinit>等)以及非本工程下的依赖包。ASM这边的话可以通过解析字节码解析结果对象中的instructions属性中的AbstractInsnNode来筛选出方法的MethodInsnNode,然后通过链表的解析处理最终可以形成所需要的调用链关系。
递归寻找方法的调用关系:通过Diff出来的class中的方法信息在调用链中关系递归来找到最顶层的调用方法。
接口和实现类的桥接:如果一个方法的上一层调用是接口的实现类,那么分析链路就会断掉,此时就需要通过接口实现类所对应的interface类来做桥接。
内部类桥接:匿名内部类编译过程中会生成一个类似A$1的class文件,根据字节码文件中的EnclosingMethod字段可以判定上层调用方的类名和方法名,从而可以完成方法和匿名内部类方法的桥接
结果处理:实际结果分析出来可能会存在大量业务上不关注的方法(比如已经废弃没有被调用的方法、实体类对象中的get/set方法,一些拦截器、日志、bean的config注册等等),因为剔除的范围过大而且不可控,目前我们采用的方式是通过正向白名单配置类注解+方法注解的方式来筛选需要关注的class(可动态配置扩展)。
通过严选的服务依赖平台,能够获取到变更接口上下游服务和接口的影响。
根据以上分析出的每个变更的单元,会从我们的自动化测试用例库来筛选和匹配合适的自动化用例推荐给测试人员。
测试人员可以在可视化面板上看到每个变更单元的信息、依赖信息、用例推荐信息,如下图:
获取测试完成后的 exec 文件(二进制文件,里面有探针的覆盖执行信息)
获取基线提交与被测提交之间的差异代码
对差异代码进行解析,切割为更小的颗粒度,我们选择方法作为最小维度
改造 JaCoCo ,使它支持仅对差异代码生成覆盖率报告
覆盖率报告只会针对增量部分做展示
对变更代码做出标记,以及展示对应方法的覆盖情况
易用性
精准性
智能性
陈逸青:网易资深测试开发工程师,专注于测试技术领域的探索和研究。目前主要负责严选测试服务化能力搭建和演进、测试效能提升以及质量架构规划建设等工作。
周倩如:网易严选高级测试工程师,分销线测试负责人。在服务端测试、客户端测试的各项测试技术方面均有涉猎。