与GPT-3对话进行零尝试人类化移动自动化GUI测试
摘要:
移动应用在人们的日常生活中变得不可或缺,而自动化图形用户界面(Graphical User Interface,GUI)测试广泛用于应用程序质量保证。对于自动化GUI测试,越来越多的人对使用基于学习的技术产生了兴趣,这旨在生成类似人类的操作和交互。然而,低测试覆盖率、弱泛化能力以及对训练数据的严重依赖等限制,迫切需要一种更有效的方法来生成类似人类的操作,以彻底测试移动应用程序。受到大型语言模型(LLM),如GPT-3和ChatGPT,在自然语言理解和问答方面的成功启发,我们将移动GUI测试问题形式化为一个问答任务。我们提出了GPTDroid,通过将GUI页面信息传递给LLM,要求LLM与移动应用程序进行交互,以引出测试脚本,并执行这些脚本以将应用程序的反馈传递给LLM,并迭代整个过程。在其中,我们提取GUI页面的静态上下文和迭代测试过程的动态上下文,为输入这些信息到LLM设计提示,并开发了一个神经匹配网络,将LLM的输出解码为可执行的应用程序步骤。我们对来自Google Play的86个应用程序进行了GPTDroid的评估,其活动覆盖率为71%,比最佳基准线高出32%,并且可以以更快的速度检测出36%更多的错误,超过了最佳基准线。GPTDroid还在Google Play上检测到了48个新错误,其中25个已被确认/修复。我们进一步总结了GPTDroid在优越性能背后的功能,包括语义文本输入、复合动作、长时间的有意义的测试跟踪以及测试用例优先级排序。
自动化图形用户界面测试:
利用软件工具和脚本自动执行应用程序的用户界面测试。在GUI测试中,测试工具模拟用户在应用程序的界面上执行各种操作,如点击按钮、输入文本、选择选项等,并检查应用程序的响应是否符合预期。
自动化GUI测试的目的是提高软件测试的效率和准确性。相较于手动测试,自动化GUI测试可以在较短的时间内执行大量测试用例,并且可以重复执行相同的测试流程,从而帮助发现潜在的错误和缺陷。自动化GUI测试也可以在不同的平台和设备上进行,确保应用程序在不同环境下的兼容性。
为了实现自动化GUI测试,需要使用特定的测试工具和编写测试脚本。测试脚本定义了测试用例和预期结果,测试工具负责模拟用户操作并比对实际结果与预期结果。
一、简介
1.研究价值
移动应用越来越受欢迎,随着移动应用在我们的日常生活中变得越来越重要,对于应用程序开发者来说,确保其应用具有高质量并按照用户期望的方式运行变得越来越关键。为了避免耗时费力的手动测试,自动化图形用户界面(Graphical User Interface,GUI)测试广泛用于移动应用的质量保证 [62–64, 96, 97, 101],即通过基于程序分析执行不同的动作(例如滚动、点击)来动态探索移动应用,以验证其功能。
2.存在的困难
现有的GUI测试工具,例如基于概率或基于模型的工具 [50, 78, 85],在测试实际商业应用时存在测试覆盖率较低的问题,这意味着它们可能会错过重要的错误和问题。这是因为现代移动应用的复杂性和动态性 [31, 36, 50, 72, 77, 78],可能具有数百甚至数千个不同的屏幕,每个屏幕都有其独特的交互和可能的用户操作和逻辑。此外,这些方法生成的测试输入与真实用户的交互轨迹显著不同 [73],导致测试覆盖率较低。
测试覆盖率较低:
测试覆盖率较低指的是在软件测试中,测试用例对于覆盖应用程序的所有可能情况和代码路径的能力较差。换句话说,测试覆盖率较低意味着测试用例未能涵盖应用程序中的所有功能和可能的输入组合,从而导致一些潜在的错误和缺陷未被发现
3.前人的探索:
1)做法
为了解决这些限制,越来越多的人开始对使用深度学习(DL)[35, 54, 98, 100] 和强化学习(RL)[29, 61, 71, 76] 方法进行自动化移动GUI测试感兴趣。通过学习来自人工测试人员的行为,这些方法旨在生成类似人类的操作和交互,从而更全面有效地测试应用程序的GUI。
2)存在的问题
然而,这些基于DL和RL的GUI测试方法仍然存在一些限制。
<1>首先,学习算法需要大量数据,而真实用户的交互数据很难收集。
<2>其次,学习算法是根据训练数据进行学习和预测的,因此可能不太适用于新的、未知的情况,因为应用程序不断演变和更新。
<3>第三,移动应用可能是非确定性的,这意味着每次执行一个动作时,其结果可能不是相同的(例如,从包含最后一个内容的列表中点击“删除”按钮会产生一个空列表,其中删除按钮不再起作用),这使得RL算法难以学习并做出准确的预测。
因此,急需另一种更有效的方法来生成类似人类的操作,以彻底测试移动应用。
4.本文的想法
1)采用大语言模型原因
<1>大型语言模型近年来在自然语言理解、逻辑推理和问题回答等方面表现出了令人期待的性能。例如,GPT-3 [19](Generative Pre-trained Transformer-3)是OpenAI的一个具有1750亿参数的LLM,它在包括现有测试脚本和错误报告在内的大规模数据集上进行训练,使其能够在广泛的主题和领域中理解和生成文本。
<2>ChatGPT1基于GPT-3的成功表明,大型语言模型(LLM)可以理解人类知识并与人类交互,就像一个知识渊博的专家。
大型语言模型:
大型语言模型(Large Language Model,LLM)是一种使用深度学习技术训练的强大的自然语言处理模型。这些模型使用了大规模的数据集和深层神经网络,具有数以亿计的参数,以实现对自然语言的理解、生成和推理。LLM通常采用预训练-微调的方法。首先,在大规模文本数据上进行预训练,模型通过阅读大量的文本数据来学习语言的统计规律和语义表示。然后,通过微调(fine-tuning)过程,将模型在特定任务或领域上进行进一步训练,使其适应特定的自然语言处理任务,如文本分类、问答、对话生成等。
一些著名的大型语言模型包括:
GPT-3(Generative Pre-trained Transformer-3):由OpenAI开发的大型语言模型,具有1750亿个参数,能够在各种自然语言处理任务上表现出色。
BERT(Bidirectional Encoder Representations from Transformers):由Google开发的模型,采用Transformer架构,具有1.1亿个参数,在自然语言处理任务中取得了显著的成果。
XLNet:由Google Brain团队提出的模型,结合了Transformer的优势和自回归语言模型的优势,在自然语言处理任务中取得了很好的效果。
这些大型语言模型已经在自然语言理解、问答系统、文本生成等各种自然语言处理任务上展现出了惊人的性能,对于推动自然语言处理领域的发展产生了深远的影响。同时,这些模型的训练需要大量的计算资源和数据,因此对于普通用户来说并不易于训练和使用,但它们的开源版本和API使得更多的人可以受益于它们的强大能力。
(图片转自转自Chatting with GPT-3 for Zero-Shot Human-Like Mobile Automated GUI Testing)
2)方法
受到ChatGPT2的启发,我们将图形用户界面(GUI)测试问题形式化为一个问答(Q&A)任务,即要求LLM扮演一个人类测试员的角色来测试目标应用程序。
具体而言,我们提出了一种新的方法,GPTDroid,通过将GUI页面信息传递给LLM,要求LLM与移动应用程序进行交互,以引出测试脚本,并执行这些脚本以将应用程序的反馈传递给LLM,并迭代整个过程。
为了将应用程序GUI的视觉信息转换为相应的自然语言描述,我们首先通过对目标应用程序和视图层次文件进行反编译,以及迭代测试过程的动态上下文信息,提取应用程序和GUI页面的语义信息。类似于盲人通过屏幕阅读器与移动应用程序进行交互[10, 13],我们设计了语言模式,用于生成描述当前GUI页面的提示作为LLM的输入,这为LLM与应用程序进行交互提供了途径。给定LLM的自然语言答案描述,我们通过开发一个神经匹配网络模型将其解码为可执行的步骤,以执行目标应用程序。
ChatGPT2:
ChatGPT2是基于OpenAI的GPT-2模型的对话生成版本。GPT-2是一种大型语言模型,具有数十亿个参数,是GPT-1的进一步改进和扩展。与GPT-1相比,GPT-2具有更大的规模,更多的参数,因此在自然语言理解和生成方面表现更出色。采用了Transformer架构,该架构是一种基于注意力机制的深度学习模型,特别适用于处理序列数据,如文本。它可以通过阅读大规模文本数据来学习语言的统计规律和语义表示,并能够生成连贯且语义合理的文本。GPT-2的预训练过程采用了无监督学习的方式,即在大量未标记的文本数据上进行预训练,学习对输入文本进行建模和生成输出文本。
ChatGPT2是基于GPT-2的对话生成模型。它通过与用户进行交互,实现了对话式的自然语言生成。用户可以向ChatGPT2提出问题或输入对话内容,然后ChatGPT2会根据其预训练的知识和语言模型来生成回复。因为GPT-2预训练过程中接触了大量的对话和文本数据,它能够生成更加流畅和连贯的对话,并且可以理解更复杂的语境和上下文。
ChatGPT2在自然语言处理任务中具有广泛的应用,例如:对话系统、智能客服、问答系统等。它为人机交互提供了一种自然且有效的方式,使得用户可以与计算机进行更自然的交流和对话。同时,ChatGPT2也具有一定的可控性,可以通过调整其生成文本的温度和top-k值来控制其生成回复的多样性和创造性。
3)对比传统方法
与上述传统的基于学习的算法相比,我们的方法以LLM作为零尝试测试者,不需要任何训练数据或相应的计算资源来训练模型。一个示例的对话日志如图1所示。LLM能够理解应用程序GUI,并提供详细的操作步骤以导航应用程序(例如,图1中的A1-A5)。为了弥补其错误的预测(图1中的A2),我们的方法通过实时反馈指导它重新生成输入,直到触发有效的页面跳转。即使在长时间的测试跟踪之后,它仍保持清晰的测试逻辑,以进行复杂的行为推理(图1中的A3、A4),并且它可以优先测试重要的功能(例如,图1中的A5)。我们在第6节中对我们的方法的能力和背后的原因进行了更详细的分析。
零尝试测试者:
零尝试测试者(Zero-Shot Tester)是指在测试过程中不需要事先训练或使用训练数据的测试方法或模型。这意味着零尝试测试者能够在没有事先见过或学习过相关信息的情况下,直接应用于新的测试任务或目标,而不需要进行额外的训练或适应。
4)测试评价
为了评估GPTDroid的有效性,我们对Google Play上86个流行的Android应用进行了实验,涉及129个错误。与9个常用和最先进的基线方法相比,GPTDroid的活动覆盖率比最佳基线提高了32%以上,达到了71%的活动覆盖率。由于GPTDroid可以涵盖更多的活动,该方法可以比最佳基线更快地检测出36%的错误。除了GPTDroid的准确性,我们还通过在Google Play上检测未见过的崩溃错误来评估GPTDroid的实用性。在216个应用程序中,我们发现了48个崩溃错误,其中25个已被开发人员确认并修复,而其余错误仍在等待处理。为了揭示我们的方法表现出色的原因,我们进一步对实验结果进行了定性分析,并在讨论中总结了4个发现,包括语义文本输入、复合动作、长时间有意义的测试跟踪和测试用例优先级排序。
5)总结
本文的贡献如下:
视野:首次将自动化GUI测试问题形式化为一个问答任务,并将LLM引入GUI测试领域。
技术:提出了一种新的方法GPTDroid,基于LLM的“预训练、提示和预测”范式,通过理解GUI语义信息和迭代测试过程的动态上下文,自动推断可能的操作步骤。
评估:在实际应用程序中对GPTDroid的有效性和实用性进行了评估,检测到了存在的实际错误。
洞察:在讨论中进行了详细的定性分析,揭示LLM能够为应用程序测试生成类似人类的操作的原因。
二、背景
2.1 Android GUI 和 GUI 事件
对于移动应用程序,用户界面(UI)是人机交互发生的地方。应用程序开发者设计UI来帮助用户了解其应用的功能,并且用户通过UI与应用程序进行交互。为了帮助开发者灵活地操作视图,Android软件开发工具包(SDK)[2]允许开发者在Android源代码中使用View和ViewGroup对象构建UI。View对象通常被称为“小部件”(例如ImageView、TextView),而ViewGroup对象通常被称为“布局”,提供各种布局结构(例如LinearLayout、RelativeLayout)。Android源代码中的每个小部件和布局都有其特定的属性,用于设置其边界、可点击性和引用外部资源等。在运行过程中,开发者可以通过Android Debug Bridge(ADB)命令的“uiautomator dump”来获取当前UI页面(屏幕截图)对应的视图层次文件[2]。视图层次文件包括小部件信息(坐标信息、ID、小部件类型、文本描述等)以及当前UI页面的布局信息[11],这些信息可以被自动化GUI测试工具用于获取小部件的信息。
图形用户界面(GUI)是大多数移动应用最重要的UI类型,应用程序在屏幕上呈现内容和可操作的小部件,用户通过点击、滑动和文本输入等操作(GUI事件)与小部件进行交互。在使用应用程序的过程中,用户经常需要进行复杂的GUI事件,例如填写多个文本输入小部件、向左滑动小部件进行操作以及长按小部件进行删除等。
Android Debug Bridge:
Android Debug Bridge(ADB)是用于与Android设备进行通信和调试的命令行工具。它是Android软件开发工具包(SDK)的一部分,开发者可以使用ADB来执行多种操作,包括应用程序的安装、卸载、调试、文件传输等。
2.2 大型语言模型和提示
1)大型语言模型
预训练的大型语言模型(LLMs)在许多自然语言处理(NLP)任务中表现出了高效性。它是在超大规模语料库上进行训练的,并能够理解输入提示(带有前置指令或几个示例的句子),并生成合理的文本。当在来自互联网的数十亿样本上进行预训练时,最近的LLM(例如GPT-3 [19]、PaLM [27]和OPT [102])编码了足够的信息来支持许多NLP任务[60, 80, 99]。GPT-3 [19]是最受欢迎和最强大的LLM之一,在许多文本生成任务中表现出色。它基于Transformer模型[87],包括输入嵌入层、掩码多自注意力、规范化层和图2中的前馈层。给定一个句子,输入嵌入层通过词嵌入对其进行编码。多自注意力层用于将整个高维空间划分为几个不同的子空间,以计算相似性。规范化层通过规范化步骤实现,固定每一层输入的均值和方差。前馈层将前面层提取的数据编译成最终输出。
(图片转自转自Chatting with GPT-3 for Zero-Shot Human-Like Mobile Automated GUI Testing)
2)提示工程
最近,提示工程被提出来弥合预训练和下游任务之间的差距。与为每个下游任务设计新的训练目标不同,提示工程通过添加自然语言指令(例如“This is XX app, On its xxx page, it has xxx. What to do next?”)来重新编写输入,从而重用下游任务的掩码目标。具体来说,一种常用的提示工程方法使用提示模板𝑇𝑝𝑟𝑜𝑚𝑝𝑡 (.)将输入𝑋转换为提示输入𝑋𝑝𝑟𝑜𝑚𝑝𝑡 = 𝑇𝑝𝑟𝑜𝑚𝑝𝑡 (𝑋)。**提示模板是一个文本字符串,其中包含未填充的槽位,用于填充输入𝑋和一个问题。**对于自动化GUI测试的测试脚本生成,填充的输入𝑋是页面的GUI信息,LLM试图生成要执行的操作步骤。尽管在各种NLP任务中取得了有希望的结果,标准提示对于自动化GUI测试是无效的,因为LLM无法理解GUI页面的视觉信息或应用程序的源代码。因此,本文着重于如何描述GUI页面信息,以使LLM能够更好地理解,并如何将LLM的反馈解码为可操作的操作步骤以执行应用程序。
三、方法
总述:
我们将GUI测试建模为一个问题和回答(Q&A)问题,即让LLM扮演人类测试者的角色,并实现LLM与正在测试的应用之间的交互。
为了实现这一点,我们提出了GPTDroid:
如图3所示。它提取当前GUI页面的静态和动态上下文,将它们编码为LLM的提示问题,将LLM的反馈答案解码为可执行的操作脚本以执行应用程序,并进行迭代整个过程。借助大规模训练语料库学习到的知识,GPTDroid能够引导测试探索更多样化的页面,执行更复杂的操作,覆盖更有意义的操作序列。
具体而言,在测试的每个迭代中,GPTDroid首先获取移动应用程序的视图层次文件,并提取静态上下文,包括应用程序信息、当前GUI页面的信息以及页面中每个小部件的详细信息。它还维护一个测试操作记忆器,并从中提取最新的动态信息以指示当前的测试进度。基于这些上下文信息,我们设计了生成提示的语言模式作为LLM的输入,并且LLM会输出自然语言描述的操作步骤。然后,我们设计了一个自然匹配网络,将操作步骤与应用程序的GUI事件(即小部件)进行匹配,使其能够自动执行这些操作。
1 上下文提取
尽管LLM在各种任务上表现出色,但其性能受到其输入质量的显著影响,即输入是否能准确描述需要询问的内容[26, 55, 104]。在此交互式移动GUI测试的场景中,我们需要准确描述当前正在测试的GUI页面以及更微观的角度下其包含的小部件信息,以及更宏观角度下的应用程序信息。此外,为了像人类测试者一样行动,GPTDroid还应该捕获当前的测试进度,以便从更全局的视角推荐测试操作,可能覆盖更多的活动并避免重复探索。本节描述将提取哪些信息,并将其组织成静态上下文和动态上下文,以方便阅读。第3.2节将描述我们如何将这些信息组织成LLM能够更好理解的样式。
(图片转自转自Chatting with GPT-3 for Zero-Shot Human-Like Mobile Automated GUI Testing)
1) 静态上下文提取
静态上下文涉及应用程序的信息,当前正在测试的GUI页面的信息以及页面上所有小部件的信息。应用程序信息是从AndroidMaincast.xml文件中提取的,而其他两种类型的信息是从视图层次结构文件中提取的,该文件可通过UIAutomator[86]获得。表1总结了它们的内容。
应用程序信息:
提供了正在测试的应用程序的宏观级别语义,有助于LLM对应用程序的功能有一个整体的认识。提取的信息包括应用程序的名称和其所有活动的名称。
页面GUI信息:
提供了在交互过程中正在测试的当前页面的语义,有助于LLM捕捉当前的快照。我们提取页面的活动名称,由“text”字段或“resource-id”字段(按顺序选择第一个非空字段)表示的所有小部件以及页面的小部件位置。关于位置,受到屏幕阅读器[83, 88, 103]的启发,我们首先按从上到下、从左到右的顺序获得每个小部件的坐标,并将纵坐标在页面中间下方的小部件标记为“下部”,其余标记为“上部”。
小部件信息表示GUI页面的微观级别语义,即所有小部件的内在含义,有助于LLM提供与这些小部件相关的可操作的操作步骤。提取的信息包括“text”、“hinttext”和“resource-id”字段(按顺序选择第一个非空字段)、“class”字段和“clickable”字段。我们还提取附近小部件的信息,以提供更全面的视角,其中包括父节点小部件和同级节点小部件的“text”。
宏观级别语义:
宏观级别语义是指对整体、总体或全局范围的语义理解和认知。在上下文中,它涉及对应用程序功能和结构的整体认识,以及系统中各个组成部分之间的关系和交互。宏观级别语义通常用于描述较高层次的抽象概念和主要功能,以帮助人们获得对整个系统的整体了解。在移动应用程序的上下文中,宏观级别语义可能包括应用程序的名称、主要功能和导航结构等。对于自动化GUI测试来说,宏观级别语义有助于指导测试算法在整个应用程序中更全面地执行操作,从而覆盖更多的功能和功能组合。
2) 动态上下文提取
动态上下文涉及详细的测试进度,有助于LLM充分了解过程上下文并做出明智的决策。我们设计了一个操作记忆器来记录此信息,即GUI页面是否被探索过以及小部件是否被操作过,如表1所示。具体而言,在迭代过程中,当进行操作时,我们可以获取操作的小部件信息以及操作后的GUI页面信息,然后相应地更新操作记忆器。详细地说,通过“text”字段和小部件的“resource-id”字段在操作记忆器中找到相同的小部件,更新小部件的访问次数。通过使用页面的“ActivityName”字段在记忆器中找到相同的活动,更新页面的访问次数。
2 提示生成
通过提取的信息,我们设计语言模式来生成输入到LLM的提示。
首先,我们对提取的信息进行预处理,以便后续设计。对于表1中的每个静态属性,我们使用下划线和驼峰命名法(例如每个单词的首字母大写)对其进行分词,考虑到应用程序开发中的命名约定,并删除停用词以减少噪音。然后,我们使用Standford NLP解析器[30]进行词性标注,并仅保留名词、动词和介词用于语言模式。
Standford NLP解析器:
Standford NLP解析器是由斯坦福大学开发的自然语言处理工具包,用于对文本进行语言学分析和处理。它提供了一系列功能,包括分词、词性标注、命名实体识别、句法分析和语义角色标注等。通过这些功能,Stanford NLP解析器可以将文本转换成结构化的形式,从而帮助计算机理解和处理自然语言。该解析器在自然语言处理领域被广泛使用,特别是在实体识别、依存句法分析和语义角色标注等任务中表现出色。它是一个强大而灵活的工具,适用于各种自然语言处理应用和研究。
1) 提示的语言模式。
为了设计这些模式,每个作者都被要求按照常规的提示模板[21, 26, 42]编写提示句子,并向LLM提出生成操作步骤的问题。然后,他/她根据整个测试过程的情况检查推荐的操作步骤是否合理。每位作者可以从Google Play中随机选择100个应用程序,并获得预处理后的静态上下文信息和动态上下文信息。经过10小时的尝试后,他/她需要提供最有希望和多样化的20个提示句子,作为设计模式的种子。使用这些提示句子,五位作者进行卡片分类[82]和讨论,得出了语言模式。如表2所示,该过程产生了6种语言模式,分别对应表1中的四种子类型信息和两种操作和反馈模式。
(图片转自转自Chatting with GPT-3 for Zero-Shot Human-Like Mobile Automated GUI Testing)
与静态上下文相关的模式:
我们设计了三种模式,分别用于描述当前正在测试的GUI页面的概览,分别对应表1中的应用程序信息、页面GUI信息和小部件信息。
与动态上下文相关的模式:
我们设计了一种模式,用于描述具有动态上下文的测试进度,如表1所示。
与操作和反馈问题相关的模式:
我们设计了两种模式,分别用于描述操作问题和反馈问题。对于操作问题,我们询问LLM需要进行什么操作。对于反馈问题,在决定前面的操作不适用(如第3.3节所述)后,我们通知LLM当前页面上没有这样的小部件,并让它重新尝试。
2) 提示生成规则
由于设计的模式描述了不同视角的信息,我们将来自不同视角的模式组合起来生成提示规则,如表2所示。我们分别为开始测试、例行询问和错误发生时的反馈设计了三种类型的提示。需要注意的是,由于LLM的鲁棒性,生成的提示句子不必完全遵循语法。
测试提示:是最常用的提示,用于通知LLM当前状态并查询下一个操作。具体来说,我们首先告诉LLM动态上下文,即每个GUI页面和小部件已被探索的次数;然后提供静态上下文,即当前GUI页面和详细的小部件信息;然后询问LLM需要进行什么操作。
反馈提示:用于通知LLM发生错误并重新查询下一个操作。具体来说,我们首先告诉LLM其生成的操作与页面上的小部件无法对应;重新提供页面的详细小部件信息,并让LLM再次推荐操作。
除了上述两种类型的提示,我们还另外设计了开始提示,用于开始应用程序的测试。与测试提示不同,它向LLM提供了有关所有活动的应用程序的信息,以便进行全局概述;由于测试刚刚开始,它不包含动态上下文。此提示仅使用一次,因为LLM在测试过程中可以在某种程度上记住这个全局的应用程序信息[54, 84]。
3) 操作匹配
在输入生成的提示后,LLM会输出一个描述测试操作步骤的自然语言句子,例如“点击保存按钮”。我们需要将自然语言描述的操作步骤转换为应用程序的GUI事件(即小部件),以便自动执行。这是非常复杂的,因为自然语言描述可能是任意的,并且本质上是不精确的。我们设计了一个神经匹配网络来预测哪个小部件最有可能与操作步骤相对应。由于训练神经网络通常需要大量标记数据,我们开发了一种基于启发式的自动训练数据生成方法,以便在第3.3.2节中促进模型训练。
(图片转自转自Chatting with GPT-3 for Zero-Shot Human-Like Mobile Automated GUI Testing)
<1> 神经匹配网络
主要思想:
如图4所示,神经匹配网络的一个输入是LLM的反馈答案,即自然语言描述的操作步骤𝐶𝑠𝑡𝑒𝑝,而另一个输入是应用程序小部件的文本信息𝐶𝑡𝑒𝑥𝑡。我们依次选择小部件的第一个非空“text”、“ID”和“description”字段。将操作步骤𝐶𝑠𝑡𝑒𝑝和小部件的文本信息𝐶𝑡𝑒𝑥𝑡与符号连接起来,然后输入到预训练的Transformer编码器中,生成文本的隐藏状态。最后,将文本的隐藏状态输入到全连接层,得到反馈答案和小部件之间的匹配得分。
具体细节:
在迭代测试过程中,每当LLM提供反馈答案时,GPTDroid会首先将答案按“and”、“,”、“.”分开,以得到原子操作步骤,考虑到LLM可能推荐复合操作。然后对于每个原子操作步骤,我们计算它与当前GUI页面中所有候选小部件的匹配得分,并选择匹配得分最高的小部件作为目标小部件。然后使用Table 1中的WidgetAction属性对目标小部件执行操作,以执行应用程序。此外,如果所有小部件的匹配得分都小于0.5,则确定页面上没有满足条件的小部件。这意味着LLM的反馈答案出现错误,并将在下一次迭代中激活反馈提示。
<2>基于启发式的训练数据生成
背景:
训练这样一个神经匹配网络需要大量带有自然语言描述的操作步骤和GUI事件的标记数据,例如“按下返回按钮”和对应的事件“点击返回按钮”在应用程序中。然而,目前没有这样的公开数据集,并且从头开始收集这些数据非常耗时且费力。与此同时,通过检查LLM输出的操作步骤,我们观察到它们往往遵循某些语言模式。这激发我们开发了一种基于启发式的自动训练数据生成方法,以便收集满足训练数据的正负样本。
主要思想:
对于每个GUI页面中的交互式小部件,我们启发式地生成可以对其进行操作以转换到下一个状态的操作步骤;同时,生成操作步骤与不相关小部件之间的负样本。为了得到启发式规则,五名作者检查了LLM输出的400个操作步骤,并总结出编写操作步骤的语言模式。我们总结了31个非重复的操作描述及其变种,例如“点击”、“输入”、“按下”等。我们将完整的表上传到我们的网站上。对于每个迭代小部件,我们随机生成三个不同的操作描述作为训练数据中的正样本。对于负样本,我们遵循硬负样本挖掘策略[58]来增强模型的可区分性。
正负样本:
在机器学习和数据挖掘领域,正负样本是用于训练和测试模型的两种不同类型的数据示例。这些样本在分类问题中起着关键的作用。
正样本:正样本是属于目标类别的数据示例。在二元分类问题中,目标类别通常是我们感兴趣的类别或我们要预测的类别。例如,在垃圾邮件分类问题中,正样本是指属于垃圾邮件类别的电子邮件。
负样本:负样本是不属于目标类别的数据示例。在二元分类问题中,负样本是除了目标类别之外的所有其他类别。在上述的垃圾邮件分类问题中,负样本是指属于非垃圾邮件类别的电子邮件。
在训练分类模型时,我们通常需要有足够的正样本和负样本来训练模型,并确保模型在测试时能够准确地区分这两类样本。通过对正样本和负样本的学习,模型能够学习目标类别的特征,从而对未知数据进行分类预测。
硬负样本挖掘策略:
硬负样本挖掘是一种在训练分类器时用于增强负样本的策略。在机器学习中,负样本通常比正样本多得多,尤其是在高度不平衡的数据集中。这可能导致分类器在处理未知数据时出现偏向,无法准确地对少数类别进行分类。硬负样本挖掘策略旨在缓解这个问题,使分类器能够更好地处理负样本。
硬负样本挖掘的主要步骤如下:<1>初始训练:首先,使用初始的正样本和负样本训练分类器。<2>预测:使用训练好的分类器对所有样本进行预测,并将预测错误的负样本标记为“硬负样本”。<3>筛选硬负样本:从预测错误的负样本中筛选出具有特定特征的硬负样本。这些特征可能包括预测概率较高、与其他类别相似或与正样本接近等。<4>添加硬负样本:将筛选出的硬负样本添加到训练集中,并重新训练分类器。<5>重复:重复上述步骤,直到达到预定的停止条件(例如,训练轮次、误差阈值或分类器性能不再改进)。
通过硬负样本挖掘策略,分类器将更多地关注难以分类的负样本,从而提高对负样本的分类准确性。这有助于平衡正负样本的训练数据,改善分类器的性能,并在不平衡数据集中更好地处理分类问题。然而,需要注意的是,过度挖掘硬负样本可能会导致过拟合,因此需要适度地应用该策略。
4 实现
GPTDroid是一个完全自动化的图形用户界面应用测试工具,使用或扩展了以下工具:VirtualBox [12]和Python库pyvbox [8]用于运行和控制Android-x86操作系统,Android UIAutomator [86]用于提取视图层次结构文件,Android Debug Bridge (ADB) [1]用于与正在测试的应用进行交互(第3.1节)。
对于LLM(第3.2节),我们使用了发布在OpenAI网站上的预训练GPT-3模型。GPT-3的基本模型是text-davinci-003,它具有极强的能力和出色的问题回答能力。我们基于PyTorch [7]和Sentence Transformers [74]构建了我们的神经匹配网络模型(第3.3节)。文本处理模块加载了DistilBert [79],这是一个基于12层transformer的预训练模型。我们使用AdamW作为优化器,BCEWithLogitsLoss作为损失函数,并将模型的批量大小设置为20。
VirtualBox:
VirtualBox是一款开源的虚拟化软件,由Oracle公司开发和维护。它允许用户在计算机上创建虚拟的虚拟机,使得用户可以在同一台计算机上同时运行多个操作系统,如Windows、Linux、macOS等,而不需要分区或使用独立的物理计算机。VirtualBox提供了一个虚拟机管理器,用户可以通过它创建、配置和管理虚拟机,还可以在虚拟机中安装和运行其他操作系统,以及测试和开发软件应用程序。
pyvbox:
pyvbox是一个Python库,用于与VirtualBox虚拟化软件进行交互。它提供了一组功能,允许用户通过Python代码来创建、配置、控制和管理VirtualBox中的虚拟机。通过pyvbox,用户可以使用Python代码创建新的虚拟机,设置虚拟机的配置选项,启动和停止虚拟机,访问虚拟机的状态信息,以及执行其他与虚拟机相关的操作。此外,pyvbox还支持对虚拟机进行快照管理,允许用户保存和还原虚拟机的快照状态。它还提供了许多其他功能,如访问虚拟机的文件系统,设置虚拟硬件设备的属性,以及与虚拟机中运行的操作系统进行交互。
使用pyvbox,用户可以在Python环境中实现对VirtualBox的自动化控制,从而更方便地管理和操作虚拟机。它适用于那些需要在VirtualBox中进行自动化任务的开发者和管理员。
Android UIAutomator:
Android UIAutomator是一个用于自动化测试Android应用程序的测试框架。它是Android Testing Support Library的一部分,由Google提供支持。Android UIAutomator允许开发人员编写测试用例,模拟用户在Android设备上的操作,例如点击、滑动、输入文本等。测试用例可以在真实的Android设备或模拟器上执行,用于验证应用程序的功能和性能。
text-davinci-003:
text-davinci-003是GPT-3模型的一个特定版本,由OpenAI发布。GPT-3是一个大型语言模型,拥有数百亿的参数,训练在包含互联网上海量文本数据的大规模语料库上。text-davinci-003是GPT-3模型中的一种配置,被称为"DaVinci",它是GPT-3中最强大和最高级的配置之一。该模型在自然语言处理任务中表现非常出色,可以进行文本生成、问答、翻译、对话等多种任务。由于text-davinci-003配置的强大性能,它通常用于需要处理复杂和大规模自然语言文本的应用,例如自然语言生成、智能问答系统等。要使用text-davinci-003模型,用户可以通过OpenAI的API接口进行调用,并将文本输入传递给模型以获取生成的文本输出。由于该配置的强大能力,调用可能需要更高的计算资源和费用,但可以获得更高质量的自然语言处理结果。
Sentence Transformers:
Sentence Transformers是一个用于生成句子向量表示的Python库。它基于预训练的Transformer模型,特别是BERT(Bidirectional Encoder Representations from Transformers),用于将文本句子编码成密集的向量表示。这个库的主要目的是生成语义丰富的句子嵌入(embeddings),可以用于多种自然语言处理任务,例如文本分类、文本相似度计算、聚类等。
AdamW:
AdamW是一种优化算法,是Adam(Adaptive Moment Estimation)算法的一种改进版本。Adam是一种自适应学习率优化算法,结合了Adagrad和RMSprop的优点。它在深度学习中广泛使用,特别是在训练神经网络时。AdamW是Adam算法的一个变种,主要是解决Adam算法在权重衰减(weight decay)方面的问题。在Adam算法中,权重衰减通常是在梯度更新步骤中应用的,但是这样会导致一些问题,特别是在模型参数稀疏性较高时,权重衰减可能会导致模型性能下降。为了解决这个问题,AdamW将权重衰减应用到权重更新步骤之前,而不是在梯度更新步骤中。这样做可以减少模型参数的衰减,从而提高模型性能。
AdamW的更新步骤如下:
计算梯度:根据当前的模型参数和损失函数计算梯度。
计算动量:根据梯度计算每个参数的动量(momentum)。
计算平方梯度:计算每个参数梯度的平方,并进行指数加权平均。
更新动量:根据平方梯度计算每个参数的更新量。
更新权重:根据动量和权重更新步骤更新每个参数的值。
通过将权重衰减应用到权重更新步骤之前,AdamW可以减少模型参数的衰减,从而避免了模型性能下降的问题。它在很多深度学习任务中表现优秀,并且被广泛应用于各种神经网络模型的训练过程中。
BCEWithLogitsLoss:
BCEWithLogitsLoss是二分类问题中常用的损失函数,用于计算二分类模型的预测值与真实标签之间的差异。BCE表示二元交叉熵(Binary Cross Entropy),Logits表示未经过sigmoid函数处理的预测结果。在二分类问题中,每个样本都有一个二元标签(0或1),而模型的预测结果是一个连续值,通常称为logits。通过将logits经过sigmoid函数处理,可以将其映射到0到1之间,从而得到一个概率值,表示模型预测为正例的概率。
BCEWithLogitsLoss的计算过程如下:
首先,对模型的预测结果(logits)应用sigmoid函数,将其映射到0到1之间的概率值。
然后,将映射后的概率值与真实标签进行比较,计算每个样本的二元交叉熵损失。
最后,将所有样本的损失进行平均,得到最终的损失值。
BCEWithLogitsLoss的优点是可以避免数值稳定性问题,同时能够更高效地计算梯度。它在训练二分类模型时非常常用,特别是在深度学习中,例如在神经网络中进行二分类任务时经常使用这个损失函数。
四、有效性评估
为了验证GPTDroid的性能,我们通过研究活动覆盖率(RQ1)和检测到的漏洞数量(RQ2)来评估它。此外,我们还在RQ3中展示了操作匹配的性能。
1. 实验设置
1)数据集
实验数据集来自两个来源:
<1>第一个来源是Themis基准中的应用程序,其中包含了在GitHub上具有34个漏洞的20个开源应用程序。考虑到基准中应用程序数量较少,
<2>从Google Play中抓取每个类别中最受欢迎的50个应用程序,并保留那些在2022年5月后至少有一个更新的应用程序,共计317个应用程序,涵盖12个Google Play类别。
2)对比测试工具
然后,我们使用9个常用的和最先进的自动化GUI测试工具(详细信息见第4.2节)依次运行这些应用程序,以确保它们正常工作。
3)筛选测试数据
然后,我们根据以下标准过滤掉不可用的应用程序:
(1)UIAutomator [86]无法获取视图层次结构文件;
(2)它们在模拟器上经常崩溃;
(3)其中一个或多个工具无法运行;
(4)无法使用脚本跳过注册和登录功能[35, 61, 85];
(5)它们在GitHub上没有问题记录或拉取请求。
经过筛选,剩下66个应用程序(包含93个漏洞)用于此次有效性评估。
(图片转自转自Chatting with GPT-3 for Zero-Shot Human-Like Mobile Automated GUI Testing)
注意:
需要注意的是,与基准相同,所有的漏洞都是崩溃漏洞。具体而言,对于每个应用程序,我们选择由开发人员确认的漏洞的版本(合并的GitHub拉取请求)作为我们的实验数据,遵循基准的做法。所有86个实验应用程序(20 + 66)及相关漏洞的详细信息显示在表3中。需要注意的是,有101个应用程序被过滤掉用于有效性评估,但它们可以成功运行我们提出的方法。我们将它们应用于第3.2.1节中的手动提示生成和第3.3.2节中的启发式训练数据生成。这确保了在方法设计和评估之间没有重叠。
我们使用活动覆盖率和检测到的漏洞数量来评估GUI测试的性能,这些都是广泛使用的评估指标[15, 43, 57]。在表4中,我们还列出了涵盖的活动和小部件的数量,这也是常用的指标[54, 71, 85]。
2 基线
为了展示GPTDroid的优势,我们将其与9个常用的和最先进的基线进行比较。我们大致将GUI测试方法分为随机/基于规则的方法、基于模型的方法和基于学习的方法,以便于理解。
对于随机/基于规则的方法,我们使用Monkey [34]和Droidbot [53]。对于基于模型的方法,我们使用Stoat [84]、Ape [41]、Fastbot [20]、ComboDroid [90]和TimeMachine [35]。对于基于学习的方法,我们使用Humanoid [54]和Q-testing [71]。
我们在一台64位的Ubuntu 18.04机器上部署了基线和我们的方法(64核、AMD 2990WX CPU和128GB RAM),并在Google Android 7.1模拟器(API级别25)上对它们进行评估。每个模拟器配置为2GB RAM、1GB SDCard、1GB内部存储和X86 ABI镜像。不同类型的外部文件(包括PNG / MP3 / PDF / TXT / DOCX)存储在SDCard上,以便应用程序可以访问这些文件。遵循常见做法[41, 53],我们为每个需要登录的漏洞注册了单独的帐户,并编写了登录脚本,在测试期间在每次运行前重置帐户数据,以避免可能的干扰。
为了确保资源的公平和合理使用,我们将每个工具在一个应用程序中的运行时间设置为30分钟,这在其他GUI测试研究中广泛使用[36, 41, 53, 85]。我们每个工具运行三次,并得到最高的性能,以减少潜在的偏差。
Monkey:
Monkey是一个在Android平台上用于自动化GUI测试的工具。它是Android SDK中自带的一种命令行工具,旨在模拟随机用户操作,如点击、滑动、按键等,以便测试和评估Android应用程序的稳定性和性能。Monkey是一个随机/基于规则的测试工具,因为它的操作是完全随机的或基于预先定义的规则进行的,而不是通过学习或模型进行操作。
Droidbot:
Droidbot是一个用于Android应用程序的自动化GUI测试和分析的工具。与Monkey类似,Droidbot也是一个随机/基于规则的测试工具,但它更加灵活和强大。Droidbot能够模拟用户的各种操作,包括点击、滑动、输入文本等,并且可以监控和收集应用程序的行为和响应。
Stoat:
Stoat是一个用于Android应用程序的GUI自动化测试工具,它属于模型驱动的测试方法。与随机/基于规则的测试工具不同,Stoat采用了模型生成的方式来自动创建和执行GUI测试。Stoat首先通过分析应用程序的源代码和界面结构,生成一个模型来表示应用程序的GUI行为和状态转换。这个模型类似于有限状态机,它描述了应用程序在不同界面之间的转换以及用户在界面上的各种操作。通过模型,Stoat能够更加准确和智能地模拟用户的操作和应用程序的行为。在测试过程中,Stoat根据生成的模型,选择合适的操作序列来执行GUI测试。它会自动导航应用程序的不同界面,并模拟用户的点击、滑动、输入等操作。同时,Stoat还能够检测应用程序的响应和错误,以便及时发现和报告问题。Stoat的一个重要特点是其对异步事件的支持。在许多应用程序中,存在一些异步事件,如网络请求、定时任务等,它们可能会导致应用程序状态的变化。Stoat能够有效地处理这些异步事件,并确保测试过程的正确性和稳定性。
Ape:
Ape是一种用于Android应用程序的自动化GUI测试工具,它是一种基于模型的测试方法。Ape利用符号执行技术来自动生成测试用例,并执行这些测试用例以探索应用程序的不同路径和状态。符号执行是一种静态分析技术,它将程序的输入符号化,以符号形式表示输入值。然后,通过符号执行引擎,Ape可以自动生成一组符号执行路径,这些路径覆盖了应用程序的不同分支和条件。然后,Ape将符号执行路径转换为具体的测试用例,并执行这些测试用例来探索应用程序的不同行为。
Fastbot:
Fastbot是一种用于Android应用程序的自动化GUI测试工具,它属于基于模型的测试方法。Fastbot通过在应用程序上执行随机的GUI事件来探索不同的应用程序状态和路径,并收集应用程序的行为信息。Fastbot使用混淆算法来随机生成GUI事件序列,这样可以有效地覆盖应用程序的不同部分。通过执行随机事件序列,Fastbot能够发现应用程序中的潜在问题和异常情况。它可以检测应用程序的崩溃、ANR(应用程序无响应)和其他错误,并生成测试报告以供开发人员分析和修复。除了随机事件序列,Fastbot还支持设置一些固定的测试用例,以测试应用程序的特定功能和功能。这样,开发人员可以针对特定的场景和功能进行更有针对性的测试。Fastbot还支持代码覆盖率分析,它可以帮助开发人员了解测试的覆盖率,从而评估测试的完整性和效果。
ComboDroid:
ComboDroid是一种用于自动化GUI测试的Android应用程序测试工具,它结合了基于模型的和学习-based 的方法。ComboDroid旨在通过模拟用户交互和使用深度学习模型来改进Android应用程序的测试效率和覆盖范围。ComboDroid首先使用基于模型的方法,类似于Monkey和Fastbot,通过执行随机的GUI事件序列来探索应用程序的不同状态和路径。然后,ComboDroid采用学习-based 的方法,使用深度学习模型来学习应用程序的行为和特征。这个深度学习模型可以从大量的应用程序行为数据中学习,并预测应用程序在不同状态下的行为。通过结合基于模型的和学习-based 的方法,ComboDroid能够更全面地测试Android应用程序,并发现更多的错误和问题。它可以帮助开发人员更好地了解应用程序的行为,找到潜在的性能问题,并提供改进和优化的建议。ComboDroid还支持代码覆盖率分析,它可以帮助开发人员评估测试的完整性和效果,并发现未被覆盖的代码区域。
TimeMachine:
TimeMachine 是一种用于自动化 GUI 测试的 Android 应用程序测试工具,它旨在通过时间逆向技术来实现对应用程序的探索和测试。TimeMachine 的关键思想是使用时间逆向技术,类似于时光倒流,来回溯应用程序的状态和行为。它通过记录应用程序在不同时间点的状态和交互信息,并在后续的测试中回放这些信息,以便重新探索和测试应用程序的各种可能性。
Humanoid:
Humanoid 是一种用于自动化 GUI 测试的 Android 应用程序测试工具,它采用了一种创新的基于人工智能的方法来测试应用程序的用户界面。Humanoid 的关键思想是使用大规模预训练的语言模型,类似于 GPT-3 或类似的模型,来理解和生成自然语言指令。在测试过程中,Humanoid会与目标应用程序进行交互,并通过自然语言指令来模拟用户的操作行为。与传统的基于脚本的自动化测试不同,Humanoid 不需要事先编写具体的测试脚本。相反,它通过与应用程序进行对话,类似于与人进行对话一样,向应用程序提出问题,并根据应用程序的反馈来生成后续的操作指令。
Q-testing:
Q-testing 是一种用于自动化 GUI 测试的方法,它使用了强化学习技术来探索和测试应用程序的用户界面。Q-testing 的核心思想是将 GUI 测试问题建模为一个强化学习问题。在测试过程中,Q-testing 代理(agent)会与应用程序进行交互,并在每个交互步骤中选择一个动作,比如点击按钮、滑动屏幕等。每个动作都对应一个状态-动作值函数(Q 函数),用于估计在当前状态下执行该动作的预期回报。Q-testing 代理通过与应用程序的交互来收集经验,并使用强化学习算法来更新 Q 函数的估计值。通过不断地学习和探索,Q-testing 代理可以找到一组最优的动作策略,用于测试应用程序的各种场景和功能。与传统的基于规则或脚本的 GUI 测试方法不同,Q-testing 不需要事先定义具体的测试用例或脚本。相反,它使用强化学习来自动学习最优的测试策略,从而提高测试的效率和覆盖率。
3 结果与分析
###1) 活动覆盖性能(RQ1)。
表4显示了GPTDroid和基线方法的覆盖小部件数量,覆盖活动数量和平均活动覆盖率。我们可以看到,GPTDroid覆盖的小部件和活动远远多于基线方法,并且在86个应用程序中平均活动覆盖率达到了71%。与最佳基线方法(TimeMachine)相比,平均活动覆盖率高出32%(0.71对0.54)。
(图片转自转自Chatting with GPT-3 for Zero-Shot Human-Like Mobile Automated GUI Testing)
这表明GPTDroid在覆盖更多活动和小部件方面的有效性,为应用程序质量带来更高的信心,并有可能发现更多的漏洞。图5另外展示了活动覆盖率随时间变化的平均值。我们可以看到,在每个时间点上,GPTDroid的活动覆盖率都高于基线方法,并且在约13分钟内实现了高覆盖率。这再次证明了GPTDroid在用更少时间覆盖更多活动方面的有效性和效率,考虑到测试预算,这是非常有价值的。在基线方法中,基于模型和基于学习的方法具有相对较高的性能。然而,基于模型的方法无法捕获GUI语义信息,而探索无法很好地理解应用程序的内在业务逻辑。此外,现有的基于学习的方法仅使用少量上下文信息来指导探索,学习器受模型架构和标记训练数据量的限制,其智能性有限。
(图片转自转自Chatting with GPT-3 for Zero-Shot Human-Like Mobile Automated GUI Testing)
我们进一步分析了未发现漏洞的原因。首先,一些小部件或输入没有有意义的“文本”或“资源ID”,这妨碍了有效理解GUI页面的方法。其次,某些应用程序需要特定操作,例如,数据库连接,长按并将小部件拖动到固定位置,这可能无法自动完成或难以实现。
2) 漏洞检测性能(RQ2)。
图6显示了GPTDroid和基线方法在不同时间内检测到的漏洞总数。GPTDroid在86个应用程序中检测到72个漏洞,比最佳基线方法(Stoat)高出36%(72对53)。我们还比较了Stoat和我们方法检测到的漏洞之间的相似性和差异,结果显示其检测到的漏洞是我们检测到的漏洞的子集。这表明GPTDroid检测漏洞的有效性,并有助于确保应用程序质量。
(图片转自转自Chatting with GPT-3 for Zero-Shot Human-Like Mobile Automated GUI Testing)
我们还可以看到,在每个时间点上,GPTDroid检测到的漏洞数量都多于基线方法,并且在约17分钟内达到最高值,与最佳基线方法相比(同时检测到更多的漏洞),节省了35%的测试时间(17对26)。这再次证明了GPTDroid的有效性和效率,为节省更多时间进行后续漏洞修复提供了帮助。关于其优越性能的原因,我们将在4.3.3节进行进一步讨论。
3 操作匹配性能(RQ3)
在RQ1中测试实验应用程序时,我们随机选择了1000个LLM的反馈答案,即LLM输出的自然语言描述的操作步骤,并评估这些操作是否能够成功匹配正确的GUI小部件。具体来说,两位作者遵循开放编码原则,分析反馈答案并在当前页面上找到匹配的小部件。对于不一致的标记,第三位作者将进行判断,直到所有作者达成一致意见。
结果显示,操作匹配能够达到0.96的准确率,说明大多数LLM的反馈答案可以准确匹配GUI小部件。这为我们的GPTDroid的高活动覆盖率奠定了坚实的基础。
五、有用性评估
1 实验设置
1)对比内容
本节进一步评估GPTDroid在检测新的崩溃漏洞方面的实用性。我们采用类似于上一节的实验设置。为简洁起见,我们只比较上一节中漏洞检测的最佳基线方法,即Droidbot、Stoat和Humanoid,每种方法中的最佳方法(随机-/规则基方法、基于模型方法和基于学习方法)。
2)具体方法
我们首先从12个类别中选择最受欢迎且最近更新的317个应用程序,与上一节相同。然后,我们重新使用上一节中的五个标准来过滤不可用的应用程序。不同的是,在本节中,我们放宽了标准5,只要应用程序有报告漏洞的方式即可,因为在本节中,不需要必须具有问题记录或拉取请求。这样得到了216个应用程序用于我们的有用性评估。值得注意的是,本节的目的是评估GPTDroid是否能够在这些应用程序上检测到新的漏洞,因此本节和上一节之间的应用程序重叠是允许的。我们使用与上一节相同的硬件和软件配置。当检测到崩溃漏洞时,我们通过在线问题报告或电子邮件将其报告给应用程序开发团队。
(图片转自转自Chatting with GPT-3 for Zero-Shot Human-Like Mobile Automated GUI Testing)
2 结果与分析
对于216个应用程序,GPTDroid检测到了135个涉及115个应用程序的漏洞,其中48个涉及39个应用程序的漏洞是新检测到的。此外,这些新的漏洞都未被三个基线方法检测到。我们向开发者提交了这48个漏洞,目前已有25个被修复或确认(8个已修复,17个已确认),而其余的漏洞仍在处理中(没有被拒绝)。这进一步说明了我们提出的GPTDroid在漏洞检测方面的有效性。由于篇幅限制,表5呈现了这些被修复/确认的漏洞,完整的列表可以在我们的网站上找到。我们进一步分析了找到的漏洞的详细信息,其中17个涉及多个文本输入或复合操作。此外,我们还观察到有11个漏洞在触发漏洞之前需要执行超过20个操作步骤,从MainActivity页面开始计算,这表明GPTDroid在测试更深层次的功能方面具有能力。此外,我们发现至少有28个漏洞与应用程序的主要业务逻辑相关,例如有一个涉及数字健康应用程序的健康数据统计漏洞被揭示出来。
六、讨论
尽管在上一节中,GPTDroid表现出了卓越的性能,但我们还不清楚背后的原因。为了全面理解LLM(大型语言模型)的测试能力,我们通过研究我们的模型优于基线模型的案例,进行了一项定性研究。
我们总结了包括低级别(例如,有效的文本输入和复合动作)和高级别(例如,长期有意义的测试轨迹和测试用例优先级)的四种能力。这些发现为该领域的进一步研究铺平了道路。
有效的文本输入
我们的方法可以自动填写有效的文本内容到输入窗口,这基本上是通过页面的关键,如图7(a)所示。更重要的是,我们的模型可以生成语义文本输入(例如,收入,日期,身份证号码,搜索项等)。除了单个文本输入,它还可以同时成功填写多个输入窗口,这些窗口彼此相关,比如航班预订应用中的出发和到达城市及日期。这可能是因为GPT-3在训练阶段就已经很好地学习了语言生成能力。
复合动作
GPTDroid可以在LLM的指导下进行复杂的复合操作。如上例(图7(a))所示,为了添加“Cable crunch”信息,它首先输入文本,选择日期,通过点击上方或下方的按钮设置“SETS”和“REPS”,然后点击右下角的提交按钮。由于网上有很多教程或错误报告包括如何通过某些动作导致特定结果的自然语言描述,这些可能被纳入GPT-3的训练语料库。这可能有助于更好地理解动作和结果之间的因果关系,从而在GUI测试中实现LLM的复合动作能力。
长期有意义的测试轨迹
GPTDroid可以自动生成一系列操作的测试用例,这些操作共同完成应用程序的业务逻辑,这对于覆盖应用程序的功能并确保其质量非常重要。如图7(b)所示,在SmartMeter应用程序[9]中,要测试常用的应用功能“删除设备”,自动化工具首先需要在设备页面上点击“查找设备”,然后选择一个设备(蓝牙已打开并有候选设备)并点击“添加设备”将其添加到设备页面;输入相关信息并点击“启动”启动设备;然后在设备页面关闭该设备,长按它并从弹出菜单中点击“删除”。只有通过这一长系列的操作触摸到“删除设备”的功能,才能揭示出崩溃。这可能是因为GPT-3接触到了教程或错误报告,其中包含了如何触发某个特性或复现某个错误的逐步指令或描述,在训练语料库中。因此,在提供了低级语义信息(即当前的GUI页面)和高级测试历史的情况下,GPTDroid可以捕获GUI页面之间的长期依赖关系,生成长期有意义的探索序列。
测试用例优先级
我们也观察到GPTDroid通常优先测试“重要”的部件,这对于达到更高的活动覆盖率和用相对较少的时间覆盖更多关键活动是有价值的。如图7(c)所示,在Moni应用程序的主页面[5],基线工具往往首先点击“设置”按钮,从上到下按照探索顺序进行,这使得测试容易陷入设置页面的循环。我们的GPTDroid选择首先测试“AddIncome”活动,即点击“添加”按钮,这基于GUI页面和应用信息的语义,并可以快速探索与应用的关键特性相关的活动。这可能是因为GPT-3的训练语料库包含了各种各样的软件相关信息,包括用户手册,发布说明,和应用/软件描述,在这里开发者通常会将最重要的特性突出在前。
七、相关工作
1.移动应用 GUI 和 GUI 分析。
GUI为应用和用户之间提供了一个可视化的桥梁,并引起了越来越多的关注[46, 69, 81]。图形用户界面(GUI)是大多数移动应用的最重要的用户界面类型,其中应用在屏幕上展示内容和可操作的小部件,用户可以通过点击、滑动和文本输入等操作与这些小部件进行交互。GUI是Android等主要平台上的软件不可或缺的一部分。分析应用的GUI对许多研究人员和实践者来说都非常有趣。相关的研究包括自动GUI搜索[17, 22, 75],GUI代码生成[23, 65, 70],GUI变化检测和总结[66, 67],GUI设计[25, 95]等。Gao等人[39]和Li等人[52]分析了UI渲染中可能存在的问题,并开发了自动检测这些问题的方法。Nayebi等人[68]和Holzinger等人[45]发现,移动设备的不同分辨率给Android应用的设计和实现带来了挑战。Huang等人[47]和Rubin等人[77]提出通过比较实际行为与UI来检测Android应用中的隐蔽行为。Chen等人[28]介绍了一种基于机器学习的方法,从UI图像中提取UI框架,以便于GUI开发。在人机交互研究中,软件GUI主要用于大规模挖掘UI设计实践[14, 51]和交互模式[32]。这些挖掘出的知识可以进一步用于指导UI和UX(用户体验)设计。由于这些挑战,如何合理地总结应用成为一个需要解决的问题。我们的关注点是使用合理的自然语言来描述应用页面的GUI信息,以便大型语言模型能够理解GUI信息。
2 自动化GUI测试
为了确保移动应用的质量,许多研究人员研究自动生成大规模测试脚本来测试应用[93]。Monkey[34]是一种流行的基于随机的自动化GUI测试工具,它发出伪随机的UI事件流和一些系统事件。它易于使用,并且与不同的Android版本兼容。然而,基于随机的测试策略不能根据应用的特性制定一个合理的测试路径,导致测试覆盖率低。为了提高测试覆盖率,研究人员提出了基于模型的[35, 64, 96, 97, 101]自动化GUI测试方法,通过研究和分析大规模应用来设计相应的模型。Sapienz[63]使用遗传算法作为模型,Stoat[84]使用从应用中学习的随机模型来优化测试套件生成。Ape[41]使用运行时信息动态演化其抽象标准通过决策树,并通过随机和贪婪的深度优先状态探索策略生成UI事件。ComboDroid[90]从人类或自动从GUI探索构建的GUI模型中获取这些用例,并分析获得的用例之间的数据流,然后组合它们生成最终的测试。虽然基于模型的自动化GUI测试工具可以提高测试覆盖率,但由于它没有考虑应用的GUI和页面的语义信息,覆盖率仍然很低。研究人员进一步提出了类似人类的测试策略,并设计了基于学习的自动化GUI测试方法。Humanoid[54]使用一个深度神经网络模型来预测当前GUI页面上哪些UI元素更可能被用户交互,以及如何与它们交互。Q-testing[71]使用了一种基于强化学习的方法来比较GUI页面并给出奖励。这些奖励被使用并迭代更新,以引导测试覆盖更多的应用功能。尽管基于学习的方法可以通过学习大量的交互过程或使用强化学习的思想来提高测试覆盖率。然而,它仍然无法更好地理解页面的语义信息,并根据应用的实际情况规划路径,而且受到训练数据的影响非常大。本研究的目标是提出一种更有效的方法来生成类似人类的动作,以彻底而更有效地测试应用,并使用LLM来实现。
遗传算法:
遗传算法是一种搜索优化算法,它受到自然选择和遗传学原理的启发,包括继承、突变、选择和重组。遗传算法常常用于求解优化问题和搜索问题。
遗传算法的主要步骤通常包括:
初始化:生成一个随机的种群,种群中的每个个体代表一个可能的问题解。
适应度函数评估:根据问题的需求定义适应度函数,用来评价种群中每个个体的优劣。
选择:根据每个个体的适应度函数值,进行选择操作。适应度值高的个体更可能被选择。
交叉(重组):选出的个体进行交叉操作,生成新的个体。这是遗传信息传递给后代的过程。
变异:对新生成的个体进行变异操作,即随机改变某些基因位点的值,以保持种群的多样性。
替换:新生成的个体替换原来种群中的部分或全部个体。
终止:达到预定的迭代次数或找到满足条件的解后停止。
通过上述步骤的不断迭代,遗传算法能找到全局最优解或接近全局最优的解。
3 大型语言模型
近期,预训练的大型语言模型(例如,RoBERTa [59],GPT-3 [19],PaLM [27],OPT [102])在各种自然语言处理任务中取得了巨大成功。由于互联网上大量可用的预训练数据,研究显示大型语言模型可以通过新的“预训练,提示和预测”范式 [56],无需对特殊数据集进行微调,就能用于非常特定的下游任务。这种针对大型语言模型的范式在许多工作中被广泛使用,并在下游任务中取得了最先进的性能 [33,48]。这个范式的核心是使用提示工程 [18,21,40,56],其中将任务的自然语言描述提供给大型语言模型。考虑到大型语言模型的强大性能,研究者尝试用大型语言模型来解决软件工程领域的相关任务。在代码自然性 [44] 的支持下,研究者将大型语言模型应用于不同编程语言的代码编写 [24,37,38,94]。黄等人 [48] 使用大型语言模型进行静态类型的部分代码的类型推断。在测试中,LLMFuzz [33] 使用大型语言模型生成用于模糊深度学习库的输入程序。夏等人 [91,92] 将大型语言模型应用于自动程序修复,以提高生成的修复补丁的准确性。奥斯汀等人 [16] 和贾因等人 [49] 用大型语言模型进行通用编程语言的程序合成。本文通过将自动GUI测试构造为大型语言模型的问答任务,为自动GUI测试开辟了新的维度。
八、总结
作为移动应用最重要的质量保证活动之一,自动化GUI测试取得了许多进展,但仍受到活动覆盖率低和可能错过关键错误的问题。本文旨在生成类人的动作,以更彻底和有效地推动应用测试。受到像ChatGPT这样的大型语言模型(LLM)的成功启发,我们将GUI测试问题构建为一个问答任务,并提出了GPTDroid。它提取当前GUI页面的静态和动态上下文,将它们编码为向LLM提出的提示问题,将LLM的反馈答案解码为可执行的操作以运行应用,并迭代整个过程。86个热门应用的结果表明,GPTDroid可以实现71%的活动覆盖率,比最好的基线高出32%,并且可以比最好的基线更快地检测出36%的错误。GPTDroid还在Google Play上检测到48个新错误,其中25个已被确认/修复,其余的仍在等待处理。GPTDroid生成语义文本输入和复合操作,引导探索长时间有效的测试痕迹,以及优先考虑测试用例的能力,进一步证明了我们提出的GPTDroid的有效性和类人的方面。
个人思考
一、个人总结
本文旨在利用大语言模型来进行GUI测试,由于大语言模型庞大的数据使得其能够进行远超我们想象的详尽测试,一方面能够解决目前现有GUI测试工具测试覆盖率较低的问题,此外基于庞大的训练数据,其能够执行更多可能的测试以发现可能存在的问题,在利用大预言模型进行GUI测试时把测试过程以对话形式进行,让GPT担任测试员的职位,通过输入内容进行输出后转换为对应操作并输入反馈进行测试,为了将应用程序GUI的视觉信息转换为相应的自然语言描述,通过对目标应用程序和视图层次文件进行反编译,以及迭代测试过程的动态上下文信息,提取应用程序和GUI页面的语义信息,通过自己设计的语言模式,用于生成描述当前GUI页面的提示作为LLM的输入,对于大预言模型的输出通过开发一个神经匹配网络模型将其解码为可执行的步骤,以执行目标应用程序进行测试。
二、思路剖析
1.首先确定现有GUI测试存在的测试覆盖率较低的问题
2.针对新出现的适用性较好的大预言模型,尝试将其融入到GUI测试中
3.为了解决大预言模型只支持文本输入的问题,对测试界面进行编码转换,同样,对输出内容进行转换后变成对应操作并进行执行,将反馈进一步传回给大语言模型
4.针对大语言模型的描述不充分的问题,开发合适的提示工程,并在不同环境下使用不同的语言模型已更好的和大语言模型进行交流沟通
5.对比过往GUI测试体现本文的优点
三、值得学习的地方
1.问题细化,对于大语言模型如何实施提示工程是一个大问题,本文不仅实现了,还细分到了不同环境,进一步增强了和大语言对话的精准性
2.通过编码、解码的形式实现了图形、步骤到文字描述的转换过程,精准了和大语言模型的对话,也解决了文字描述不充分、不精确的问题
3.在描述部件时采用了全局的概括性描述和精确描述两种分开的方式,增强了和大语言模型的沟通准确率,整体式先概括,再逐步精确化
4.针对上下文描述,分为静态、动态等以及更精细化的分类采用了不同的语言模型,使得描述更加精确
四、大胆揣测
大语言模型万物皆有可能~