检测客户端JavaScript Web应用程序中的并发错误外文翻译资料

 2021-11-11 11:11

英语原文共 10 页

检测客户端JavaScript Web应用程序中的并发错误

摘要 - 随着Web技术的发展,动态Web应用程序的复杂性显着增加,Web应用程序因Web浏览器、用户、网络等之间的意外交互顺序而出现并发错误。 在本文中,我们介绍了WAVE(Web应用程序的虚拟环境),这是一个用于检测用JavaScript编写的客户端Web应用程序中的并发错误的测试框架。 WAVE生成各种操作序列作为Web应用程序的测试用例,并通过动态控制目标Web应用程序与执行环境的交互来执行一系列操作。 我们通过八个示例和五个真实Web应用程序的实验证明WAVE可以有效且高效的检测并发错误。

1.介绍

Web浏览器,JavaScript和客户端 - 服务器技术Web技术发展迅速,客户端动态Web应用程序(也称为Ajax应用程序)的复杂性也随之迅速增加。尽管JavaScript具有单个线程执行模型,但是用JavaScript编写的动态Web应用程序可能会因意外执行命令而产生并发错误。这是因为Web应用程序的执行涉及具有多个外部实体的操作,例如用户、网络和行为不确定的服务器。由于在不同平台(即各种网络浏览器和操作系统,具有各种网络速度)上运行的移动Web应用程序被广泛使用,这些环境的非确定性行为导致的并发错误可能对Web应用程序造成严重威胁。此外, Web应用程序的并发问题变得越来越严重,因为新的Web标准HTML5允许Web应用程序利用并发功能并通过利用多核CPU提供交互式服务。因此,开发一个可以系统地检测JavaScript应用程序中的并发错误的测试框架非常重要。

在本文中,我们介绍了WAVE(Web应用程序的虚拟环境),这是一个用于检测客户端JavaScript Web应用程序中的并发错误的测试框架。 WAVE将Web应用程序的并发执行视为一系列操作,并将各种操作序列生成为测试用例。 WAVE通过在运行时控制目标Web应用程序的虚拟环境,使Web应用程序执行生成的测试用例。此外,WAVE优先考虑测试用例,以便更快地检测并发错误。

为了证明WAVE的有效性(就检测到多少并发错误而言)和效率(就检测并发错误所花费的时间而言),我们对八个基准测试应用程序和五个真实的开源实验进行了一系列测试。在实验中,WAVE在所有八个基准测试程序中检测到并发错误,并在五个真实的Web应用程序中检测到新的并发错误(这些错误已经报告给Web应用程序的开发人员)。

本文的贡献如下:

bull;本文提出了一个JavaScript Web应用程序的正式并发执行模型,可以清楚地描述这些应用程序中的并发问题。

bull;本文提出了一种新的测试框架,通过生成和执行各种操作序列,有效且高效地检测JavaScript应用程序中的并发错误。此外,WAVE利用三种不同的测试用例优先级启发式方法来更快地检测可能的并发错误。

bull;本文介绍了针对八个基准程序和五个真实世界JavaScript Web应用程序的WAVE的实证评估。结果表明,WAVE可以快速检测各种并发错误,并且还表明WAVE能够在实际应用程序中检测到五个新的错误。

本文的其余部分安排如下。第二部分提供了有关JavaScript应用程序的背景信息,特别是有关可能的并发问题的信息。第III节描述了WAVE框架。第四节解释了实验的设置,以证明WAVE的有效性和效率,第五部分描述了实验的结果。第VI节讨论了从实验中得出的观察结果。第七节解释了相关工作,第八节总结了未来工作的论文。

2.背景

A.执行JavaScript Web应用程序

动态Web应用程序由包含HTML代码和JavaScript代码的多个Web页面组成。 一个网页可以通过iframe元素,页面中的外部脚本元素和动态脚本加载来利用多个HTML文件。 基于W3C标准规范,我们可以将Web应用程序的执行建模为一系列解析操作和事件处理操作。

图1.包含并发错误的JavaScript Web应用程序

解析操作解释HTML代码以生成相应的文档对象模型(DOM)树以构造页面的逻辑表示。 此外,解析操作将页面的JavaScript代码解释为定义事件处理程序或执行计算。

事件处理操作发生过程如下: 首先,用户通过触发DOM树上的事件(例如点击按钮或按下文本字段上的键)来向网页提供输入;然后,作为对事件的响应,Web浏览器调用JavaScript函数,该函数被定义为网页中事件的处理程序(即,事件处理操作),如下所示:

- 处理网络事件的操作当完全下载相应的外部文件(例如,图像文件)时,web应用程序运行用于加载事件的操作。 当接收到来自服务器的响应时,web应用程序运行用于响应事件的操作(在就绪状态改变时)。

