揭秘百度智能测试在测试自动生成领域的探索
《揭秘百度智能测试规模化落地》,介绍了通过将测试活动分为测试输入、测试执行、测试分析、测试定位和测试评估五个步骤,来推进百度智能测试点线面体的规模化、一体化落地。本章节重点揭秘在测试输入环节非常重要的领域测试自动生成。测试自动生成,通过将数据、算法、工程等相关技术有机结合,在测试输入阶段自动实现“高覆盖、高仿真、全校验”的揭错集合,一般包含测试数据生成、测试用例生成、动作集生成、测试断言生成等方面,在学术界和工业界均有非常优秀的研究和实践。方法论上一般包含基于控制流图、基于数据建模或两者结合的方式。本章节将从多个实践的角度,介绍相关领域的目标、思路、涉及到的技术点、效果,希望能给到大家一定参考。
01 基于 AST 的异常单测用例生成技术揭秘
代码级用例自动生成用于解决 RD 写单测困难、耗时等问题,探索一种可以根据代码结构、代码信息自动生成单元测试代码的方法。
基于 AST 的代码级异常单测用例生成技术是一种近代码感知问题的测试手段,其核心技术包括代码理解、用例数据生成、用例驱动代码生成。
代码理解环节通过静态代码扫描的手段,将代码语言抽象成结构化的函数特征数据,特征数据包含:函数调用方式、变量声明和赋值方式、变量关系、变量字面值、mock 点等信息。
用例数据生成环节,基础数据源包括边界值、随机值、变异值、代码字面值和函数插桩参数值以及一些业务自定义的数据。为了避免用例爆炸,在传统的基于生成法构造用例数据的基础上,除了被测目标接口协议外,结合了高风险变量选择、路径选择、符号执行以及基于搜索的生成算法(例如采用遗传算法,通过适应度公式来评估用例质量好坏)来指导用例数据的生成,保证用例集覆盖更多分支下的代码逻辑,结合覆盖率和问题堆栈信息,反哺用例生成算法,降低对无效用例的生成,在有限测试成本下生成更有价值的用例,保证揭错能力。
用例驱动代码生成环节,依托多语言多测试模板如(gtest 语法要求)建立生成算子集,基于代码结构化数据和用例数据,调用不同的生成算子,结合智能 mock 生成算子,生成可编译执行的测试用例代码。
现已具备 C++/GO/OC 三种语言的用例生成能力,召回 1000+异常(core、死循环、panic)等问题。
02 接口级用例自动生成
接口用例自动生成,主要是针对服务接口级自动生成 API 请求来代替人工写用例的场景,解决人写用例不完备、工作量大等问题。
接口 api 一直具有良好的可测性,在各大场景下面,都有相关自动化接口测试的应用,但是使用的越来越多,也会出现新的挑战。比如 case 的人力成本,因为要持续添加新的 case 测试,还要持续维护老旧 case,所以针对 case 这边的人力维护成本也越来越高;自动化 case 的质量,有可能写了很多 case,但是压根就没有多少是有用的,或者无法辨别 case 质量,越积愈多,无法维护。所以针对以上问题,提出接口用例的智能自动生成,主要是思路就是根据定义好的接口格式,包括 api 定义管理工具,业务系统日志,截包等等,都可以拿到各个接口标准的定义,然后加上人工梳理的理解,对一些字段进行一些条件限制,最终可以通过接口的定义和限制条件,自动智能的生成批量的测试 case,可以快速的进行接口契约测试和回归测试。除了接口用例自动生成,在接口的断言也做了自动智能化的升级,主要的思路就是根据历史 case 的运行结果,首先可以自动判断后续所有 case 的返回接口体一致,不会出现结构嵌套的问题。再进一步,也可以根据历史接口返回各个字段的值的特点,自动智能的生成针对每个 value 值的断言,快速判断接口是否有异常。目前接口智能化生成的 case 有 2w+,占整体 case 量级的 80%以上。
03UI 浅交互用例自动生成
UI 自动化测试可以实现端到端测试,对业务功能进行回归验证,大大提高测试效率。目前该领域存在明显局限性:1、用例书写成本高;2、用例召回能力弱;3、用例维护成本大。但有部分业务 UI 交互并不复杂,如在关注展现样式或浅交互功能的产品中,一方面,QA 需要对数百上千条数据驱动下的页面进行样式校验;另一方面,需要对页面里数十个元素的操作交互进行验证,我们尝试用视觉技术解决此类用例生成用于代替人工。
UI 浅交互 case 生成技术工作,具体包括离线数据挖掘模块和实时任务执行模块:在数据挖掘环节,操作的对象是线上基线产品,我们使用 DNN Object Detection 技术,训练生成控件级和页面级分类和回归任务模型,进而利用 mine 技术录制页面关键 Dom 元素的探索操作,生成带有上下文语景的操作序列,最后把这些 action 和 pic 作为生成的用例步骤;接着在 real-time 任务执行环节,对线下提测模块进行路径回放,并进行 ui-diff 视觉技术校验,来进行 case 的回归验证测试。
整套 UI 用例浅交互生成机制,可以生成低成本、高召回的自动化 case,目前该技术在共覆盖多个产品线,发现有效问题 16 个,在某业务的前置准入流水线,生成 1000+case,试用阶段,已召回 3 例问题。
04GUI 遍历动作集自动生成
前面介绍的均是代码、接口、UI 层面的生成技术,本段解决的是动作集自动生成,此类场景在 UI 遍历、巡检、monkey 有非常广泛的应用,即如何探索出一套高效的拟人化遍历解决方案。
GUI 遍历动作集自动生成,核心是在平衡资源与收益前提下,自动生成覆盖率和问题露出率高的动作集。GUI 动作集是指向移动真机或模拟器发送的一系列随机的用户事件流(如按键操作、触摸屏操作、手势输入等),是模拟真实用户的点击、滑动、输入等操作的集合。核心点在于更快(相同的召回率,耗时更少)、更多(相同的操作次数,覆盖率更高)、更准(相同的机器时长,增量覆盖率更高);传统 Monkey 随机遍历,速度极快但无效操作多资源消耗大,较为智能的做法是基于控件的加权遍历方法, 该方法将页面结构提取成控件树,并对这些控件基于属性、历史操作情况等赋予不同权重,最后将页面抽象为“点”,控件抽象为“边”,这样将动作集的生成转化成对有向有环图的遍历问题;这种遍历没有场景对照,且图中存在大量环路极易陷入局部循环,需要在遍历过程中给一定的反馈辅助动作集走出死循环,对此引入基于 Deep-Q-Learning 的智能遍历,以能否进入新的页面作为激励,遍历过程有反馈,并且结合业务加入多种场景,让动作集的生成在反馈机制下自探索自学习,并进一步引入拟人化的思想,通过激励和惩罚机制使得动作集具有一定的逻辑性。与纯随机相比,相同时间内,智能遍历覆盖率提升 33%,相同覆盖率,智能遍历缩短 75%的测试时间。
05 前端用例自动生成断言
撰写测试断言存在不规范、工作量大、不完整等问题,导致很多本该召回的问题未及时报警,本阶段就是为了解决此类问题。
测试断言用于检查被测系统行为的正确性,即通过向被测系统提供输入,并以预期的输出评估结果来处理生成结果是否正确。在前端自动化领域,大量手工测试行为被自动化代替,自动化用例又逐渐趋向于自动生成。如何有效判断执行是否符合预期?关键点在于如何自动地生成完备、合格的断言。主要思路,一是有参照召回,即以历史版本或某机型的当前版本作为正确的参照,将被测版本与正确版本进行对比;二是无参照召回,即预先提取明显问题的特征,检查用例执行后是否命中,如白屏、乱码。在百度的实践中,我们加入了多层级页面理解和特征提取算法,来解决多设备版本的相对位置不同、复杂页面难以识别等问题,实现了端到端的立体校验。目前日均运行数十万次,策略准确率达到 97%+,拦截 bug2000+个。
推荐阅读:
评论