全自动文章采集网源码2020(Android单测自动生成工具可能正是你所需要的(二))
优采云 发布时间: 2022-01-24 02:22全自动文章采集网源码2020(Android单测自动生成工具可能正是你所需要的(二))
| 简介 在编写 Android 单元测试时,您是否被复杂的数据结构和断言所折磨?如果是,那么 Android 单元测试*敏*感*词*可能正是您所需要的。该工具提供路径分析、测试数据构建、断言验证等核心能力,最终实现单项测试用例的一键生成。行动不如心跳,快来试试吧!
一、背景及工具介绍1.1 背景
单元测试的主要原理是分析源代码中的控制结构和处理过程,检查程序内部处理是否正确,包括语句结构、分支和循环结构、参数和断言构造的路径分析。随着devops的不断深入,高效编写单元测试是很有必要的。那么面对海量代码,如何高效地编写单元测试呢?针对这个痛点,我们开发了这款Android单元测试自动生成工具,下面将详细介绍。
1.2 工具简介1.2.1 工具能做什么?
该工具可以自动批量生成Android单元测试用例。对于java文件或kotlin文件类中的方法,支持路径分析、测试数据构建和断言验证一键生成,替代原来的人工读取分析代码和人工构建数据。.
对于被测java代码,该工具支持两种方式生成单个测试,包括条件构造和记录回填;对于 kotlin 被测代码,该工具目前支持生成单个测试用例模板。
1.2.2 该工具是如何工作的?
工具以IDE插件的形式存在,适用于android客户端,安装后直接使用。
1.2.3 工具有什么好处?
① 提高增量和存量场景的单个测试用例编写效率;② 提高单元测试覆盖率;③ 在代码版本回归测试中,工具可以帮助更快地定位代码变更引入的问题,通过路径分析降低维护成本;
二、总体思路
上面提到的工具的目的是替代原来的人工阅读代码、路径分析、人工构建测试数据。
这就要求工具能够做到以下两点: 1. 自动分析路径,效率更高,避免人工分析可能导致路径覆盖不全的问题;2. 以一定的方式构建测试数据,无需用户人工干预。基于这两点,拆解开发者为方法编写单元测试代码的过程。关键步骤如图:
整个过程被抽象为确认被测方法->分析被测代码->构建测试数据->生成测试代码4个过程。
三、实施计划
基于上一节的分析,整个技术方案的设计如下图所示。本节重点介绍路径生成和条件构建的实现方案。
3.1 路径生成方案3.1.1 路径生成背景
生成用例时,需要完全覆盖被测方法的路径,这就需要生成路径。目前的行业解决方案主要是基于编译后的字节码来识别跳转语句,找到代码块之间的跳转关系,获取可执行路径。行业解决方案有两个缺点:一是源码必须编译成字节码,有时甚至需要编译整个模块或项目,非常耗时,使用不方便;很难一一匹配分支。
由于缺乏行业解决方案,我们需要考虑其他更好的解决方案。经过分析研究,我们实现了一个基本的基于块的路径生成算法,有效地解决了这个问题。
3.1.2 路径分析解决方案
基于基本块的路径生成算法原理:对目标源代码进行静态分析,识别跳转指令和停止指令,划分程序的基本块,构造基本块的有向图,然后得到程序的通过遍历基本块的有向图的路径。最后根据语义分析,去除收录互斥条件的路径,即可得到被测方法的有效可执行路径。核心流程如下:
3.1.3 路径优化算法
当一个方法很复杂并且有很多分支条件时,基本的基于块的路径生成算法可能会生成很多有效路径,甚至上百条。代码更改的维护将是一个非常大的工作量。此外,从圈复杂度和可测试性的角度来看,这种方法很可能需要改进。这个时候我们应该怎么做?
经过调查,我们提出了可执行路径优先级的概念。同时,通过对业务代码和开源代码的模型分析,我们得出结论:路径收录的分支越多,越容易被单元测试覆盖,优先级越高。
根据以上结论,我们实现一个路径优化算法:
假设基于块的基本路径生成算法生成了m条有效路径,设置一个临界值n。
① mn时,启用路径优化算法。首先对m条路径进行优先级排序,然后根据优先级从高到低依次选择可执行路径。当所选可执行路径已经使测试方法的线路覆盖范围达到100%时,选择停止。
通过路径优化算法,最终得到有效的可执行路径,并根据有效的可执行路径生成单元测试用例模板。
3.2条件施工方案3.2.1最佳施工条件筛选
条件构造是在路径分析后静态分析每条路径的入口逻辑条件,结合mock框架构造,在逻辑条件为真时制作代码片段。
下面以条件为例说明工具条件构建方案。
"Acct1 == a.b() && (Acct2 == c.d() || Acct3 == a.b()) || Ac*敏*感*词*==5"
可见条件下有四个子条件 expr1、expr2、expr3 和 expr4,
`expr1 && (expr2 || expr3) || expr4`
每个条件的取值为(真/假),那么工具会将条件的所有值进行排列,得到如下结果:
最小 ② 最小成本构造原则: 表达式形式:字面量>方法调用源:属性、参数>局部变量 基于原则①:最佳构造条件为数字2的情况:
{expr1=0, expr2=0, expr3=0, expr4=1} : true
也就是需要构造的条件是
Ac*敏*感*词*==5
3.2.2 条件构造数据
在过滤掉上一节的最佳构造条件后,本节介绍如何构造满足条件的代码,大致分为以下几个步骤:①获取进入用例路径的最佳条件;②分析条件左右两侧物体的来源和来源。表达形式,建立数据构建策略;③ 生成条件构造的mock代码;步骤①在上一节已经介绍过,本节主要介绍步骤②和③。分析条件左右两边对象的来源和类型流程图如下:
四、演示展示
接下来,本文将介绍两个demo,包括:“生成java单测试用例(条件构造)”和“生成java单测试用例(记录回填)”。
4.1 功能一:生成java单测试用例(条件构造)demo
被测方法有2条路径,生成2个case。
展开案例信息:
4.2 功能二:生成java单测试用例(录音回填)4.2.1“录音回填”介绍
记录回填分为两个过程:记录真实用户数据和回填数据。
记录和回填的过程是独立的。用户 A 记录应用数据后,将存储在后台服务 db 中。当用户B需要生成相关案例时,他请求回填数据,根据案例路径匹配记录的数据,找到最佳匹配数据进行回填。
4.2.2“记录回填”生成java单测试用例demo
Step 1:记录数据 记录和回填配置好后,重新编译打包app到手机,进行用户操作,将代码放到你要记录的类中,即可采集实时数据。第 2 步:生成案例
数据匹配和回填在案例生成过程中完成,用户无需干预。
五、坠落效果
① 效率提升:根据实际统计,过去一个人平均每天写50+个单项测试,但是试用工具后,一般人每天最多可以写110+个测试。并且已经在业务的6700个单次测试中得到验证,自动生成的单次测试用例中约有50%可以直接运行(基本无需人工干预)。对于不能直接运行的代码,因为还要构造数据、调用方法、断言代码,所以只需要【稍加修改】就可以执行。② 高覆盖率:工具生成的单次测试满足100%覆盖路径。③ 访问门槛低:只需安装插件即可使用;④ 适应性强:目前该方案已经为多个服务生成多个单测试用例,超过6个,
六、总结
该工具探索了基于路径分析、测试数据构建、断言验证码一键生成Android单元测试的通用解决方案。欢迎大家一起讨论和使用这个工具!