tag 标签: 安卓测试

相关博文
  • 热度 5
    2021-1-29 16:10
    3870 次阅读|
    3 个评论
    移动应用程序在我们的日常生活中起着重要作用,同时仍然要保证其正确性仍然是一个挑战。基于模型的系统方法已应用于 Android GUI 测试。但是,由于模型不精确和可伸缩性差等限制,与随机方法相比,它们没有显示出明显的优势。 在本文中,我们提出了 Q-testing,这是一种基于强化学习的方法,该方法得益于 Android 应用程序的自动测试和基于随机的基于模型的方法。Q-testing 以好奇心驱动的策略探索 Android 应用程序,该策略利用内存集来记录先前访问过的状态的一部分,并引导测试实现不熟悉的功能。状态比较模块是一种由大量收集的样本训练而成的神经网络,可以新颖地用于按功能方案的粒度划分不同的状态。它可以确定 Q 测试中的强化学习奖励,并有助于好奇心驱动的策略有效地探索不同的功能。我们在 50 个开源应用程序上进行了实验,其中在代码覆盖率和故障检测方面,Q-testing 优于最新水平和实践水平的 Android GUI 测试工具。到目前为止,已经确认了 22 个报告的故障,其中 7 个已得到修复。 1.引言 移动设备和应用的激增对我们的日常生活产生了巨大影响。统计资料显示,普通用户每天在移动应用上花费 2 个小时以上。但是,由于可能发生的事件和过渡的组合空间很大,因此要保证应用的质量仍然是一个挑战。日常使用的应用程序通常包含大量接口和可执行事件,这使得探索其所有状态非常耗时,更不用说只能在特定条件下才能访问的特定功能。不同的策略已应用于 Android 应用程序的自动化测试,不幸的是,这些策略仍需要改进。 随机策略生成伪随机事件来对应用程序进行模糊测试。Monkey 是实践状态测试工具,是该策略的典型示例。尽管在实际开发中被广泛采用,但是它的缺点还是很明显的。Monkey 通常会产生无效的事件,例如单击屏幕的非交互区域,该区域不会更改当前状态。而且,测试是不平衡的,可能永远也不会探索某些难以达到的功能。 基于模型的策略根据使用静态或动态方法构造的应用程序模型生成测试用例。在这种情况下,高质量的模型对于获得良好的测试结果至关重要。但是,如上所述,探索 Android 应用程序的所有状态是一项挑战。而且,几乎不可能对应用程序的行为进行精确建模。例如,欢迎界面在当今的应用程序中很常见,只有在首次打开应用程序时才会出现。这些信息通常无法捕获,从而使生成的事件序列始终在欢迎界面中包含事件,这与应用程序的实际行为不一致,并且极大地影响了测试的有效性。 系统策略使用复杂的技术(例如符号执行)为目标应用程序行为提供特定的输入。这些策略的主要目的是揭示难以用其他策略执行的典型功能,但是它们的可伸缩性较弱,并且在诸如代码覆盖率和漏洞披露之类的总体测试指标中通常表现较差。 机器学习技术也开始在 Android GUI 测试中找到应用。最近,一些研究者利用强化学习,特别是 Q 学习,可以从随机和基于模型的方法中受益,以指导测试进度。记录每个事件的值的 Q 表以及 Q 值的传播属性可以部分代替模型,以轻松方式存储测试相关信息。它还有助于避免模型和应用实际行为之间的不一致问题,这是随机测试的优势。但是,现有作品并未完全释放 Android 测试中的强化学习能力。以奖励给予过程为例,奖励过程是加强学习的关键。先前的工作倾向于计算两个状态(执行事件之前和之后的状态)之间的差异,以确定奖励。如果两个状态截然不同,则测试工具将不断给予丰厚的回报,即使它们已经被过度探索,也会导致它们之间频繁跳转。尽管某些奖励计算功能考虑了执行频率,但是当大多数事件执行了几次后,问题再次出现。 为了解决上述挑战并释放机器学习在 Android GUI 测试中的潜力,我们提出了一种基于强化学习的新颖方法 Q 测试。Q 测试的策略称为“好奇心驱动的探索”,将测试引向对其感到好奇的状态。更准确地说,Q-testing 维护着一个集合,该集合充当内存来记录先前访问过的状态的一部分。 根据当前状态与内存中记录的差异来计算强化学习奖励。与先前的工作不同,好奇心驱动的探索是一种动态适应性策略。适应性的意思是,它可以发现状态重要性的变化,并将针对特定事件不断调整奖励。 为了提高测试效率,我们新颖地提出了一种神经网络,以功能场景的粒度划分不同的状态。Q 测试使用此模块比较状态并计算奖励。在它的帮助下,Q-testing 将优先尝试覆盖不同的功能,这有助于合理地分配有限的测试时间,并在短时间内导致代码覆盖率的快速增长。 我们收集了超过 6k 的样本来训练模型,不仅可以用于强化学习,还可以从状态压缩和代码推荐等其他任务中受益。Q 测试还涉及专门针对 Android 应用程序设计的测试策略。我们以某种方式解决 RecyclerView 和 ListView,以免在不必要的测试中浪费时间。我们还考虑了系统级事件,它有助于 Q 测试发现一些复杂的错误。 2.基于 Q-learning 的安卓测试 Android 测试任务可以看作是马尔可夫决策过程,它可以使强化学习发挥作用。我们基于 Q 学习设计探索策略,以指导测试工具实现未公开和不熟悉的功能。 2.1 方法概述 Q 测试的工作流程如图 2 所示。与 MDP 的过程类似,Q 测试在测试过程中与外部环境,被测应用程序(AUT)交互。在每个周期中,Q 测试首先使用 UIAutomator 观察应用程序的当前状态。 然后将状态 St 与先前观察到的状态的一部分进行比较。状态存储在缓冲区中,其作用类似于 Q 测试的内存。 经过训练的神经网络可以提取状态特征并进行比较。 如果状态 St 与内存中的任何状态相似,则比较器将给予少量奖励。否则,模块将给予较大奖励,并且状态 St 将添加到内存缓冲区。奖励用于更新状态动作对的值 所有状态动作对的值都存储在 Q 表中,并更新它们的值。每次达到新状态时,Q 测试都会将相关的状态动作对添加到 Q 表中,并使用鼓励执行新事件的巨大价值。在更新 Q 值后,Q 测试将从 St 的 GUI 层次结构推断可执行事件,并参考 Q 表选择一个事件。在大多数情况下,将选择具有最高值的事件。执行完后,AUT 将响应并开始另一个周期。 2.2 MDP 形式化安卓测试 在我们的方法中,Android GUI 测试问题在数学上被形式化为 MDP,该 MDP 可以用 4 个元组 定义。我们如何为 Android GUI 测试任务定义 S,A,P 和 R,将影响测试的有效性和效率。 2.3 探索策略 在强化学习任务中研究了好奇心,鼓励智能体探索外部环境,以解决奖励稀疏的问题。Q 测试提出的好奇心驱动策略可以指导测试工具探索不熟悉的状态,从而覆盖代码并高效地发现错误。 3.场景划分模块 我们提出了一个粗粒度的新状态比较标准,并确定了好奇心驱动的探索策略中的回报。 该模块能够确定两个状态是否在同一功能方案中。比较模块确定的奖励将指导 Q 测试首先涵盖不同的功能场景。 粗粒度状态划分有助于防止 Q 测试从一开始就陷入几种相同的情况,从而合理地分配有限的测试时间。由于不同的场景通常绑定到不同的代码,因此这也将在短时间内导致较高的代码覆盖率。更具体地说,在第一次达到功能场景时,可能会覆盖大量代码(例如,用于初始化布局和交互事件的代码),这由 Android 框架的 GUI 驱动功能决定。 4.评估 我们主要评估两个部分:(1)场景划分模块的能力;(2)整个测试工具能够自动覆盖代码并触发错误的能力。我们的目标是在评估中回答以下研究问题: RQ1:方案部。Q 测试能够有效地确定不同的功能方案吗? RQ2:代码覆盖率。在代码覆盖率方面,Q 测试如何与最新测试工具和实践测试工具进行比较? RQ3:故障启示。在故障揭示方面,Q 测试如何与最新的和实践的测试工具进行比较? 5.总结 在本文中,我们提出了 Q-testing,一种基于 Q 学习的 Android 自动化测试方法。Q 测试利用 Q 表作为轻量级模型,同时通过好奇心驱动的策略探索不熟悉的功能。为了有效地确定 Q 学习的奖励并进一步指导探索,提出了使用神经网络区分功能情景的情景划分模块。 实验表明,在代码覆盖和故障检测方面,Q-testing 优于最新和实践中的 Android GUI 测试工具。