ProCrawl:从多用户 Web 应用程序中挖掘测试模型

ProCrawl:从多用户 Web 应用程序中挖掘测试模型

引用

M. Schur, A. Roth, and A. Zeller, ‘ProCrawl: mining test models from multi-user web applications’, in Proceedings of the 2014 International Symposium on Software Testing and Analysis - ISSTA 2014, San Jose, CA, USA, 2014, pp. 413–416, doi: 10.1145/2610384.2628051.

摘要

现在的 Web 应用程序往往都需要很长的发布周期,因此需要进行频繁的测试。自动化测试通常需要一个行为模型:对应用程序可能处于的状态的描述、状态之间转换的描述以及预期的结果的描述。此外,还需要通过脚本将模型中的抽象动作转换为可执行的动作。但是,指定此类行为模型并手动编写脚本是一项艰巨的任务。我们提出了 ProCrawl,该工具可从多用户 Web 应用程序中自动挖掘出有限状态机并生成可执行的测试脚本。ProCrawl 通过生成、运行程序并观察应用程序用户界面上的更改来探索应用程序的行为。生成的模型可以直接用于基于模型的测试,尤其是回归测试。

1 介绍

现在的 web 应用程序更新频率非常高。为了防止更新破坏 web 应用的功能,必须进行测试。因此频繁的更新要求进行频繁的测试。自动生成测试脚本需要一个描述可能的和预期的应用程序行为的模型。但是,通常 Web 应用程序没有这样的模型,因此需要手动创建模型,这导致了测试的效率变低,并增加理解和维护应用程序的 困难程度。

规范挖掘领域旨在通过挖掘程序执行中的行为模型来促进测试。规范挖掘已被成功地用来从程序中导出公理规范,例如函数和数据常量,或者描述各个类的状态和转换的有限状态机。对于这些小规模的场景,验证规 范相当容易,因为程序代码和程序状态都是可访问的,并且可以进行符号推理和测试。

在系统级别提取模型则变得困难得多。例如,程序代码和程序状态可能无法用于分析或应用程序可能分布在多个站点上。通常,唯一可以做的假设是存在一些用户界面(UI),例如允许人机交互的 Web 界面。

2 用于 Web 应用程序的模型挖掘器

ProCrawl 是一款用于挖掘 Web 应用程序行为模型并生成可执行的测试脚本的全自动工具。之前我们已经讨论并评估了我们的方法,因此本篇文章我们主要介绍我们的工具。第 2.1 节介绍了行为模型,并介绍了 ProCrawl 实现的测试过程。模型的质量很大程度上取决于所应用的抽象机制和要执行的操作选择(在 2.2 和 2.3 节中进

行了描述)以及解决不确定性的能力(在 2.4 中进行了讨论)。

2.1 使用 ProCrawl 测试 Web 应用程序

为了挖掘用户交互的流程,ProCrawl 会通过 Web 浏览器实例化出多个被测系统的参与者。ProCrawl 是一种黑盒方法,即,它无需访问被测系统的源代码即可挖掘应用程序行为。

ProCrawl:从多用户 Web 应用程序中挖掘测试模型

Figure 1: OXID eShop 中订购过程的 ProCrawl 模型。转换定义了导致状态改变的动作以及在何种条件下启用该转换。例如,如果付款 ID 为“default”或者付款 ID 为“Cash in advance”,则启用转换(1a);如果 Paymentid 为“COD(货到付款)”,则启用转换(1b)。

ProCrawl:从多用户 Web 应用程序中挖掘测试模型

Figure 2: ProCrawl 的测试过程。(1)给定配置(2)自动探索应用程序行为(3)生成可执行的测试脚本和行为模型,并进行人工审核(4)这些测试脚本和测试模型将作为生成回归测试的标准。

通过挖掘程序获得的行为模型是一个扩展的有限状态机,其中的节点表示 Web 应用程序的抽象状态,并按 ProCrawl 挖掘到的顺序编号,而转换则表示为更改状态的一系列 UI 交互操作。例如,图 1 显示了 ProCrawl 提取的扩展有限状态机,该有限状态机对 OXID eShop(一种流行的开源电子商务平台)中的订购过程进行建模:客户可以添加商品、删除商品、选择付款方式或提交订单。零售商可以通过软件后端进行发货、取消订单或删除订单。

图 2 说明了 ProCrawl 的测试过程,其详细过程如下。

2.1.1 整体配置

为了挖掘图 1 所示的模型,ProCrawl 需要一个整体配置,其中包括:

  • 参与者:在我们的示例中,客户可以访问商店前端页面,而零售商可以访问商店的后台管理界面。
  • 由参与者执行的开始动作。
  • 每个参与者的访问范围:在我们的示例中,具体表现为访问购物车的 URL、访问客户订购历史的 URL

以及到达订单列表的一系列操作。如果未提供范围定义,则 ProCrawl 只会在执行操作之前和之后检查在浏览器中呈现的页面。

  • 一个可选的测试设置:该设置定义了被测系统的初始状态。当需要在不可逆的操作后继续挖掘时,可以通过该设置对被测系统进行初始化操作。

通过指定浏览器的类型和数量、最大点击深度、需要考虑或忽略的 HTML 元素,可以为每个参与者调整默认配置。抽象状态可以通过 DOM 筛选器来进行更改,并且测试脚本可以在行为挖掘期间检查被测系统中存在的错误。

2.1.2 自动化的行为挖掘

ProCrawl 的挖掘过程完全自动化,无需用户干预。ProCrawl 可以为实际的 Web 应用程序挖掘行为模型,可以实时观察挖掘过程:对于每个参与者,启动一个或多个 Web 浏览器,并在其中执行 UI 交互。当 ProCrawl 检测到新的转换时,执行的操作将作为 Selenium 脚本导出。导出的脚本可以使用 Selenium IDE 执行。挖掘获得的行为模型以 GraphML 格式导出,可以在图形编辑器中显示(参见图 1)。另外,ProCrawl 还将以文本的格式导出状态,以便可以使用文本比较工具比较它们。

2.1.3 模型验证

ProCrawl 通过观察 Web 应用程序的行为来挖掘模型。此模型将作为自动生成可执行系统测试的标准。自动生成的测试可以检测回归,从而消除从应用程序的一个版本到另一个版本的行为。但是,在没有配置测试的情况 下,ProCrawl 不知道观察到的行为是否正确。因此,在将该模型用于回归测试之前必须对其进行验证。

2.1.4 回归测试生成

ProCrawl 挖掘的行为模型可以直接用于回归测试,通过自动生成的 Selenium 脚本执行该测试。测试失败可能意味着被测系统的行为被改变或者 UI 界面发生了改变。在这种情况下,必须手动重新生成或更新脚本。在我们对三个实际 Web 应用程序的评估中,生成的测试不仅检测到了行为的改变,也检测到了 UI 界面的改变。

2.2 状态和事件抽象

Web 应用程序通常将不同的功能分离到不同的视图中。为了提取描述被测系统业务逻辑的模型,ProCrawl 对可见的 UI 元素进行抽象,从而其识别相似的状态。如果没有适当的抽象,UI 中每个元素的更改都会导致不同的状态。

2.2.1 状态抽象

ProCrawl 假设被测系统的当前状态全部反映在 UI 中,其中每个参与者和每个视图的关系都暴露了应用程序状态的特定部分。ProCrawl 使用抽象函数对文档对象模型(DOM)进行抽象,从而区分被测系统的不同状态。具体的 DOM 状态通过特定的 UI 元素进行区分。通过这种方式,ProCrawl 可以确定应用程序状态,而无需访问被测系统的源代码。ProCrawl 并行访问这些视图,提取 DOM 并通过过滤器来计算其状态。在默认配置中,ProCrawl 将从 DOM 中提取可见的超链接、按钮和文本进行抽象。但是,可以通过提供 XPath 表达式或 CSS 选择器来更改提取的元素类型。

2.2.2 行为抽象

ProCrawl 将那些不会改变被测系统状态的操作归类为导航。这些操作只适用于被测系统的特定界面,因此在整个应用程序生命周期中都是不稳定的。但是,由于操作集合通常跨越多个视图,因此 ProCrawl 需要执行导航操作才能激活相应的 HTML 元素。ProCrawl 通过引入两个抽象层来解决此问题:独立于导航动作的模型层以及将导航操作绑定到特定行为的可执行脚本。通过这种方法,当被测系统的 UI 发生更改时,只需要更新脚本中的导航操作,模型层本身不需要改变。

2.3 因果驱动的行为挖掘

ProCrawl:从多用户 Web 应用程序中挖掘测试模型

2.4 转换保护条件

通过上述过程,ProCrawl 已经可以导出合适的行为模型。但是有时提取的状态机是不确定的,因为仅部分系统状态反映在 UI 中,虽然这很正常,但不确定的转换会在测试生成期间导致问题。例如,在图 1 中选择“货到付款”作为付款方式时会增加附加费。订购后,所选付款方式不再反映在用户界面中。从购物车中删除产品 或删除订单后,将商品重新添加到购物车中,会记住之前的付款方式,从而导致错误。如果在执行操作后未能 在模型中很好地定义被测系统的状态,则基于模型的测试通常会失败。因此,ProCrawl 希望通过在行为探索过程中推断扩展状态的互斥保护条件来解决不确定性问题。

只有在保护条件为真时,才能启用转换。例如,仅当选择了货到付款作为付款方式时,才启用添加到购物车的转换。非确定性转换将使用推断的保护条件进行注释,从而生成扩展的有限状态机。ProCrawl 通过在非确定性转换的路径上创建分类问题来推断这些保护条件,然后迭代生成用于决策树分类器学习的样本,然后将 其转换为图 1 所示的保护条件。

3 实现

ProCrawl 使用 Java 实现,使用 Selenium 进行 Web 端的自动化操作。为了构建用于推断转换保护条件的分类器,我们使用了 Weka 提供的 C.4.5 算法的一种变体来实现。为了增加用于构建分类器的样本数量,我们使用 ProB 模型检查器生成具有未经测试的输入值的路径。

4 相关工作

目前,已有多种方法可以将程序行为捕获为事件的执行顺序,其中大多数方法都是对象级别的。ProCrawl 与他们的主要区别是通过生成挖掘程序学习应用程序的行为,而大多数方法都依赖于一组给定的程序。

ProCrawl 与 Crawljax 类似,Crawljax 是针对 AJAX 网站的最先进的网络爬虫。Crawljax 提取的状态流图描述了 AJAX 站点内的各种导航路径和 UI/DOM 状态。状态流图中的节点元素表示 AJAX 站点的单个

DOM 状态,而转换表示为单个 UI 事件。但是,将抽象状态限制为单个用户的单个 DOM 状态,会限制搜寻器能检测到的操作数,从而限制基于模型的测试。在 ProCrawl 挖掘到的模型中,一个节点表示为多个用户的多个抽象 DOM 状态,并且转换表示为生成的脚本,这些脚本封装了 UI 特定的导航路径和行为。此外, ProCrawl 还通过推断输入数据的转换保护条件,消除转换的不确定性。

5 结论

ProCrawl 是一种用于挖掘行为模型的全自动工具,该模型包括来自多用户 Web 应用程序的用于回归测试和系统验证的可执行测试脚本。模型中的抽象状态非常具体,可以捕获必要的过程步骤,同时,其通用性又足以 适用于各种 Web 应用程序。

致谢

本文由南京大学软件学院 2020 级硕士张松涛转述

感谢国家重点研发计划(2018YFB1003900)和国家自然科学基金(61832009,61932012)支持!


分享到:


相關文章: