论文:Marco Guarnieri ,Petar Tsankov,Tristan Buchs,Mohammad Torabi Dashti,David Basin
Test Execution Checkpointing for Web Applications. In Proceedings of 26th International Symposium on Software Testing and Analysis ,
测试隔离是测试套件在web运用程序上精确实行的先决条件。我们提出的测试实行监测点是一种有效的测试隔离的方法。我们的方法让web运用支持检讨点并借此隔离测试和优化测试。我们已经在5个盛行的PHP web运用中实现和评估了这个方法。结果表明该方法不仅基本上供应了免费的测试隔离,而且均匀缩短了44%的测试韶光。

测试是一种广泛运用于Web运用程序的质量担保方法。一个web运用测试由http要求序列组成。这些序列常日有副浸染,如实行一个测试会通过改变web运用程序的会话变量和数据库等来影响后续的测试结果。这些副浸染可以改变测试结果,引入假正例和假反例。测试隔离可以防止这些副浸染,因此在实践中尤为主要。
隔离Web运用程序测试具有寻衅性,大略的状态规复方法:例如,在连续的测试实行之间重置运用程序的状态的代价是昂贵的。这并不奇怪,由于重置真实的Web运用程序须要规复其数据库状态、会话变量和会话文件,并重新启动Web做事器。或者测试工程师可以手动修正测试来逼迫隔离,但是测试修正不仅随意马虎出错,而且每次修正运用都得重复进行。简而言之,状态规复方法是普遍适用的,可以自动化但是效率低。比较之下,测试修正的方法是有效的但是依赖于程序,并且大都是手动的。
在这篇论文中,我们提出了测试实行监测点(TEC),是实现上述两种方法中最好的一种Web运用程序的测试实行方法。也便是说,它以一种高效且独立于运用的办法供应自动测试隔离。它许可测试工程师专注于编写测试并将隔离完备委托给实行引擎。我们方法的关键部分是扩展测试实行引擎,使其具有检讨点功能,以最小的开销保存和规复运用程序状态。实验结果表明,TEC不仅可以免费供应测试隔离,而且可以显著缩短测试韶光。
技能先容本文首先用一个客户端管理订单的例子先容了在常见的测试过程中可能涌现的问题
图1 Web运用程序用于管理客户机订单的两个测试案例
考虑一个用于管理客户机订单的大略Web运用程序,它将所有订单存储在数据库中。图2a显示了两个测试,它们实行运用程序添加和编辑订单的功能。每个测试都是一系列HTTP要求。这两个测试首先通过将用户名alice和密码1234作为参数通报给web page log in.php来登任命户。之后,第一个测试添加了一个带有id=1和shipping=standard,而第二个测试将带有id=1的订单的shipping类型变动为overnight。edit.php的php实现如图2b所示。客户机将id和shipping作为参数通报。
网页利用getorder方法检索order工具,更新传送类型,并将更新的订单提交到数据库。如果数据库中不存在具有给定标识符的订单,则getorder方法返回空值。因此,此网页在第4行包含一个空指针取消引用缺点。当变量order的值为空时,Web运用程序在取消引用字段shipping时抛出错误。
为理解决传统测试中的这些问题我们须要引入隔离测试的观点。
隔离测试:
测试隔离担保测试结果与在Web运用程序启动时实行每个测试时得到处于初始状态。因此,隔离测试的结果是独立于其他测试,测试的顺序以及实行测试的次数。然而,Web运用程序测试并不能担保测试隔离。标准的测试实行实践是:
(1)启动Web运用程序
(2)对付每个测试,按顺序将HTTP要求发送到Web做事器
(3)不雅观察各自打算的结果。
我们称这种方法为标准测试实行。与传统的软件测试不同,Web运用程序没有重新启动由于测试之间的韶光间隔常日是禁止的。然而,这样的测试常日有持续的副浸染,如
会话变量和数据库内容的改变。这些副浸染可能影响别的测试的实行,导致假正例和假反例。
举例来说,考虑图2a中的两个测试t1和t2。这两个测试都有副浸染:t1向数据库添加一个order条款,t2修正数据库中的order条款。实行测试T1,然后实行t2,结果是假阴性,由于T1添加了一个带有标识符1的订单,并屏蔽了edit.php中的空指针取消引用缺点。但是,如果测试是单独实行的,我们会检测到前面提到的指针取消引用缺点。
为理解决这些问题,我们引入Test Execution Checkpointing。
图2 TEC构造
Test Execution Checkpointing(TEC):TEC是一种自动化方法,它依赖状态规复和测试修正来隔离和优化测试。TEC的输入是一个Web运用程序和一个测试套件,即一组测试。我们的办理方案,正如图一所示,是由两个紧张的组件组成的:一个检讨点引擎和一个转换引擎。检讨点引擎使Web运用程序支持高效的检讨点,这是一种保存运用程序状态快照并从以前保存的快照规复状态的技能。
正如上面所说,由于缺少测试隔离,Web运用程序测试可能会导致反正例和假反例。不才面,我们将描述如何利用TEC来办理这个问题。我们的方法依赖于两个关键组件:
(1)检讨点引擎。
(2)转换引擎。两个组件和TEC实行的紧张步骤如图3所示
图3 TEC概览图
检讨点引擎检讨点引擎对运用程序进行检测,并利用保存和规复检讨点的方法增强其功能,这些方法是利用两个指定的HTTP要求save和restore调用的。我们在图三中进行了指示解释。Web运用程序抽象地描述为初始状态为S0的转换系统。转换是运用程序接管的HTTP要求。例如,运用程序在吸收到HTTP要求登录时将其状态从S0变动为S1。表中会添加与转换干系的新事宜到现有的状态中去。在图3中,我们描述了用指定的HTTP要求save和restore标记的两个干系转换。实行HTTP要求保存将保存状态s1,实行HTTP要求还原将运用程序的状态还原回s1。
转换引擎转换引擎隔离并优化测试套件。修正后的测试依赖于待检测运用程序的检讨点功能,如下所示。
隔离测试的一个大略但低效的方法是在实行每个测试之前将Web运用程序规复到初始状态。特殊是,Web运用程序测试常日共享测试前缀,而这些前缀的实行常日占全体测试实行韶光的主导地位;实验结果见第5节。例如,两个测试T1和T2都从HTTP要求登录开始。登录步骤的实行常日很耗时,由于它须要数据库查询来检讨用户的身份信息以及加密操作。通过避免此类共享前缀的反复实行,我们可以显著减少全体测试实行韶光。
我们的测试实行引擎通过在实行共享前缀之后立即检讨Web运用程序的状态来避免重新实行共享前缀。举例来说,考虑两个测试T1和T2。转换首先在HTTP要求登录后在测试T1中插入HTTP要求保存,以保存运用程序的状态。然后,转换将测试t2中的共享前缀更换为HTTP要求还原,这将运用程序还原到状态s1,从而避免实行HTTP要求登录。以这种办法实行测试相称于从运用程序的初始状态开始实行T1和T2,并且HTTP要求登录只实行一次。
图四 web运用的检讨点引擎
我们的检讨点引擎(如图4中灰色部分所示)拦截发送到Web运用程序的所有HTTP要求以及运用程序与其数据层之间的所有通信。该引擎通过支持其余两个HTTP要求来增强Web运用程序,即save和restore,用于保存和还原Web运用程序状态的快照。当吸收到save(t)要求时,检讨点引擎会保存Web运用程序的状态,并用t标记它,例如自然数。此标签稍后可用于引用保存的数据。在收到restore(t)要求后,检讨点引擎将规复标记为t的Web运用程序状态。除了指定的save(t)和restore(t)要求外,所有HTTP要求都会完全地转发到Web运用程序。下面我们描述检讨点引擎如何保存状态紧张组件的快照。
本文紧张的贡献我们提出了测试实行检讨点,一种用于自动隔离、优化和实行Web运用程序测试的方法。我们还开拓了WEBCHECK,一个针对PHP运用的实例化TEC的工具,并利用它来评估TEC在五个盛行的PHP运用程序的上风。我们开拓了一个针对Web运用程序的高效、可扩展的检讨点引擎。我们的引擎检讨点包括会话和静态变量、数据库、访问的文件、随机种子和韶光戳。正如我们在实验中所演示的,这足以精确地检讨一大类PHP Web运用程序。我们的引擎可以有效地检讨Web运用程序,均匀花费不到2毫秒。这使得WebCheck险些可以免费隔离测试,均匀开销小于2%。
我们还提出了一种通过利用检讨点引擎供应的特性来隔离和优化测试的算法。该算法是图1中转换引擎的核心。我们证明:(1)我们的算法隔离了测试,(2)它是最优的,这意味着没有一个独立于运用的测试转换引擎达到了隔离效果或是可以用更少的HTTP要求来测试。用我们的算法,WEBCHECK显著减少了测试集大小并减少了44%的测试韶光。
范围和限定:
TEC适用于做事器端测试,即由HTTP要求序列组成的测试。但是,它既不适用于客户端代码,如javascript,也不适用于Web运用,我们的检讨点引擎不支持运用程序。更详细地说,我们的检讨点引擎支持这样的Web运用程序(1)将状态存储在会话变量、静态变量和持久变量中存储,如文件和数据库(2)访问随机值以及利用标准API的韶光戳。我们在第3.2节中谈论了检讨点引擎的局限性。
致谢本文由南京大学软件学院2019级研究生曾豪翻译转述