- 处理用户输入事件的操作目标应用程序的元素上的用户输入事件(例如,鼠标点击按钮)调用操作以执行相应的事件处理程序功能。

- 处理定时事件的操作Web应用程序运行操作以执行定期定时事件的相应事件处理程序,这些事件处理程序通过使用setTimeout()/ setInterval()两种方法进行注册。

Web浏览器以原子方式执行操作,一次只执行一个操作。 注意,在一个页面内执行Web应用程序(即,不改变URL)可以包含多个事件的多个事件处理操作。 此外,Web应用程序的执行可以包含多个解析操作,因为:

bull;如果网页的HTML / JavaScript代码包含在多个文件中,则Web浏览器应分别解析每个文件(即,多次重复解析操作)。

bull;Web浏览器在解析期间到达等待点时暂停解析操作,然后调用后续解析操作以完成从等待点的解析。 现代网络浏览器定义了以下三个等待点[8], [9]::

- 解析外部文件的脚本元素时

- 解析内容长度大于缓冲区大小的HTML元素时(例如,WebKit为8 KB)

- 执行请求用户单击警报消息的JavaScript指令alert()按钮时。

由于目标应用程序环境的不确定行为而导致的这些操作的意外调度可能导致并发错误(例如,尽管开发人员假定t1.js比调用需要t1.js作为前置的t2.js下载函数更早。 但由于网络速度不同,t2.js可能早于t1.js下载。

图2.订单违规示例

图3.原子性违规示例

例如,图1说明了一个带有并发错误的JavaScript应用程序示例。 图1(a)显示应用程序代码由main.html,sub.html和lib.js组成。 main.html有一个按钮b1(第3-5行),其中注册了鼠标单击事件以调用lib.js(第21行)中定义的fn()和内容位于sub.html中的iframe元素(第6行)。 图1(b)示出了申请sigma;0至sigma;5的六个操作序列,每个操作序列由三个解析操作p1,p2,p3和一个事件处理操作e1组成。 p1解析main.html的1-6行并停止等待下载lib.js(第7行)。 在下载lib.js之后,p2开始解析main.html的第7-9行和lib.js的第21行。 下载sub.html后,p3开始解析sub.html(第11-15行)。 例如,sigma;0表示序列中出现p1,p2,p3和e1的执行。

693/5000

在示例中,sigma;3,sigma;4和sigma;5,其中e1在p2之前是错误执行,无法运行fn(),因为fn()尚未定义。 请注意,p1始终出现在p2,p3和e1之前,因为用户只有在p1创建b1后才能单击b1。 但是,p2,p3和e1之间的执行顺序取决于下载lib.js和sub.html的时间以及用户单击b1的时间。 例如,p2发生在p3之前,iflib.js在sub.html之前下载(即sigma;0,sigma;1和sigma;4),反之亦然,如果在lib.js之前下载sub.html(即sigma;2,sigma;3和sigma;5)。 正如我们在此示例中看到的,尽管Web浏览器一次只执行一个操作,但Web应用程序仍然可能遭受并发错误。

B. JavaScript Web应用程序中的并发错误模式

JavaScript Web应用程序中的并发错误是由非法的操作执行顺序引起的。 JavaScript Web应用程序中存在两种常见的并发错误模式:订单违规和原子性违规[25]。订单违规是指必须在一个订单中执行的两个操作中的非预期竞争条件,但是由于编程错误以相反的顺序执行。订单违规与Petrov等人[17]和Raychev等人[19]定义的种族错误模式一致。图2显示了一个订单违规示例。 main.html动态加载包含fn()函数定义的外部文件(extn.js)(第3-5行)(第11行)。因此,在加载extn.js和fn()之前fn()不应该被定义。图2(b)显示了正确的执行方案,其中网页正常工作,因为在单击b1之前加载了extn.js。但是,在加载extn.js之前单击按钮b1会导致错误。图2(c)显示了这种错误的执行场景。

原子性违规是指一种意外的竞争条件,它允许在两个应该连续执行的操作之间安排一个操作[25]。图3描述了原子性违规的示例。 main.html创建一个按钮b1,其事件处理程序是函数fn()。由于main.html有两个外部脚本元素(在第07行和第11行),main.html的解析包括以下三个操作:解析行01-06,解析行07-10,解析行11-15 。仅当第二次解析操作(第09行)定义m.data时,才应执行第三次解析操作。如图3(b)所示,当连续执行第二和第三解析操作时,网页不会产生任何错误。但是,如图3(c)所示,如果用户在第二次和第三次解析操作之间单击b1,执行就会引发错误,因为m被fn()设置为null。

3.WAVE框架

A.概述

图4说明了Web应用程序的虚拟环境(WAVE)框架。首先,WAVE使用给定的用户输入场景(称为执行sigma;0)监视目标Web应用程序的执行。然后,WAVE通过系统地交替sigma;0中的操作顺序,生成各种可行的操作序列作为测试用例。最后,WAVE使用这些测试用例执行应用程序,并检查这些不同的测试用例是否产生不同的结果(即并发错误)。如果使用相同的用户输入事件序列,应用程序的最终DOM树状态不同,则WAVE确定Web应用程序具有并发错误。由于WAVE基于sigma;0生成所有测试用例,其保持与sigma;0相同的用户输入事件序列,因此测试用例的结果应该相同。我们假设给定的执行sigma;0显示正确的行为。 WAVE在两个阶段(测试生成阶段和测试执行阶段)中检测目标应用程序中的并发错误。

在测试生成阶段,执行记录器通过监视包含目标应用程序与其环境之间的交互的执行(即一系列操作)来获得监视的执行sigma;0(例如,用户输入,诸如发送和接收分组之类的网络操作)。 然后,它构造一个执行模型,该模型指定sigma;0中的操作之间的订单约束。 这种约束的一个例子是生成的测试用例不应该改变用户在sigma;0中的序列的顺序。另一个例子是,在图1中,p1应该在p2,p3和e1之前。 测试用例生成器自动生成一组在sigma;0中观察到的操作的替代序列,满足执行模型的约束(第3-C节)。 然后,测试用例生成器对这些测试用例进行优先级排序,以快速检测并发错误(第3-D节)。

在测试执行阶段,执行调度程序执行目标应用程序以按优先顺序运行测试用例列表。 对于每个测试用例,执行调度程序通过控制应用程序与其环境之间的交互,使目标应用程序按照测试用例中指定的顺序执行sigma;0的操作。 最后,如果满足以下条件之一,则结果检查器报告并发错误:(1)目标应用程序引发未捕获的异常,(2)Web浏览器在100秒内没有响应(即,给定的操作顺序, 测试用例是不可行的),或者(3)测试中获得的最终结果页面与sigma;0中获得的原始结果页面不同。

B.实施

我们在WebKit浏览器框架之上实现了WAVE。 图5描述了WebKit和WAVE的结构。 WebKit提供一组事件管理器模块WebKitCoreAPI,(GUI事件管理器,页面加载器,XmlHttpRequest管理器和定时事件管理器)以及JavaScript引擎。 WAVE位于WebKitCoreAPI和一组事件管理器模块之间,作为接口层来操纵环境和Web浏览器上运行的Web应用程序之间的交互。

WebKitCoreAPI从目标应用程序的环境(即,用户,网络和/或计时器)接收外部事件,然后调用相应的管理器模块以生成处理该事件的操作。 事件管理器模块顺序运行(即,一旦事件管理器被WebKitCoreAPI调用,在事件管理器完成其操作之前不能调用其他事件管理器)。 因此,执行中的操作顺序由WebKitCoreAPI的一系列事件管理器调用确定。

图4. WAVE框架

图5. WebKit和WAVE内部结构

在测试用例生成阶段,执行记录器通过使用相关参数监视事件管理器调用来获得sigma;0(此外,它记录有关用户事件的所有信息,以便稍后在测试执行阶段重放它们)。在测试执行阶段,为了执行生成的测试用例,执行调度程序通过WebKitCoreAPI拦截事件管理器调用,以重新排列操作顺序,如测试用例中所示。为此目的,执行调度程序维护一个队列,该队列包含外部事件(即用户事件,网络事件和计时器事件)的所有事件管理器调用,以按给定测试用例中指定的顺序执行排队调用。换句话说,事件调度程序推迟调用处理不可控外部事件的事件管理器,直到它可以在给定测试用例中以相同的操作顺序调用事件管理器。例如,在图1中,假设执行调度程序尝试使用sigma;2作为生成的测试用例来执行目标应用程序。并假设应用程序首先接收lib.js。然后,执行调度程序保持事件管理器(即页面加载器)调用对应于/响应队列中接收lib.js的事件,直到它接收到sub.html。在接收到sub.html之后,执行调度程序调用页面加载器来执行p3,然后再次调用页面加载器以按照sigma;2中指定的顺序执行p2。相反,执行调度程序根据生成的测试用例随时重放用户输入事件,因为它可以重放用

原文和译文剩余内容已隐藏,您需要先支付 30元 才能查看原文和译文全部内容!立即支付

以上是毕业论文外文翻译,课题毕业论文、任务书、文献综述、开题报告、程序设计、图纸设计等资料可联系客服协助查找。