英语原文共 11 页,剩余内容已隐藏,支付完成后下载完整资料
基于JSP的Web应用程序的数据流分析和测试
刘建红
国立台北科技大学计算机科学与信息工程系,台湾台北市忠孝东路3号
摘要:Web应用程序通常依赖服务器端脚本来处理HTTP请求,生成动态内容以及与其他组件交互。服务器端脚本通常不会被任何编译器检查,因此可能容易出错。在本文中,我们将传统的数据流测试技术应用到Java Server Pages(JSP)的上下文中,这是一个非常流行的服务器端脚本,用于使用Java技术开发Web应用程序。我们指出JSP隐式对象和动作标签可以引入几个需要解决的独特数据流测试工件。提出了一种测试模型,用于捕获JSP页面的数据流信息,同时考虑各种隐式对象和动作标签。基于测试模型,我们描述了一种计算过程内,过程间和会话数据流测试路径的方法,用于揭示JSP页面的数据异常。
关键字:Web应用程序测试; 数据流测试; 软件测试; JSP测试。
介绍
随着互联网的广泛接受,Web应用程序已成为进行交易,提供服务和获取信息的流行工具。因此,对复杂和高质量的Web应用程序有很大的需求。但是,Web应用程序通常是在很短的上市时间压力下开发的,而不遵循传统的软件工程学科[14]。尽管Web技术引入了测试挑战,但缺乏严谨,系统化的方法和质量保证控制引起了人们对Web应用程序质量和可靠性的担忧[5]。
最近,已经提出了几种方法来解决Web应用程序测试[1,2,4,7-12,16,18,21,22]。大多数方法都侧重于在页面级恢复Web应用程序的架构,以便为测试人员提供练习Web页面及其关系的路线图。但是,为了提供足够的代码覆盖率,Web应用程序仍然需要传统的结构测试。因此,在本文中,我们的目标是努力对使用JSP页面开发的Web应用程序进行数据流分析和测试,JSP页面是一种非常流行的服务器端脚本语言,用于使用Java技术开发Web应用程序。
JSP页面已广泛用于基于Java的Web应用程序中,以处理HTTP请求,与Java bean等Java组件交互,以及生成动态页面。确保JSP页面正确写入并正确处理与其他组件的交互非常重要。但是,JSP页面通常将脚本(即JSP scriptlet)与HTML语句混合以生成动态页面。这使得JSP页面难以理解和测试。
此外,作为脚本语言,JSP页面没有任何编译器检查,因此可能容易出错。尽管已经存在多个用于测试JSP页面的测试工具,例如HTTPUnit和Cactus [17],但JSP页面测试被认为是困难的,测试用例仍然是在临时过程中设计的。最重要的是,JSP页面引入了一组类似XML的动作标签和隐式对象[3]。
在本文中,我们识别和分析JSP页面引入的可能的数据流测试工件。提出了一种测试模型来抽象各种JSP隐式对象和动作标签的数据流信息。描述和说明了用于计算涉及隐式对象和动作标签的数据流测试路径的方法。
本文的结构如下。第2节简要回顾了现有的Web应用程序测试方法 第3节描述了JSP隐式对象和动作标记引发的数据流测试工件。第4节提出了一个数据流测试模型来表示这些JSP测试工件。第5节说明了计算JSP页面的过程内,过程间和会话数据流信息的方法。最后一节总结了结论。
相关工作
最近,已经提出了一些Web应用程序测试方法。杨等人,[22]扩展传统的软件测试架构,以支持Web应用程序测试。开发了一套工具来帮助分析文档,开发测试用例,执行测试,监视故障并支持测试测量。Kung等,[8,10]提出了一个测试模型,它根据对象和关系抽象出非结构化Web应用程序。他们将HTML文档视为对象,并分析它们与Web应用程序的其他组件之间可能的数据流交互。提出了一种数据流测试策略,用于从对象内,对象间和客户端间角度选择用于执行脚本的测试路径。
Ricca和Tonella [16]描述了一种分析模型,它捕获Web应用程序的Web页面,表单,框架及其关系。该模型提取Web应用程序的静态和动态Web页面。从模型中,可以导出测试用例以测试Web页面之间的数据流。卢卡等人,[11]提出了一个复杂的测试模型来表示Web应用程序的各种实体。基于他们的模型,建议采用策略来生成Web应用程序的单元和集成测试的初步测试用例。
Wu和Offutt [21]描述了一种组合技术和几种使用页面原子内容构建静态和动态页面的规则。基于用户交互,他们将测试用例导出为静态页面的序列和原子元素的可能组成。Offutt等人,[12]提出了一种通过跳过客户端输入验证来测试Web应用程序的方法。它们从输入值,输入参数和控制流角度绕过输入验证,以测试Web应用程序的漏洞。预测实证结果以证明所提出方法的有用性。
安德鲁斯等人,[1]使用分层FSM模拟Web应用程序的状态依赖行为。基本上,Web应用程序被划分为集群。每个集群都以FSM表示,其中状态表示Web页面或HTML表单,而转换表示用户输入和操作。然后从聚合的FSM生成测试序列。此外,所提出的方法采用输入约束来减少状态空间爆炸。
Benedikt等人,[2]提供了一种自动化Web应用程序测试过程的工具。基本上,该工具可以根据给定的配置文件生成网站的测试输入。通过测试输入,该工具可以自动浏览网站的静态和动态页面。除了测试Web应用程序功能的方法之外,Kallepalli和Tian [7]以及Tonella和Ricca [18]利用Web应用程序执行期间收集的使用信息和故障日志来支持可靠性分析。与此同时,Elbaum等人,[4]利用Web应用程序捕获的使用数据生成测试用例,其费用低于使用白盒测试技术生成的测试用例。需要指出的是,本文考虑的数据流测试工件与[10]中的不同。本文的主要焦点是服务器端JSP页面中隐式对象和动作标签引入的数据流,而在[10]中,主要关注的是HTML文档在客户端脚本之间引入的数据流以及引起的数据流 通过客户端和服务器页面之间的HTTP协议。
JSP页面的数据流测试工件
数据流测试主要关注变量的定义及其在探索程序数据异常方面的潜在用途。变量的使用可以是c-use(计算使用)或p-use(谓词使用)。只要在计算或输出语句中使用变量,就会发生c次使用,而只要在谓词语句中使用变量就会发生p次使用。程序的测试路径是根据变量的def-use链(或定义 - 使用链)选择的,其中变量的def-use链是从定义到变量使用的路径。任何干预重新定义[15]。
为了探索JSP页面的数据异常,我们不仅需要考虑JSP页面的变量,还需要考虑JSP技术引入的隐式对象和动作标记。隐式对象(例如请求和响应对象)允许JSP开发人员在不明确声明对象的情况下访问JSP提供的服务和资源。特别是,一些隐式对象具有控制输入/输出和JSP页面流的功能。例如,请求对象可用于访问客户端请求中提供的数据。对于为给定HTTP请求提供服务的所有JSP页面,可以使用相同的请求对象,这可能导致JSP页面之间的数据交互。
类似地,隐式会话对象就像一个可以存储名称 - 值对的容器。这使得能够在用户会话内的JSP页面上访问数据,因此可以在JSP页面之间引入数据流工件。此外,响应对象的sendRedirect()方法允许将HTTP请求重定向到另一个JSP页面。重定向不仅可以影响JSP页面中的数据流,还可以在两个JSP页面之间或JSP页面和Java servlet之间引入数据交互。
如图1所示,变量var1和var2的数据可以通过response.sendRedirect()方法从page1.jsp传递到page2.jsp,该方法引入了page1.jsp和page2.jsp之间的数据交互。
除了隐式对象之外,JSP技术还引入了一组标准的类似XML的动作标记,例如lt;jsp:useBeangt;和lt;jsp:forwardgt;。动作标记与代码处理程序相关联,允许JSP页面与其他JSP页面和Java对象交互。这可以介绍JSP页面和Java对象之间的数据交互。例如,考虑图2中的login.jsp页面。在第5行中,login.jsp页面有一个lt;jsp:useBeangt;标记,用于将标记属性test分配给Java对象TestBean。然后在第8行使用此测试属性作为TestBean对象的对象引用,其中变量login和passwd的数据从login.jsp页面传递到test.verify()方法。因此,在计算JSP页面的数据流信息时需要考虑lt;jsp:useBeangt;标记,以捕获JSP页面和Java对象之间的数据交互。
此外,在图2的第12行中,lt;jsp:forwardgt;标签允许使用参数my_num将HTTP请求转发到debug.jsp页面。lt;jsp:forwardgt;标记不仅会更改login.jsp页面的流量,还会导致login.jsp和debug.jsp页面之间的数据交互。请注意,与传统函数调用不同,lt;jsp:forwardgt;标记只是将执行控制从login.jsp页面传递到debug.jsp页面而不返回任何内容。必须考虑这种单向数据流,以便可以正确地计算JSP页面的数据流信息。表1总结了JSP隐式对象和动作标记引入的几个基本数据流测试技术。需要指出的是,除了lt;jsp:forwardgt;标记之外,lt;jsp:includegt;标记允许将数据参数传递给另一个JSP页面或Java servlet,因此可以引入数据之间的数据交互。JSP页面或servlet [3]。然而,lt;jsp:includegt;标记仅包含其他JSP页面或servlet到当前JSP页面的输出。控制流程类似于传统函数调用,并将返回到当前的JSP页面。
图1.通过response.sendRedirect()进行数据交互的示例
图2. JSP动作标记引起的数据交互示例。
JSP页面的数据流测试模型
从控制结构的角度来看,JSP页面更像传统的过程而不是对象类,尽管JSP页面可以包含多个脚本函数。原因是JSP页面只有一个入口点,JSP页面中定义的所有函数只能在JSP页面中访问。因此,为了抽象JSP页面的数据流信息,我们将JSP页面视为传统过程并捕获其过程内和过程间数据流测试工件。
但是,与传统程序不同,JSP页面没有显式的调用层次结构,JSP页面的调用序列可以依赖于用户会话中的导航路径。特别是,通过访问隐式会话对象,不同的导航场景可以导致跨JSP页面的不同数据交互。这种数据交互可以根据用户导航路径发生,而不是基于JSP页面的控制流发生。为了明确地捕获这样的数据流工件,我们还对会话对象引入的数据流进行建模。
4.1过程内数据流模型
为了表示JSP页面的过程内数据流信息,采用用def / use信息注释的控制流图(CFG)。
def-use带注释的CFG是有向图,其中节点表示JSP脚本的状态块,而边表示语句块之间的执行流。特别是,CFG注释了感兴趣的变量,隐式对象和动作标签会发生什么。请注意,如第3节所述,response.sendRedirect(),pageContext.forward()和lt;jsp:forwardgt;标记可以构成单向数据流。为了捕获此工件,在CFG中创建“结束”节点以表示控制流的终止。因此,内部硬脑膜测试模型可能不是单入口单出口CFG。此外,JSP页面中的HTML语句被视为输出语句,没有任何定义或变量的使用。此外,每个动作标签块(包括开始标签,零个或多个标签属性,标签主体和结束标签)表示为CFG的单个块。图3显示了图2中login.jsp页面的def / use annotated CFG。变量,隐式对象和动作标签的定义和用法在相应的节点上注释。请注意,在图2的第12行中,从lt;jsp:forwardgt;标记开始并在lt;/ jsp:forwardgt;标记处结尾的所有语句都被视为lt;jsp:forwardgt;标记的单个XML块。该块由CFG的节点12表示。此外,由于lt;jsp:forwardgt;标记,CFG中会创建一个“结束”节点。在此节点,控制流从login.jsp页面传输到debug.jsp页面而不返回,并且可以引入一个工作流间数据流。
图3. login.jsp的def / use注释CFG。
4.2过程间数据流模型
为了表示涉及多个函数或一个JSP页面的数据流信息,使用用def / use信息注释的过程间控制流程图(ICFG)。ICFG已被用于模拟传统程序中交互功能的程序间数据流[6,13]。为了捕获JSP页面和Java组件之间的过程间数据流,除了函数调用之外,ICFG的构造还必须考虑隐式对象和动作标记。下面列出了几种可能发生过程间数据流并且需要为相应的JSP页面和Java组件构建ICFG的情况。
bull;“main”脚本或JSP页面的脚本函数调用同一JSP页面中的另一个脚本函数。bull;JSP页面通过lt;jsp:getPropertygt;或lt;jsp:setPropertygt;标记或通过直接引用Java组件的方法来调用相应的Java组件。bull;JSP页面通过lt;jsp:includegt;标记调用另一个JSP页面或Java servlet。bull;JSP页面通过lt;jsp:forwardgt;标记,response.sendRedirect()方法或pageContext.forward()方法调用另一个JSP页面或Java servlet。
请注意,操作标记lt;jsp:getPropertygt;,lt;jsp:setPropertygt;和lt;jsp:includegt;具有类似于传统函数调用的控制流。因此,可以通过将表示调用JSP页面中的这些动作标记的节点连接到被调用的Java方法或JSP页面的入口节点来构造ICFG。但是,lt;jsp:forwardgt;
剩余内容已隐藏,支付完成后下载完整资料
资料编号:[20575],资料为PDF文档或Word文档,PDF文档可免费转换为Word
课题毕业论文、外文翻译、任务书、文献综述、开题报告、程序设计、图纸设计等资料可联系客服协助查找。