Airtest 平台自动化测试方案设计与实现
2022-01-07蔡乐俊包梓群包晓安
张 娜,蔡乐俊,徐 曼,包梓群,包晓安
(浙江理工大学 信息学院,浙江杭州 310000)
0 引言
随着移动互联网发展以及智能手机的普及,智能手机应用程序得到爆发式增长。APP 从轻量级逐步向多元化应用演化,用户对APP 要求不断提高[1],移动端测试也日益重要。软件开发公司会对移动端的同一个功能进行数次测试,传统测试方案中,基于DFS 的自动化测试方案即使在数次测试后遍历控件数量仍不会改变,因而会遍历大量的无效控件,浪费了测试时间;基于录制回放功能的自动化测试方案无法在数次测试中全面覆盖界面控件,耗时长且代码覆盖率低。因此,在研究移动端软件测试算法中,越来越多的学者将人工智能算法引入移动端软件测试用例生成上,以提高效率、节省时间[2]。
移动终端平台种类繁多,主要分为iOS 和Android 两大平台,大多数移动应用都需要支持多平台,因其基础架构不同,所以对移动端自动化测试框架的兼容性提出了更高要求[3]。李昕宇等[4]设计了一种基于图像识别的自动化测试方案,该方案可根据移动端控件图标识别点击,容易上手识别率高,但灵活性低,不适合在大型自动化测试中应用;朱菊等[5]提出基于数据驱动测试框架的自动化测试方法,该框架在时耗和可维护性上具有一定优势,但要求测试人员对开发有深入了解,编写难度大;Azim 等[6]在基于关键字驱动的测试框架上,通过对用户和Android 应用程序的交互进行模拟来实现控件的遍历,该方法可以动态监测控件,在界面覆盖率上有较大优势;曹羽中等[7]提出一种基于录制/重放的Android 应用众包测试方法,可直接在众包用户设备上进行重放,减少了测试成本。
以上几种方案是基于数据驱动的测试框架、基于关键字驱动的测试框架、基于图像识别的测试框架等,大多对控件识别阶段或自动化测试框架进行优化,普遍存在灵活性、可维护性、复用性较差等缺陷。针对以上问题,本文在自动化测试阶段引入智能算法。由于移动端在自动化测试时通常会对一个功能模块测试数十次,且每当完成一次测试目标后就需要根据算法优化测试路径,因此在引入智能算法时要考虑是否会增加自动化测试负担。本文以契合自动化测试流程的蚁群算法为基础,结合Airtest 框架和Poco 框架处理APP 控件,提出一种基于DFS 算法和优化蚁群算法的全路径最优规划算法(All Path Optimum Programming Algorithm,APOPA),并分别在iOS 和Android 平台上进行测试。该算法在首次遍历界面时对控件节点进行处理,获取信息并根据测试要求筛选控件节点,为之后优化的蚁群算法生成测试用例进行预处理。
1 蚁群算法优化
蚁群算法模拟了自然界蚂蚁种群觅食机制[8],最早用于旅行商(Traveling Salesman Problem)问题。在移动端上基于蚁群算法求解最优测试用例描述如下:
假定现有蚁群须历经n 个控件,种群中存在m 只蚂蚁个体,用Qij(i,j=1,2,…,n)表示控件之间的控件个数,移动端控件与传统问题中的城市不同,控件之间存在树形结构。Qij=Qi-Qj,Qi为该节点到初始点的控件个数,规定信息素的浓度大小为τij(t),蚂蚁k(k=1,2,…,m)从控件i到控件j关键因素是状态转移概率,状态转移概率由以下多方面参数构成,计算公式为:
其中:ωk(k=1,2,…,m)表示蚂蚁走访的控件集合,ηij(t)代表蚂蚁由控件i向控件j移动的期望值,计算公式为:
α表示控件间信息因素的重要程度,信息素浓度对蚂蚁移动的影响以α的数值表示,α越大,蚂蚁行为受到的影响也越大;β为启发函数的重要程度因子,数值越大蚁群就越容易选择局部较短路径[9]。
为鼓励蚂蚁尽量选择为遍历过程贡献大的节点,同时尽量避免访问重复经过的节点[10],对蚁群算法进行优化,增加了信息素奖惩机制。在蚂蚁遍历完成一次测试后,从该轮解中找到最优解,即节点最少的路径并且成功达到测试目标的点,与之相反则为最差的解[11]。为了让算法接近真实蚁群,加入信息素的消散因子ρ(0 <ρ<1)。本实验将根据测试是否达到目标点来更新信息素。当完成一次测试更新信息素时,所有有向边上的信息素都有一定程度挥发。对最优路径上的信息素和最差路径上的信息素进行奖励和惩罚,即增加最优路径上边的信息素,减少最差路径上边的信息素[12],公式如下:
式(3)中,(1-ρ)代表信息素剩余调整程度值,代表第k 只蚂蚁完成本轮走访后在控件i和j间分泌出的信息素增量,Δτij表示所有蚂蚁完成本轮走访分泌在控件i和j之间的信息素浓度,τreward和τpunish分别表示对最优路径奖励的信息素量和对最差路径惩罚的信息素量。
2 自动化测试方案设计
2.1 自动化测试预处理方案
深度优先搜索算法在自动化测试中得到广泛应用,文献[13-14]使用DFS 算法作为测试策略。为了保证测试的覆盖率以及效率,本文采用DFS 算法进行预处理,对移动端的UI 控件树深度遍历所有节点,获取测试路径上所有控件的节点信息,并初步根据控件属性、测试要求等预处理控件节点[15];同时,针对Android 端和iOS 端APP 大量采用相同图标的情况,利用Airtest 框架的图像识别技术对界面进行监控,判断是否到达测试点,以进一步提高代码的覆盖率和脚本的兼容性。
自动化测试需要尽量避免回溯,因为回溯会导致无效的状态转移,使测试过程重复操作效率变低;另一方面是进入一个曾经探索过的状态,而该状态需要进行回溯[16]。
在移动端自动化测试中回溯需将应用的状态从根节点执行到需要回溯到的目标节点,该过程十分耗时,所以在测试过程中应尽量避免低效的回溯。针对此类问题,采用DFS 算法获取控件节点,然后检测驱动事件的冗余状态。图1 为微信的控件截图,其中TextView“新的朋友”和ImageView 图片在触发点击事件之后,所引发的测试状态变化是相同的,为避免造成回溯需对其进行优化,合并造成冗余状态的控件。对于此类驱动事件图标和文字都是同一个控件节点的子节点,如上述两个控件都属于TableView-Cell 控件,并且该图标和文字节点为叶子节点,定义当某个控件节点下方包含一个图标和文字节点为叶子节点时,选择该控件节点为测试点节点,不再分开点击。
Table 1 Test results of three tested programs表1 3 个被测程序实验结果
Fig.1 WeChat TableViewCell control图1 微信TableViewCell 控件
2.2 自动化测试平台
随着智能手机的普及,出现了一批优秀的开源自动化测试工具[17],如Android 集成测试框架Robotium,支持Andriod 系统下的移动端和网页;Uiautomator 是谷歌推出的一款由Java 编写的UI 测试框架,同样仅支持Andriod 系统,在Web 端测试时受限于位置坐标的点击;AirtestIDE 是一个跨平台的UI 自动化测试编辑器,支持Andirod、iOS、Web,运行在Windows 和MacOS 上,支持自动化脚本录制、一键回放、报告查看等功能。
通过对比,在综合考虑平台兼容性、脚本语言适应性后,可知Airtest 平台是相对综合性较好的一款自动化测试软件。Airtest 平台主要涉及的框架有Poco、Airtest 等框架。Poco 是一个基于UI 控件搜索的跨引擎自动化测试框架,支持主流游戏引擎如Cocos2d-x、Unity3d、安卓原生应用。Poco 可以准确定位到当前游戏画面上的元素位置,还能获取该按钮名称、坐标等详细信息。Airtest 是一个基于图像搜索的自动化测试框架,可通过图像识别对界面上的UI 控件进行定位操作[18]。
2.3 移动端连接测试平台
Airtest 平台连接IOS 设备,需要在移动端创建一个WebDirver 服务器[19],如图2 所示。
Fig.2 IOS operation program图2 IOS 操作程序
WebDirver 用于远程操控IOS 设备,定位UI 元素,移动设备端通过注入bootstrap.sh 进行监听,bootstrap.sh 将执行结果返回给AirtestIDE Server,AirtestIDE Server 再将结果返回给AirtestIDE Client。
连接安卓设备,如图3 所示。
AirtestIDE 还可直接使用USB 通过ADB()对手机进行控制。Android 端测试流程:AirtestIDE 把收到的请求转发给手机上的Bootstrap jar,Bootstrap 负责监听AirtestIDE 命令并在手机上实现操作,最后Bootstrap 将执行结果返回给AirtestIDE。
Fig.3 Andriod operation program图3 Andriod 操作流程
3 自动化测试方案实现
基于全路径的最优规划算法分为两个阶段:①采用DFS 算法为蚁群算法进行预处理;②优化蚁群算法生成测试用例。
3.1 自动化测试预处理
(1)通过DFS 算法遍历界面图层获取所有控件信息,保存在txt 文档中。图4 为DFS 算法获取的某功能界面UI 列表,每个控件都包含相应的信息。
Fig.4 List of interfaces obtained through DFS图4 通过DFS 获取的界面列表
(2)根据方案优化合并冗余控件。
(3)测试者根据测试要求判断节点重要性,对测试节点进行筛选,删除无效节点,标记有效控件。在生成测试用例前,在节点间留下信息素,解决蚁群算法在前期没有足够信息素收敛过慢的问题。
(4)将预处理后的控件信息保存到txt 文档中。
3.2 测试用例步骤生成
图5 为蚁群算法生成测试用例流程。
生成测试用例流程如下:①设置起始点并开始遍历;②获取保存在txt 文档中的控件信息,对无效的节点标记;获取标记的主要控件,为其添加信息素,解决遍历初期信息素不足问题;③更新信息素表;④计算转移概率并遍历,当遍历到无效控件时跳过该控件;普通控件按照公式计算概率并选择遍历;⑤判断是否到达测试点,若到达测试点则执行步骤⑥;若没有到达测试点则执行步骤③;⑥保存当前路径并筛选,对最优路径奖励一部分信息素,对最差路径惩罚一部分信息素;⑦判断是否迭代完成,若迭代完成则执行步骤⑧,反之跳转至步骤③继续迭代;⑧结束并输出测试用例。
Fig.5 Process of generating test cases图5 生成测试用例流程
4 实验结果与分析
为检验本文所提的APOP 算法在自动化测试中的效果,从两个方面进行验证实验:①采用平均测试时耗验证算法在实际应用中的可行性;②通过最优路径控件曲线验证改进后的算法性能。
实验环境:2018 Macbook Pro,macOS Big Sur,2.2 GHz六核Intel Core i7,内存16 GB 2400 MHz DDR4,AirtestIDE 1.2.6。
手机端实验环境:三星S10 Andiord10.0,iPhone12 IOS14.2.1。
本自动化测试实验采用MacOS 操作系统,对iOS 以及Andiord 两个主流移动端平台的3 款APP 主要功能进行自动化测试。基本参数设置如下:迭代次数K=20,每代的蚂蚁数量为10 只,为避免随机性影响,每组测试50 次。实验开始运行前将被测移动端通过WebDirver 与电脑连接,实时投影在AirtestIDE 上,设置日志路径和格式,在电脑上运行自动化测试,根据输出的日志来搜集UI 控件信息。
某组登录模块的最优控件数量收敛曲线如图6 所示,设置成功登录之后的界面为测试目标,最优控件数量为达到测试目的最少控件数量,分别使用普通蚁群算法和APOP 算法。
从图6 可以看出,传统蚁群算法所需遍历的控件太多且迭代慢,测试结果大部分在迭代20 次之后也没有得出最优测试路线,而APOP 算法在保证不减少测试控件覆盖率的情况下经过预处理后,控件数量大幅减少,且算法可以在前期快速收敛并获得最优路径。
Fig.6 The log-in module automatically tests the optimal control quantity curve图6 登录模块自动化测试最优控件数量曲线
实验结果如表1 所示。
上述测试时耗、控件覆盖率、脚本重复率等都是十分重要的指标。定义脚本重复率如下:
其中,Irepeat为测试iOS 版本的测试脚本和Andiord 版本的代码重复数量,Atestcount为安卓版本的自动化测试代码总数,Rcover越大表示在测试iOS 和Android 同一款APP 时脚本改动越小。
上述测试用例均在相同的网络环境下进行。将3 组不同的APP 进行实验,每组别之间界面功能都有差异,根据实验结果可知自动化测试点击一个控件并不像人为手动点击那样迅速,整个测试流程有识别控件、点击和回溯等,且整个生成测试路径过程是一个树状形式,在测试过程中需要消耗的资源并不是几个控件的入口那么简单。在实验中仅进行一次登录模块测试,点击路径控件最少的框架平均测试时间都需要20s,可见,为了保证测试时间和测试控件数量,在移动端自动化测试引入智能算法优化测试路径是必不可少的。
使用基于APOP 算法对3 款APP 进行测试,从数据结果可知,平均测试时耗略大于录制回放功能,在个别组内耗时相近。但该方案在控件覆盖率上远大于基于录制回放的自动化测试,平均是其3 倍左右。脚本重复率接近100%,意味着在Android 平台和iOS 平台,测试脚本基本无需改动,多平台均可用。
5 结语
本文研究了Airtest 平台下的自动化测试,综合考虑设计了基于APOP 算法的自动化测试方案,并对这种方案进行了验证,实验结果表明在测试控件覆盖率和兼容度上均有很大提高。但在拥有更多独立控件的界面时,如何进一步优化算法以提高系统兼容性和减小空间、时间复杂度,是后续要开展的另一个重要研究课题。