LAND:适用于 Android 应用的用户友好且可自定义的测试生成工具

LAND:适用于 Android 应用的用户友好且可自定义的测试生成工具

摘要:

基于模型的 GUI 探索技术被广泛用于为事件驱动程序(例如 Android 应用)生成测试用例。这些技术在用户交互过程中遍历屏幕元素,并同时构建 GUI 模型。尽管有许多基于模型的自动探索工具,但是与模型重用相比,大多数工具更关注探索过程。本文介绍了 LAND,这是一种基于 Android 应用的 GUI 探索的有效且用户友好的测试生成工具,它构建了精心设计的窗口转换模型“ LATTE”,该模型考虑了更多 Android 特定特性,并通过重用该模型提供了可定制的测试生成界面。我们在 20 个真实的 Android 应用程序上进行了实验,以构建其模型和测试用例。实验结果表明,LAND 可以实现更高的代码覆盖率并以较短的序列触发异常。还证明了 LATTE 在生成测试套件的不同要求下可以很好地重用。可以在以下网站上找到我们工具的演示视频:https://www.youtube.com/watch?v=iqtr12eiJ_0

关键词:Android GUI 模型; 有针对性的测试生成; 动态建模

1. 引言

测试用例是测试领域中必不可少的元素。对于事件驱动程序,例如 Android 应用程序,测试用例是无限长度的事件序列,由任意顺序的事件(例如点击、滚动、输入)组成。 Android 应用程序可以视为小部件的集合,每个小部件都在 Android 系统提供的与用户交互的 Activity 类中定义。小部件上的用户操作将触发相应的事件,并驱动该应用程序从一个窗口转移到另一个窗口。 GUI 测试的主要挑战在于如何生成有效的测试用例,以实现更高的代码覆盖率和更强的故障检测能力。为了实现这一目标,GUI 探索技术,特别是基于模型的 GUI 探索技术,以动态信息获取和事件选择而被广泛采用。

近年来,已经提出了几种基于模型的 Android 应用 GUI 探索方法[5-7]。他们中的大多数专注于在探索过程中生成测试用例,而忽略了对生成的模型进行进一步测试的重用。模型构建的系统探索过程通常很耗时。然而,所获得的模型很少或仅用于生成小型测试套件,导致测试能力的浪费和测试生成效率的降低。

因此,我们提出了 LAND(一种适用于 Android 应用程序的用户友好且可自定义的测试生成工具),以提高基于模型的 GUI 测试的效率。我们的工具可以在没有被测应用程序(AUT)源代码的情况下使用。它在探索过程中构造了设计的模型,可以重复使用以满足不同的测试要求。为了设计精致的 AUT 模型,需要考虑更多 Android 特定的特性,例如后堆栈[1],Activity 启动模式以及动态窗口小部件状态信息。除了 GUI 信息之外,我们还通过标签机制将此模型中的转换链接到相应的已执行代码段。 此外,提出了一种名为“状态相似性”的度量,以平衡分析期间的准确性和成本。 最后,用户可以在测试生成的多种需求下使用构建的模型,包括活动导向、小部件导向、标签导向、图形遍历和记录和重放。 生成的测试用例采用可运行、可读和可编辑的测试脚本的形式。

2. LAND

在本节中,我们介绍工具 LAND 的系统架构和使用的技术。

2.1 系统总览

LAND 将 Android 应用程序作为输入,并输出构建的 LATTE 模型以及生成的测试用例。 图 1 概述了 LAND,它包含四个模块:预处理,GUI 探索,测试生成和报告生成。

l 预处理模块在 Dalvik 字节码上对 AUT 进行检测,以进行目标标记和覆盖范围计算,并且它将根据 AUT 的功能自动生成探测配置文件。

l GUI 探索模块在执行三个子模块的循环中迭代更新构造的 LATTE 模型,包括事件选择和触发(事件执行器),信息监视(监视器)以及状态抽象和模型构造(模型构造器)。

l 测试生成模块可以利用 LATTE 中的嵌入式信息,重用已构建的模型来生成满足多个需求的测试用例。

l 报告生成模块提供了详细的代码覆盖范围和崩溃报告,以进行相应的探索。

LAND:适用于 Android 应用的用户友好且可自定义的测试生成工具

2.2 GUI 探索

我们的 GUI 探索方法将已检测的 Android apk 文件及其配置文件作为输入,并输出相应的 LATTE 模型。 LATTE 是一个窗口过渡图,它根据小部件和后堆栈将每个活动划分为一个或多个状态,并记录窗口之间的过渡信息。 LATTE 模型的详细信息可以从我们以前的工作中获得[9]。这种方法的基本工作流程是 GUI 探索和模型构建的自动迭代操作。

我们用空状态和空过渡集初始化 LATTE 模型。事件执行器自动执行的第一个事件是应用程序启动,此后,应用程序将被驱动到其第一个状态(通常与 MainActivity 相对应)。在事件执行期间,子模块 Monitor 将通过 Robotium[4]脚本记录 GUI 窗口小部件信息,并获取要执行的事件列表。我们还通过 Android Debug Bridge 获取了与仪器相关的日志。然后,模型构造器将使用收集的信息来更新模型。为了避免探究太多状态并获得可接受的模型大小,我们定义了一个度量标准来度量两个状态的相似性。如果两个状态的相似度大于预定义的阈值,则将合并这两个状态。除了程序包,活动和基本窗口小部件信息外,还根据窗口小部件状态和反向堆栈来衡量状态相似性。之后,根据当前模型,将使用深度优先搜索(DFS)或广度优先搜索(BFS)遍历策略来选择第一个未访问状态,即仍包含未访问事件的第一个状态。该状态下的第一个未访问事件(根据布局)将是下一个要执行的事件。触发新事件后,该应用可能会被驱动到新窗口,然后我们重复上述过程,直到遍历所有事件。

2.3 测试生成

探索之后,可以使用构建的 LATTE 模型来生成几种类型的测试用例,以进行进一步的测试。 对于一个应用程序,LAND 可以构建 LATTE 模型并提供五种策略来生成不同的测试用例,包括活动导向、组件导向、标签导向、图遍历以及记录与回放。

活动导向。 如果测试目标是特定活动,则 LAND 将使用相应的活动名称来检索 LATTE 模型中的状态,并返回一组测试用例以达到这些状态。 生成的测试用例以 Robotium 可运行脚本的形式出现,如图 2 所示。

LAND:适用于 Android 应用的用户友好且可自定义的测试生成工具

组件导向。 当需要对一种类型的组件(例如按钮)进行全面测试时,LAND 在 LATTE 模型中检索这些组件,并生成测试用例以达到要求。 对于特定类型的组件,例如 EditText,它接受用户的字符串输入,LAND 将到达这些组件,然后基于黑盒(例如边界值分析)和具有某些用户特定特征的模糊测试技术生成各种字符串(例如星号)进行彻底测试。

标签导向。 在实践中,测试人员通常会更加注意代码的某些特定部分,例如与他们要分析的功能相关的方法。 要将代码信息嵌入到我们的模型中,我们引入了一个标签集。通常,集合中的每个元素都对应一个代码段。例如,我们可以将每个标签设置为代表应用程序的不同方法(方法标签)、类中的所有方法(类标签)或带有特定关键字的指令(关键字标签)。标签和代码段的映射规则是根据实际测试或分析要求设计的。使用映射规则,我们的方法通过代码检测来实现标记过程。例如,关键字标签 Camera 表示所有包含关键字“ Camera”的代码指令,例如,代码指令 Landroid / hardware / Camera;-> open(。

对于标签定向测试生成,我们提取出标签集合与目标标签集合的交集非空的过渡集合,然后在 LATTE 模型上利用几种图形算法来提取状态和过渡之间的依赖关系,最后,我们尝试找到一些启发式的事件序列来覆盖这些过渡。

图遍历以及记录与回放:LAND 还提供了另外两种针对整个应用程序生成测试用例的策略:对于图遍历生成,LAND 将遍历 LATTE 模型以生成可以覆盖所有过渡的测试用例。对于记录与回放策略,将记录在 GUI 探索期间执行的所有操作并将其传输到一组测试脚本以进行回放。

2.4 用法

在本节中,我们将介绍如何使用 LAND 构造 LATTE 模型并为 Android 应用生成测试用例。 LAND 中的主要配置项目如图 3 所示。

LAND:适用于 Android 应用的用户友好且可自定义的测试生成工具

启动 LAND 时,用户首先选择要测试的 apk。 然后 LAND 通过反编译和检测将其重新打包为新的 apk 文件 apk1。 使用 Robotium 实现的自动探索脚本也将打包为 apk 文件 apk2。 单击“安装”按钮后,apk1 和 apk2 都将安装在设备(或仿真器)上。 然后,用户可以通过单击“开始探索”来开始探索。 用户可以使用一组可编辑的项目来配置仪器和勘探程序。 在浏览过程中,当前模型将转换为点格式,并使用软件 graphviz 可视化,该软件将实时显示在窗口上。

LAND:适用于 Android 应用的用户友好且可自定义的测试生成工具

完成后,用户可以获得覆盖率报告和崩溃报告。 图 4 以不同的粒度显示了一份覆盖率报告,包括应用程序级别、程序包级别和类级别。 应用执行期间涵盖的方法以绿色标记,未发现的方法以红色标记。 它还显示一个崩溃报告,其中包含异常的名称和相应的脚本。 对于 LATTE 模型中的每个状态,LAND 将记录一个屏幕截图,以便测试人员可以直观地查看和理解模型。

最后,测试人员可以生成定制的测试用例以满足他们的需求。 也可以通过单击标签为“ Run Testcase”的按钮来执行这些生成的测试用例。

3. 评估

为了评估我们工具的有效性,我们收集了 20 个现实应用程序来构建 LATTE 模型并为其生成测试用例。 在这些应用程序中,有十个是从 F-droid [2]下载的开源程序,其余的是从商业市场下载的(没有源代码)。 由于篇幅所限,我们仅显示这些应用程序的摘要信息。 它们的大小从 0.14MB 到 14.86MB 不等,其功能也各不相同(例如浏览器,媒体和财务)。 类和方法的最大数量分别为 3752 和 25461。 我们所有的实验都是在具有 1.82GHz CPU 和 3GB RAM 的移动智能手机上进行的。

3.1 代码覆盖率

AUT 的代码覆盖率被视为重要的测量指标,并且可以通过分析基本字节代码信息和运行时执行的代码信息来计算。为了评估我们方法的有效性,我们选择了两个流行的自动测试工具 Monkey[3]和 Dynodroid[8]以及两个著名的基于模型的遍历工具 A3E[6]和 PUMA[7]进行比较。

在探索期间,某些工具无法报告某些实例的测试结果。如图 5 所示,我们给出了可以在基准测试中成功执行的应用程序的数量。 对于 Dynodroid,它无法浏览不受支持的应用程序或应用程序版本不一致(无法在 SDK 2.3 上执行)。 对于 PUMA 而言,一方面,某些应用程序不受支持,这导致该工具在运行时引发异常。另一方面,启动时间太短会导致某些商业应用程序的模型错误并导致覆盖率低。

LAND:适用于 Android 应用的用户友好且可自定义的测试生成工具

LAND:适用于 Android 应用的用户友好且可自定义的测试生成工具

图 6 显示了有关类和方法覆盖结果的详细信息。 LAND、Monkey 和 A3E 在所有 20 种应用程序中均能很好地工作,其中 A3E 在测试某些商业应用程序时可能会停在第一个窗口,因此覆盖率较低。 在 LAND 的探索中,我们采用两种遍历算法 DFS 和 BFS。 结果表明,LAND 可以应用于更多应用,并且在大多数情况下可以达到更高的覆盖率。

我们还记录了 Monkey、Dynodroid 和 LAND 检测到的异常数,分别为 14、5 和 22。 结果表明,与我们的基准下的其他 GUI 遍历工具相比,更高的覆盖率有助于 LAND 查找更多的崩溃。 我们还发现,由 LAND 生成的触发异常的事件序列的平均长度小于 10,这意味着我们可以使用较短的事件序列来触发异常。

3.2 目标定向测试生成

首先,我们使用组件定向测试生成来测试 EditText 组件。 通过测试,我们观察到某些应用程序会因抛出异常而崩溃,例如,当输入字符串太大而无法转换为数字时,app Budget 将引发 NumberFormatException,而当输入文本为以“ *”开头的正则表达式时,app aGrep 将引发 PatternSyntaxException。 此外,某些应用程序显示不友好的界面,包括空的项目名称、混乱的字符串显示以及字体大小设置异常导致的空白窗口。 其中一些异常显示如图 7 所示。

LAND:适用于 Android 应用的用户友好且可自定义的测试生成工具

然后,我们使用标签指导的测试生成,以使用随机选择的标签测试与标签相关的过渡。 在 LAND 和 Monkey 之间进行了实验,以比较它们覆盖给定目标所需的最小序列长度。 为了获得 Monkey 的最小序列长度,我们实现了一个脚本来重复运行 Monkey,并在每次迭代中将事件限制增加 1000,直到覆盖给定的目标为止。 结果表明,LAND 和 Monkey 均可触发覆盖所有标签的所有过渡。 但是,由 LAND 生成的覆盖所有标签的测试用例的平均长度为 5,而 Monkey 的数量为 11000,这表明使用 LATTE 可以为用户指定的测试生成有效而紧凑的测试用例。

4. 结论

本文介绍了一种适用于 Android 应用程序的用户友好的测试生成工具,该工具考虑了更多 Android 特定的特征,构建了精心设计的 LATTE 模型,并且可以针对用户自定义的测试生成进行配置。 将来,我们将通过断言工具支持非崩溃故障检测,从而丰富 LATTE 模型并增强方法。

致谢

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


分享到:


相關文章: