前言
第一次听到精准测试是在几年前了,那一瞬间就对这个流派充满了好奇和探索的欲望,最近几年逐渐得到了各领域各行业中测试人员的广泛关注,那么问题来了:
- 什么是精准测试;
- 精准测试的意义和价值在哪里;
- 精准测试整体方案如何落地;
传统测试的痛点
测试效率低下
常规的测试类型包括功能测试、回归测试、自动化测试、接口测试等,非常依赖于测试人员的测试经验,基于人工主观分析的黑盒测试,借助常规的用例设计方法来确保产品质量。
根据收益递减规律,虽然大量的人力投入,不断的执行测试,但是漏测率还是居高不下。中间的无效测试和重复测试也浪费了大量的测试成本。
测试范围无法评估
- 多分支代码合并到主分支,修改哪个文件哪个行,测试不可控;
- 代码更新影响哪些功能无感知;
- 大部分的测试还是基于对业务的理解,与真实业务数据还有差距,准确性难以保证,盲测,风险大;
测试过程中的质量标准无法衡量
怎么样判定测试完成,怎么样判定测的怎么样?质量控制贯穿于整个质量保障流程。
- 用例执行完成;
- 探索性测试完成;
- 开发人员缺陷修复完成;
- 回归测试完成;
- 自动化执行通过;
上述步骤完成意味着我们的产品质量是合格的吗?
上线之后的非一致性成本逐渐增高,测试过程没有数据量化的评定,无法衡量,只能依赖线上缺陷率,线下缺陷数,千行缺陷率等比较飘的指标来评定,测试管理难度大。
敏捷模式和分布式微服务架构下的挑战
- 迭代周期短,尤其是互联网行业,日常版本的周期基本两周一个迭代,对于时间成本的控制要非常精确;
- 需求频繁变更,每次变更都需要回归全部用例,大量的重复劳动;
- 软件系统越来越复杂,服务和服务之间的调用逻辑关系没有头绪,无法精准的预估范围和定位缺陷;
基于上述痛点,我们期望从以下方面解决:
- 科学地评估代码变更影响到的功能点,需要对这部分代码做准确的针对性的测试,使测试更加的精准,回归测试所需的时间更短,回归的范围更准确。释放人力成本,将更多的时间和成本投入到更深,更底层的测试工作中;
- 对代码的逻辑进行深刻的理解,哪些分支代码被覆盖到,哪些分支代码没有被覆盖到,进行详细的分析,找出漏测的地方,需要准,减少重复劳动,从经验型的主观判断向精准的数据可视化转变
精准测试的概念
精准测试是一套计算机测试辅助分析系统。 使用用例和代码两个关键因子,进行质量综合考量和分析的创新测试理论方法体系,核心组件包含软件测试示波器、用例和代码的双向追溯、智能回归测试用例选取、覆盖率分析、缺陷定位、测试用例聚类分析、测试用例自动生成系统,这些功能完整的构成了精准测试技术体系,大大增强了测试的深度与广度,打破了测试部门的成长天花板,为测试过程本身的价值挖掘和测试数据资产的增值,提供了必要而充分的条件。
核心特性之一双向追溯
通过系统采集程序代码执行逻辑,建立测试用例与程序代码之间的逻辑关系,形成正向和逆向的双向追溯机制,实现了精准无误的数据可视化。
- 正向追溯:测试人员执行一个测试用例以后,精准测试可以自动的记录和显示这个测试用例的代码内部执行细节。每个测试用例都可以进行量化分析和统计,这些量化数据既可以用来对测试人员进行工作的考量,也可以提供开发人员和测试人员之间进行信息化的交流。
- 逆向追溯:测试人员根据开发修改的代码,分析代码关联的调用逻辑关系,快速精确的定位测试范围,极大减少无效,重复的测试工作,使测试覆盖率达到最大化。
精准的数据来判定,所有数据由系统自动、原生录入,数据不可篡改,产生测试数据可直接用于测试的过程管理和实效分析。支持测试数据的精准度量以及全面的、多维度的测试分析算法,将白盒测试的视角从覆盖率扩展到智能测试分析。
用例的智能筛选
基于用例和代码的追溯关系在进行运算之后全自动得出的。用例和代码精准的追溯机制,使数据开始可以实施大量的智能测试算法。
设计思路
一、增量代码 diff
精准测试的核心特性之一是双向追溯,前提是基于变更代码的双向追溯,因此变更的代码是整个系统最重要的一个输入。
- 通过 JGit 来获取代码差异;
- 解析到方法级别,作为调用链路推演的输入;
二、源码静态结构分析
- 函数调用分析方法: 静态方式基于字节码的解析(ASM/bcel/Javassist 等),动态分析调用链路(使用 javaagent 对内部方法进行代码织入等),这里使用的是 JavaParser+JavaSymbolSolver 基于静态代码得到完整的调用链路。
- 结合代码增量获得变更代码调用链:
- 根据 Controll 层 Mapping 注解,获得变更代码影响的上层业务相关的 Http 接口;
- 根据 Dubbo XML 配置文件,获得变更代码影响的内部 Dubbo 协议调用接口;
关键代码:
- 获取 Java 文件的符号推理器
- 获取 Jar 文件的符号推理器(微服务架构下,跨服务的面向过程调用)
到此,关键的一步受影响的接口已经获得,有了上述的能力,我们可以知道通过哪些接口可以去测试这次改动的代码,但是面对大量的接口列表,相信大部分测试人员是一脸懵逼的。
三、增量代码覆盖率
价值:
- 通过增量代码覆盖率的统计,对系统的内部执行逻辑深入分析,筛选分析未覆盖或者覆盖率较低的方法,依赖上述的调用链路可以获取到影响的接口来进行用例的补充和测试;
- 通过研发效能平台持续集成,进行覆盖率卡点,当覆盖率低于预期值将无法通过测试;
方案:
增量覆盖率的设计方案这里不过多介绍,请自行查阅相关资料,归纳成以下几点:
- Jacoco 做相应的改造,增加增量代码的数据统计;
- JVM 启动参数配置 Agent,TCP 方式启动;
- Dump 覆盖率文件和 class 文件解析后得到报告;
如何避免一次测试过程中,服务多次重启和部署,导致覆盖率丢失,有几种解决方案:
- 定时 Dump 覆盖率数据进行汇总;
- 通过 shutdown 事件,触发 Dump 覆盖率数据;
整体框架:
覆盖率曲线示波器:
覆盖率详情:
四、智能推荐用例
**智能推荐算法:**算法是什么?我们可以把它简化为一个函数。函数接受若干个参数,输出一个返回值。
输入参数是线上监控,覆盖率和自动化覆盖的各种属性和特征,包括调用频次,时间分段,行业,覆盖率,是否有自动化,发布时间等等。经过推荐算法处理后,返回一个按照重要度,紧迫度排序的推荐用例列表。
业内常用的几种推荐算法如下:
此外,通过筛选自动化用例可以得到哪些接口没有被自动化,反哺到自动化平台用例的补充,以完善自动化接口覆盖率,流程上形成闭环。
接口变更兼容性校验:
我们还可以做接口参数变更兼容性验证,测试过程中通过研发效能平台持续集成触发检测,挑选出接口兼容性可能存在问题的接口,邮件通知到测试人员。
未来的展望
一、智能缺陷定位
传统软件测试过程中,缺陷由测试人员录入到缺陷管理平台,只负责发现缺陷。开发人员针对这些缺陷进行定位、排查和远程调试,如果测试人员提交的缺陷是比较模糊的功能描述,那么开发人员将会花费大量的时间去排查问题。
通过精准测试平台,对于执行失败或者不通过的用例,根据用例执行详细的路径追溯信息,自动分析缺陷产生的代码块,给出缺陷产生的可疑代码排名。
参考实际的缺陷定位手法,实现把抽象的定位思路转变成直观的可视化图形界面。
二、测试过程的行为分析
通过对测试人员测试执行和代码的路径追溯信息,进行聚类分析:
- 某个功能的测试范围是否充分;
- 测试人员的测试习惯聚焦在哪些功能;
- 哪些分支的覆盖比较薄弱;
- 哪些用例的设计重复性较高;
客观的呈现每个测试人员的测试思路和能力曲线,比如测试是否充分的功能用圆形来展现,越充分直径越大,习惯聚焦的功能点用距离来展现,越聚焦距离该功能越近等。
总结
精准测试是一个完整的质量体系架构,传统的黑盒测试与白盒测试相结合的模式,通过不断的对人的行为的分析得出不足点和漏洞点,引导开发和测试有针对性的改正纠偏,逐步的完善整个质量保障体系。
更多相关技术内容欢迎关注 网易智企技术+ 公众号。