Humanoid:一种基于深度学习的 Android 自动化黑盒测试方法

Humanoid:一种基于深度学习的 Android 自动化黑盒测试方法

摘要

自动化的输入生成器必须不断选择要与之交互的 UI 元素以及与之交互的方式,以便在有限的时间预算内实现较高的覆盖率。当前,大多数黑盒输入生成器都采用伪随机或蛮力搜索的策略,这可能需要很长时间才能找到正确的输入组合,从而将应用程序带入新的重要状态。我们提出了 Humanoid,这是一种基于深度学习的自动化黑盒 Android 应用测试工具。 Humanoid 的关键技术是一个深度神经网络模型,该模型可以了解人类用户如何与应用程序的 GUI 交互,从而从人类交互轨迹中选择动作。然后,可以将学习到的模型用于指导测试输入生成,以实现更高的覆盖率。通过在开源应用程序和市场应用程序上进行的实验表明,与最新的测试输入生成器相比,Humanoid 能够达到更高的覆盖范围,并且速度更快。Humanoid 在https://github.com/yzygitzh/Humanoid是开源的,演示视频可以在https://youtu.be/PDRxDrkyORs上找到。

索引词-软件测试,自动测试输入生成,图形用户界面,深度学习,移动应用程序,Android

I 简介

近年来,移动应用程序(简称应用程序)已得到广泛应用。这些应用在发布之前需要经过充分的测试。但是,由于发布周期快和人力资源有限,很难在短时间内手动构建测试用例。为此,学术界和工业界都对移动应用程序的自动测试输入生成器进行了广泛的研究。

测试输入生成器的有效性通常通过其测试覆盖率来衡量。因此,自动化测试输入生成器成功的关键是为给定的 UI(测试期间的当前 UI)选择正确的交互,以使所选的交互可能达到新的重要 UI 状态,从而在有限的时间预算内获得更高的覆盖率。因为机器很难理解 GUI 布局和 GUI 元素中的内容,所以很难确定要单击哪个按钮或应该输入什么按钮。因此,大多数现有的测试生成器均使用随机策略来决定与哪个 GUI 元素交互以及如何交互。尽管还可以进一步优化随机策略,但是它具有固有的局限性,因此很难选择一个有效的方法来查找可以在短时间内将应用程序驱动到重要状态的交互。

Humanoid:一种基于深度学习的 Android 自动化黑盒测试方法

图 1 人形机器人如何选择测试输入的说明。 左侧是 AUT 当前 UI 的屏幕截图,右侧列举了 UI 状态下最可能的交互。人型机器人根据从人机交互跟踪中学习的模型来计算每个动作的概率。 概率表示人形机器人将动作选择为测试输入的可能性。

与随机输入生成器相反,人类测试人员可以轻松识别值得与之交互的 UI 元素,即使对于他们从未见过的新应用程序也是如此。根本原因是人类测试人员本身就是应用程序用户,因此他们已经获得了有关各种移动应用程序的一些经验和知识。因此,人类测试人员知道单击何处以及要输入什么内容,以实现更高的覆盖率,并且花费的时间也更少。

基于此观察结果,我们提出了 Humanoid,这是一种自动 GUI 测试生成器,能够生成人类与移动应用程序的交互方式,然后使用学习到的模型像人类测试者一样指导测试的生成。借助从跟踪人类交互过程中获得的知识,Humanoid 可以根据其重要性和意义在 GUI 页面上对可能的交互进行优先级排序,如图 1 所示。在这种模型的指导下,相较于随机生成的输入模块,Humanoid 能够更快的生成引向重要状态的测试输入。

Humanoid 的核心是一个深度神经网络模型,该模型可以预测哪些 UI 元素更可能被人类用户与之交互以及如何与之交互。 模型的输入是当前 UI 状态以及最近的 UI 转换,而输出是 UI 页面上每个可能动作的预测概率,可用于指导测试输入生成过程。

我们实施了 Humanoid 并使用从大规模的基于人群的 UI 交互数据集 Rico 中提取的 304,976 个人交互来训练交互模型。 我们将 Humanoid 与六个最先进的测试生成器进行了比较。 用于测试的应用包括从 AndroTest 数据集获得的 68 个开源应用和从 Google Play 获得的 200 个流行应用。 结果表明,Humanoid 能够实现开源应用程序的 43.1%的行覆盖率和市场应用程序的 24.1%的活动覆盖率,明显高于其他测试生成器使用相同版本的最佳结果(38.8%和 19.7%)。

II 工具设计

Humanoid 的核心是一个交互模型,该模型学习有关人类如何与应用程序交互的模式。基于该模型,整个工作流可以分为两个阶段,其中包括一个用于通过人为生成的交互轨迹来训练模型的正式阶段和一个用于指导测试输入生成的在线阶段。

A. 训练模型

