迭代式安卓自动化测试系统

198 阅读8分钟

一. 项目意义

随着移动应用开发周期的不断缩短,如何为移动应用的质量保障提升效率成为一大难题。UI 测试作为安卓测试中极为重要的一环,提升其效率意味着节省下大量的成本。一方面,部分公司开始使用众包,将测试任务派发给志愿者进行人工测试以节约成本。然而,志愿者往往只是提交与 BUG 相关的文字报告,同样有价值的完整的“用户操作流程”这一过程本身,通常会被忽视。另一方面,一部分研究者意图开发自动化测试工具以减少人力资源与时间资源的消耗。但是,由于工具缺少人类拥有的测试知识,且拥有众多的局限性,它们的实际效果仍然无法赶超人工测试。

将人类包含的相关知识,与自动化工具相结合,成为一种全新的提升工具效果的方式。但是,这一方向还未得到重点关注。目前的相关研究,仍需测试者专门投入精力编写配置文件,以引入相关的测试知识。这与人工测试类似,会增加大量的成本。如若能够全自动的收集人类对于应用的专业知识,并引入到自动化工具中,会在节省资源的基础上使自动化工具的实用性大大增加。

二.项目内容

本文设计与实现了一种迭代式安卓应用自动化测试系统,对测试用户的用户操作流程进行自动化的提取与融合,并输入到测试工具中,在复用用户相关知识的基础上,增强工具的测试效

主要包含内外两种迭代式循环,以及四个模块。系统的迭代方式,其一是流程上的迭代:测试用户进行操作所产生的用户操作流程可以令工具理解待测应用的结构,从而增强测试工具的覆盖率。而测试工具在测试的过程中,会记录下自身操作的具体信息,并展示给测试用户,令用户了解到应用目前的覆盖状态,从而使自身新一轮的手动操作更加具有目的性。用户生成的全新操作流程被迭代式的用于下一轮测试,从而使得应用覆盖率呈螺旋式上升,最终达到测试需求;其二是运行中的迭代:与常规自动化测试工具的一次性测试流程不同,本系统的自动化测试流程会通过多次对应用进行重置来进行迭代式的应用遍历,从而保证已被发现的控件不会由于测试工具的种种缺陷,而在测试过程中缺失被覆盖的机会。而四个模块,则在这两个迭代式循环中被逐一使用。

流程获取模块,用于在后台静默收集测试者的主动操作流程。本模块的最大作用,在于无声收集用户操作,并通过用户操作分析出待测应用的模型。用户在使用本系统支持的工具对待测应用进行操作时,系统会自动记录下用户操作过程中,每一步所对应的被操作控件所处的页面的状态、操作本身的信息、被操作控件的信息,并将这些信息整合成自动化测试模块所需的操作流文件进行上传存储。这些文件可以被直接转化为待测应用建模的一部分,当系统执行自动化测试时,通过拼装建模,可以获得待测应用已经被测试过的部分。而这些信息可以令自动化测试工具了解待测应用的结构,从而覆盖到更多页面。

Appium 管理模块,用于对连接系统的移动设备进行统一化初始配置。本系统所使用的自动化测试工具,完全基于 Appium 完成,而测试场景通常为多设备场景。在多设备环境运行时,系统需要对每一款连接迭代式自动化测试服务器且被选中的设备进行区分,这通常需要依靠每台设备自带的设备序号来完成。同时,由于 Appium 服务端在每一个计算机虚拟端口上,只能和一台设备进行连接,因此,我们需要一个管理模块来专门管理每一台安卓设备所对应的 Appium 的建立、维护与关闭。同时,一些在各个流程中都需要用到的工具类,也被放置在此模块中(如格式化输出类、固定地址存取类等),便于进行统一管理。

自动化测试模块,用于执行迭代式自动化测试流程。当测试用户于 web 端提出自动化测试申请时,本系统读取待测应用现存的模型信息,生成一颗应用控件模型覆盖树-1,帮助自动化测试工具理解待测应用框架。工具会首先对应用进行一次自动化测试,记录下所有的测试流程,并同样生成一颗应用控件模型覆盖树-2。这两棵树会在系统内部进行对比,并查询出应用模型中还未被覆盖到的控件。此时,系统会根据覆盖树复现用户操作,使应用到达未被覆盖的控件处,接着再次将操作权返还给自动化测试逻辑。在经过多轮迭代后,应用已知模型已经被全部覆盖的情况下,系统认为本次自动化测试结束,将全程记录下的测试流程进行整合,生成更加新的模型,并上传至数据库中进行存储。

操作流建模模块,用于管理与操作流相关的一切信息。在本系统中,所有信息的基础就是用户操作流,用户的操作被记录后,会生成操作流文件,这些文件可以转化为待测应用的覆盖模型。而将这些模型转化为可存储的文件、将这些文件重新转换为模型进行读取、以及通过模型进行复现等等操作,都会通过本模块完成。在测试完成后,模块会输出测试结果,除了保留出现的 BUG 信息以外。

所示,还会展示测试生成的操作流信息,将测试中经历的多条操作路径进行融合去重后,最终可以生成如图所示的包含每一个操作信息的应用覆盖模型,通过对这些节点进行分析,测试者可以了解到目前的测试情况。

三.项目效益 在用户进行编程考试或练习时,后台会不断地记录下相关应用的用户操作流程信息,这些信息会不断地累计,直至测试人员针对相关应用申请自动化测试时,累计下的信息就会派上用场,帮助自动化测试工具掌握应用框架,从而提高工具的测试效果,令工具覆盖到更多的页面,以触发更多的 BUG。

为了验证系统在实际应用中的有效性,本文选取了 10 款知名移动应用与 50 份各包含 15 个点击操作(可重复)的用户操作流程开展了一场实验,获取引入用户操作流程后系统的应用覆盖率,同时与谷歌的官方测试工具 Monkey 的测试结果进行比较。实验结果如图 3 所示,其中,AC(Activity Coverage)代表待测应用的页面数量被覆盖的百分比,CC(Code Coverage)代表待测应用的代码数量被覆盖的百分比。当引入测试用户操作流程后,系统的自动化测试结果相较于未引入时得到了显著的提高,在设定测试时间为一个小时的情况下,平均代码覆盖率得到了 13.98%的提升,达到了 37.83%,这一结果超出了相同条件下,Monkey 的平均代码覆盖率 28.90%。通过对比覆盖过程中的控件信息,我们发现,引入用户操作流程后的测试结果完全包含了测试用户与工具单独测试时覆盖的控件,没有产生覆盖遗漏。在此基础上,工具拓展了原先的测试结果,发现了更多的控件,这证明了本系统的可用性,说明本系统能有效增强正常的自动化测试逻辑,使测试用户有更大的机会发现待测应用中的缺陷。

致谢

本文由南京大学软件学院智能软件工程实验室 2018 级硕士生徐悠然撰写。