最终用户根据他们在应用程序界面(即 GUI)上看到的内容与应用程序进行互动。由于不同的应用程序通常共享相同的 UI 设计模式,因此很直观的是,人类与 GUI 的交互方式可以在不同的应用程序上进行概括。我们提出的交互模型的目标是捕获这种可概括的模式。

我们引入了一个概念 UI 上下文来建模人类与应用程序交互时引用的内容。 UI 上下文 contexti 由当前 UI 状态 si 和三个最新的 UI 转换(si-1,ai-1),(si-2,ai-2),(si-3,ai-3)组成。当前的 UI 状态表示用户在执行操作时看到的内容,而最新的 UI 转换用于在当前交互会话期间对用户的基本意图进行建模。

每个 UI 状态都表示为双通道 UI 骨架图像,其中第一个通道呈现文本 UI 元素的边界框区域,第二个通道呈现非文本 UI 元素的边界框区域。 每个动作均由其动作类型和目标位置坐标表示。动作类型被编码为七维向量,其中每个维度都映射到七种动作类型之一,如前所述。行动目标位置被编码为热图。热图中的每个像素都是该像素成为动作目标位置的概率。

因此,UI 上下文的表示,即我们的交互模型的输入,是一堆图像,包括一个用于当前 UI 状态的 2 通道图像和三个最新 UI 转换的三个 3 通道图像(每个转换包括一个 2 UI 状态的通道图像和操作的一个 1 通道图像)。 所有图像均按比例缩放为 180×320 像素。 为了便于学习,我们还为当前 UI 状态添加了一个零填充通道。最后,UI 上下文表示为 4×180×320×3 向量。

给定 UI 上下文向量,则交互模型的输出为两个条件概率分布:

1)ptype(t | contexti),表示 t 的概率分布,即下一个动作的类型,其中 t∈{touch,long touch, 向上滑动,...}。

2)ploc(x,y | contexti),表示屏幕坐标 x,y 的概率分布是下一个动作的目标,其中 0

可以通过以下方式计算对当前 UI 状态执行每个操作的概率:

Humanoid:一种基于深度学习的 Android 自动化黑盒测试方法

然后,动作概率可以用来指导测试输入的生成。

图 2 显示了用于学习上面定义的两个条件概率分布的深度神经网络模型。 它接受当前 UI 上下文 contexti 的表示作为输入,并输出 ai 的位置和类型分布。 该模型使用卷积层来捕获 GUI 视觉信息,并使用剩余的 LSTM 模块来捕获交互上下文信息。反卷积层和完全连接的层分别用于生成 ai 的位置和类型的分布。

我们用于训练交互模型的数据集是从 Rico 处理的,Rico 是一大批来自人群的人类交互数据集。 我们提取了 12278 个交互流,它们属于 10477 个应用程序,每个交互流平均包含 24.8 个动作。 在训练过程中,人类用户采取行动的概率设置为 1,而其他行动的概率设置为 0。

B. 指导测试生成

人型机器人使用 GUI 模型来保存过渡的内存。GUI 模型表示为 UI 过渡图(UTG),其节点是 UI 状态,而边是导致 UI 状态过渡的动作。

Humanoid 生成两种类型的测试输入,包括用于发现应用程序中看不见的行为的探索动作,以及将应用程序驱动到包含未探索动作的已知状态的导航动作。

在每个步骤中,Humanoid 都会检查当前状态下是否存在未开发的动作。 如果有未探索的动作,Humanoid 会选择探索,而如果当前状态已被完全探索,Humanoid 会选择导航。导航过程非常简单。在探索过程中,Humanoid 获得了交互模型预测的动作的概率,并根据概率进行加权选择。

由于将对人类采取的行动分配更高的概率,因此他们有更高的机会被 Humanoid 选择为测试输入。 因此,Humanoid 生成的输入要比随机选择的输入更像人类,这反过来将使应用更快地进入重要的 UI 状态并导致更高的测试覆盖率。

Humanoid:一种基于深度学习的 Android 自动化黑盒测试方法

图 2 Humanoid 交互模型体系结构

III 评估

我们通过使用 Humanoid 来测试两组不同的 Android 应用程序,包括从 AndroTest 获得的 68 个开源应用程序和从 Google Play 下载的 200 种流行的商业应用程序,对 Humanoid 进行了评估。 我们测量了 Humanoid 的测试覆盖率和测试进度,并将结果与六个最先进的测试工具进行了比较,包括 Monkey ,PUMA ,Stoat ,DroidMate ,Sapienz 和 DroidBot 。

我们用来进行实验的机器是一个工作站,该工作站配备两个 Intel Xeon E5-2620 CPU,64GB RAM 和一个 NVidia GeForce GTX 1080 Ti GPU。 训练交互模型大约需要 66 个小时。应用模型时,我们在计算机上运行了 4 个 Android 模拟器实例,以并行测试应用程序。

我们使用每种测试工具(具有其默认配置)在 Android 模拟器上运行固定的时间(每个开源应用程序 1 小时,每个市场应用程序 3 小时,因为市场应用程序通常更复杂)。为了适应最新的市场应用程序,大多数工具已在 Android 6.0 上进行了评估。但是,由于 Sapienz 是封闭源代码,并且仅支持 Android 4.4,因此已在 Android 4.4 上进行了评估。对于每个应用程序和工具,我们记录了执行每个操作后的最终覆盖率和渐进覆盖率。我们将这一过程重复了三遍,并以平均值作为最终结果。

在测试开源应用程序时,每个测试工具所达到的测试覆盖率几乎都在 1 小时内收敛。最终线路覆盖率的总体比较如图 3 所示。Humanoid 平均达到了 43.1%的线路覆盖率,这是所有测试输入生成器中最高的。基于对测试痕迹的手动检查,Humanoid 的高覆盖率主要是由于两个原因:首先,当有大量 UI 元素可供选择时,Humanoid 能够识别关键 UI 元素并确定其优先级。其次,Humanoid 有较高的机会执行有意义的操作序列,从而可以将应用程序带入未经开发的核心功能中。

Humanoid:一种基于深度学习的 Android 自动化黑盒测试方法

图 3 不同工具针对开源软件得到的行覆盖

有趣的是,采用了随机探索策略的 Monkey 比除 Humanoid 之外的所有其他基于模型的测试工具具有更高的覆盖率。Monkey 的性能比大多数其他测试工具都要好的事实也已被其他研究人员证实。主要原因是 Monkey 在相同的时间内可以产生比其他工具更多的输入。

我们进一步在市场应用程序上进行了实验,以了解 Humanoid 是否仍然更有效。由于源代码不适用于这些市场应用程序,因此我们无法计算线路覆盖率,因此我们改用活动覆盖率(已达成活动的百分比)。

测试工具在 3 小时内达到的最终活动覆盖率如图 4 所示。与开源应用程序相似,Humanoid 与其他工具相比也达到了最高的覆盖率(24.1%)。

图 5 显示了渐进覆盖率 w.r.t. 每个测试工具发送的输入事件数。 请注意,我们没有将 Sapienz 包括在渐进覆盖图中,因为它发送事件的速度太快,并且由于它是近源的,因此我们无法降低它的速度。在最初的几个步骤中,由于应用程序才刚刚启动且所有 UI 状态都是新的,因此所有测试工具的覆盖率迅速提高。 Humanoid 人在大约 50 个事件之后开始领先。那是因为那时已经覆盖了易于访问的代码,而其他状态则隐藏在特定的交互作用之后,而其他测试工具几乎无法产生这种交互作用。由于某些应用程序的复杂性,它们在测试结束时并未融合。但是,我们认为,即使经过更长的测试时间,Humanoid 也将保持优势。

Humanoid:一种基于深度学习的 Android 自动化黑盒测试方法

图 5 不同工具的逐步覆盖

IV 相关工作

自从移动应用盛行以来,自动 GUI 测试生成已成为一个活跃的研究领域。 大多数测试生成器采用三种策略:随机,基于模型和针对性。

使用随机策略的典型示例是 Monkey ,该示例在没有应用程序任何信息的情况下发送动作。 DynoDroid 根据 GUI 布局筛选出不可接受的事件。 Sapienz 使用遗传算法搜索可以实现更高覆盖率的测试序列。

其他几种测试工具可构建并使用该应用程序的 GUI 模型来生成测试输入。基于 GUI 模型,测试工具可以生成输入,这些输入可以将应用快速导航至未开发状态。基于模型的策略也可以优化。例如,Stoat 可以基于现有探索来迭代地完善测试策略,而 DroidMate 可以通过从其他应用程序中进行挖掘来推断 UI 元素的可接受动作。

目标策略旨在解决某些应用程序行为只能通过特定的测试输入才能揭示的问题。 这些测试工具通常使用复杂的技术,例如数据流分析和符号执行来发现可能导致目标状态的相互作用。

Humanoid 不同于这些方法,因为它利用了 GUI 视觉信息,这在人类用户或测试人员浏览应用程序时是重要的参考。

V 结论

本工具演示文章介绍了 Humanoid,这是一种适用于 Android 应用程序的新 GUI 测试生成器,能够通过深度学习生成类似于人类的测试输入。 Humanoid 采用 DNN 模型,以从大量的人为生成的交互轨迹中学习人类用户如何浏览应用程序。 实验表明,在学习的模型的指导下,Humanoid 比六个最新的测试工具能够实现更高的测试覆盖率和更快的测试范围。

致谢

本文由南京大学软件学院 16 级本科生王旭翻译转述 感谢国家重点研发计划(2018YFB1003900)和国家自然科学基金(61832009,61932012)支持!


分享到:


相關文章: