测试网站检测工具

网站检测工具  时间:2021-03-21  阅读:()
第8章Web页面测试随着Internet和Intranet的快速发展,Web技术已经对工商业、医疗业、教育、政府、娱乐以及我们的生活产生了深远的影响.
Web平台能支持几乎所有媒体类型的信息发布,容易为最终用户存取,更多传统的信息和数据系统正在逐渐迁移到互联网上:电子商务正迅速增长,范围广泛、复杂的云应用和云计算也正在Web环境中出现.
基于Web的系统在变得越来越复杂和强大的同时,Web应用软件的缺陷危机也越来越严重.
早在1998年YogeshDeshpande和SteveHansen就提出了Web工程的概念.
Web工程提倡使用一个过程和系统的方法来开发高质量的基于Web的系统.
在Web工程中,基于Web系统的测试、确认和验收是一项重要而富有挑战性的工作.
Web环境具有浏览器平台不兼容、网络环境多样化、应用复杂化等诸多特性,所以,传统测试方法的某些方面不适用于网络测试.
Web的自动化测试方法包含几个方面,比如,测试脚本技术、人工测试过程自动化、验证自动化等等.
在测试驱动开发模式中,测试已成为迭代开发过程中起推动作用的环节,但与此同时,大量的重复性的测试代码却造成了大量资源的浪费.
随着自动化测试技术的成熟和自动化测试工具的广泛应用,人们重新认识到了测试的价值:最优的质量成本,最高的质量保证.
自动化测试的优势在软件领域很明显的:减少了测试时间,使测试程序统一化,便于管理,节约了质量保证的成本,提高了测试运行的效率,改善了软件产品的质量.
现在一般人都有使用浏览器浏览网页的经历,用户虽然不是专业人员但是对界面效果的印象是很重要的.
如果开发人员注重这方面的测试,那么验证应用程序是否易于使用就非常重要了.
很多人认为这是测试中最不重要的部分,但是恰恰相反,界面对不懂技术的客户来说都是相当关键,特别是在简洁、美观、易用等方面.
方法上可以根据设计文档,如果够专业的话可以由专业美工人员,来确定整体风格,特别是页面风格.
然后根据这个设计好的页面,生成静态的HTML、CSS等甚至生成几套不同的方案来讨论,或者交给客户评审,最后形成统一风格的页面/框架.
页面测试的主要页面元素有:页面元素的容错性列表(如输入框、时间列表或日历).
页面元素清单(为实现功能,是否将所需要的元素全部都列出来了,如按钮、单选按钮、复选框、列表框、超链接、输入框等等).
页面元素的容错性是否存在.
第Ⅳ部分图形用户界面测试篇252页面元素的容错性是否正确.
页面元素的基本功能是否实现(如文字特效、动画特效、按钮、超链接).
页面元素的外形、摆放位置(如按钮、列表框、复选框、输入框、超链接等).
页面元素是否显示正确(主要针对文字、图形、签章).
元素是否显示(元素是否存在).
页面测试主要包括以下几个方面的内容:站点地图和导航条位置是否合理,是否可以导航等.
页面内容布局是否合理,文字是否准确、简洁,字体和字号是否符合多数读者习惯.
背景/色调是否合理、美观,是否符合多数用户审美要求.
页面在窗口中的显示是否正确、美观(在调整浏览器窗口大小时,屏幕刷新是否正确),表单样式大小、格式是否适宜.
是否对提交数据进行验证(如果在页面部分进行验证的话)等.
链接的形式、位置、是否易于理解等.
对Web应用的测试可以分为页内测试(IntraPageTest)和跨页测试(InterPageTest)两种.
页内测试相当于单元测试,着重于测试单个页面的行为是否正确.
根据模块化思想,在进行页面划分时,一般使每个页面具有单一、具体的功能,可以直接表达用户的一个目标.
本章我们主要考虑Web页内测试的主要方法.
人工走查:①通过页面走查,浏览确定使用的页面是否符合需求.
可以结合兼容性测试不同分辨率下的页面显示效果,如果有影响,则应该交给设计人员由他们提出解决方案.
②可以结合数据定义文档查看表单项的内容、长度等信息.
③对于动态生成的页面最好也能浏览查看.
如Servelet部分可以结合编码规范,进行代码走查.
是否支持中文,如果数据用XML封装,要做的工作可能会多一点.
使用Web页面测试工具:工具可以提供很多测试方法,可以用来模拟许多手工操作,如单击按钮、给文本框输入字符或数字、鼠标双击事件等,从而实现了测试的自动化.
这对于需要输入大量信息的界面测试来说是十分重要的.
Web页面测试的基本准则:符合页面/界面设计的标准和规范,满足灵活性、正确性、直观性、舒适性、实用性、一致性等要求.
直观性:①用户界面是否洁净、不唐突、不拥挤,界面不应该为用户制造障碍,所需功能或者期待的响应应该明显,并在预期的地方出现.
②界面组织和布局合理吗是否允许用户轻松地从一个功能转到另一个功能下一步做什么明显吗任何时刻都可以决定放弃或者退回、退出吗输入得到承认了吗菜单或者窗口是否深藏不露③有多余功能吗软件整体抑或局部是否做得太多是否因有太多特性而把工作复杂化了是否感到信息太庞杂④如果其他所有努力失败,帮助系统真能帮忙吗一致性:①快捷键和菜单选项,在Windows中按F1键总是得到帮助信息.
②术语和命令,整个软件使用同样的术语吗特性命名一致吗例如,Find是否一直叫Find,而不是有时叫Search③软件是否一直面向同一级别用户带有花哨用户界面的趣味贺卡程序不应该显示泄第8章Web页面测试253露技术机密的错误提示信息.
④按钮位置和等价的按键.
大家是否注意到对话框有OK按钮和Cancel按钮时,OK按钮总是在上方或者左方,而Cancel按钮总是在下方或右方同样原因,Cancel按钮的等价按键通常是Esc,而OK按钮的等价按钮通常是Enter,要保持一致.
灵活性:①状态跳转,灵活的软件实现同一任务时通常会有多种选择方式.
②状态终止和跳过,具有容错处理能力.
③数据输入和输出,用户希望有多种方法输入数据和查看结果.
例如,要在写字板中插入文字,可用键盘输入、粘贴、从6种文件格式读入、作为对象插入,或者用鼠标从其他程序拖动.
舒适性:①恰当,软件外观和感觉应该与所做的工作和使用者相符.
②错误处理,程序应该在用户执行严重错误的操作之前提出警告,并允许用户恢复由于错误操作导致丢失的数据.
正如大家认为undo/redo功能是理所当然应有的.
③性能,快不见得是好事,要让用户看清程序在做什么,它是有反应的.
8.
1Web页面测试工具介绍基于Web的测试基本上采用两种思路和方法.
一种可以称为"浏览器测试",这种测试通常是模拟浏览器端的一些操作,比如在TextBox中输入一些文本,选择表单组件中的某个部件等.
因为可以看见具体的操作界面,这种方法更多地被应用到UI和本地化方面的测试中.
另一种方法称为"协议测试".
这是建立在HTTP协议之上的JavaScript级别的测试,通过JavaScript伪协议或者POST、WebService向服务器发送请求,然后对服务器响应回来的数据进行解析、验证.
一些功能测试会更多地采用这种方法.
最简单的应用就是检查链接的有效性:向服务器发送URL请求,检查响应回来的数据,来判断链接是否指向了正确的页面.
本章所介绍的Web页面测试工具事实上能够很好地支持上述测试方法,并且它们均是以JUnit为基础扩展出来的,但应用模式各有不同.
1.
HttpUnitHttpUnit是在JUnit之上构建的测试框架,它支持Web应用的黑盒测试和in-container容器内测试.
作为功能测试工具,可以用它来验证软件是否符合业务需求,以及是否在可视的级别符合预期行为.
有趣的是,HttpUnit的基础代码实际上跟测试没什么关系.
开发HttpUnit库的目的是加强HTTP对Web应用的访问,它支持的特征包括状态管理(cookies)、请求提交、应答解析(HTML解析),以及网络爬虫(WebSpider)工具包需要的一些特征.
HttpUnit还有一个支持容器内测试的类ServletUnit.
在JUnit提供的断言功能和结果报告功能的基础上,HttpUnit成了一个非常有用的测试Web应用的工具.
可以在www.
httpunit.
org上找到HttpUnit.
2.
JWebUnitJWebUnit是在HttpUnit上创建的一个辅助工具包,它减少了测试Web程序所需要编第Ⅳ部分图形用户界面测试篇254写的代码.
简单地说,可以把它当作HttpUnit的宏程序库,提供到HttpUnit代码段的快捷方式,简化Web程序测试中的大多数行为.
HttpUnit提供的相对底层的接口可以让测试人员定制许多事情.
如果用HttpUnit可以解决问题,那么用JWebUnit也可以.
JWebUnit的好处是它对代码有更好的控制.
可以在http://jwebunit.
sourceforge.
net/上找到JWebUnit.
3.
StrutsTestCaseStrutsTestCase是为测试Struts应用而在JUnit基础上创建的测试框架.
Struts是用Java开发Web应用的程序员非常喜欢的模型-视图-控制器(MVC)平台,它简化了数据、表示和逻辑分离的易维护性组件式代码开发.
Struts使Web程序容器间(in-container)的功能测试和单元测试变得更复杂了,因为它们夹在servlet容器和程序之间.
这就意味着这个测试框架要认识Struts,能处理Struts的容器间测试.
由于不需要知道Web程序的内部实现,所以尽管HttpUnit的黑盒测试仍然工作得很好,也仍然无法用HttpUnit做Struts应用的容器间测试,因为HttpUnit是独立地位于程序和servlet容器之间.
StrutsTestCase是专为Struts程序的容器间测试而设计的.
StrutsTestCase可以从http://strutstestcase.
sourceforge.
net/获得.
4.
SeleniumSelenium是一个用于Web应用程序测试的工具,它将核心组件内插到浏览器中.
Selenium测试直接运行在浏览器中,就像真正的用户在操作一样,所有的测试都是可见的.
支持的浏览器包括IE、Mozilla、Firefox等.
这个工具的主要功能包括:测试与浏览器的兼容性,即测试应用程序是否能够很好地工作在不同浏览器和操作系统之上,测试系统功能,检验软件功能和用户需求.
Selenium可从http://seleniumhq.
org/download/上下载.
5.
HtmlUnitHtmlUnit是一个具有浏览器基本功能的Java组件.
HtmlUnit是JUnit的扩展测试框架之一,它支持HTML文件,并提供了一些API,允许访问网页、填写表格、点击链接等.
HtmlUnit将返回文档模拟成HTML,这样我们便可以直接处理这些文档了.
HtmlUnit使用诸如table、form等标识符将测试文档作为HTML来处理.
它同样需要遵循JUnit测试框架结构的Java测试程序.
这里要注意的是:前面介绍的HttpUnit主要是在http的request和response层次上进行操作,而HtmlUnit则是在比http高一些的HTML层次上进行操作.
HtmlUnit可从http://htmlunit.
sourceforge.
net/上下载.
8.
2Web页面测试工具之一——HttpUnitHttpUnit是SourceForge下面的一个开源项目,它是基于JUnit的一个测试框架,主要关注于测试Web应用,解决使用JUnit框架无法对远程Web内容进行测试的弊端.
当前的最新版本是1.
7.
为了使用HtpUnit能正常运行,您应该安装JavaJDK1.
3.
1或以上版本.
第8章Web页面测试2551.
HttpUnit的工作原理HttpUnit不需要使用浏览器.
我们可以使用HttpUnit直接调用要测试的代码.
从本质上来说,HttpUnit是模拟Web浏览器,并且HttpUnitAPI可以模拟浏览器的许多行为,包括表单提交、JavaScript、HTTP认证和Cookie等.
我们也可以在装入Web页面时用HttpUnitAPI分析返回的内容.
HttpUnit通过模拟浏览器的行为,处理页面帧(frames)、cookies、页面重定向(redirects)等.
通过HttpUnit提供的功能,我们可以和服务器端进行信息交互,将返回的网页内容作为普通文本、XMLDOM对象或者是作为链接、页面框架、图像、表单、表格等的集合进行处理,然后使用JUnit框架进行测试;还可以导向一个新的页面,然后进行新页面的处理,这个功能使我们可以处理一组在一个操作链中的页面,轻松地测试Web页面.
HttpUnit可以被分为两个核心组件:一个发送请求并接收响应的Web客户机一个分析并验证响应内容的方法集在这里,我们要澄清一个概念——使用HttpUnit是不是相当于进行单元测试与其名称可能暗示的相反,HttpUnit实际上并不做单元测试.
实际上,HttpUnit更适合做功能测试或"黑盒"测试.
测试人员用HttpUnit编写的测试从外部查询Web服务器并使我们能够分析接收到的响应.
功能测试在XP方法中起着重要的作用,这种方法强调功能测试,使开发者可以获取有关系统整体状态的反馈.
使用单元测试,有时会丢失大方向.
在将整个站点投入到实际使用的过程中,自动功能测试可以使开发者从手工检查站点区域的繁重工作中解脱出来.
在Web环境中,有些专家认为每个"请求-响应"周期都是原子的,这些原子的周期可以依次被作为单独的代码单元,因此使用HttpUnit可以被认为是在进行这种意义上的单元测试.
2.
HttpUnit和其他商业工具的对比商业工具一般使用录制、回放功能来实现测试,但是这里有个缺陷,就是当页面设计被修改以后,这些被记录的行为就不能重用了,需要重新录制才能继续测试.
举个例子:如果页面上有个元素最先的设计是采用单选框,这个时候你开始测试,那么这些工具记录的就是你的单项选择动作;但是如果你的设计发生了变化,比如说我改成了下拉选择,或者使用文本框来接收用户输入,那么这时候,你以前录制的测试过程就无效了,必须重新录制.
而HttpUnit因为关注点是这些控件的内容,所以不管控件的外在表现形式如何变化,都不会影响已确定测试的可重用性.
最重要的是,由于Web应用的快速发展以及Web编程错误容易产生的特征,市场上出现的许多商业测试产品都用详细的GUI来引导开发者进行测试.
另一方面,开放源代码的HttpUnit无需许可费用,而且使用简单(我们将在下面看到这一点).
正是它的简单性,使它如此受欢迎.
虽然没有漂亮的GUI,但HttpUnitJava源代码的可用性和它的简单API,使开发者能够创建他们自己的测试解决方案以满足特定组织的需要.
以HttpUnit作为基础,第Ⅳ部分图形用户界面测试篇256我们可以用最小的成本构建复杂的测试套件.
8.
2.
1HttpUnit环境建立可以从HttpUnit项目网站——http://httpunit.
sourceforge.
net2上下载到最新版的HttpUnit,HttpUnit应运行在支持JavaJDK1.
3及更高版本的系统上.
将HttpUnit解压缩到c:/httpunit(后面将使用"%httpunit_home%"引用该目录),目录结构应该如下所示:httpunit+---jars//包含创建、测试及运行HttpUnit所必需的jar|+---lib//包含HttpUnitjar|+---doc//文档|||+---tutorial//基于servletWeb网站的测试优先开发的简单教程|||+---api//javadoc|||+---manual//用户手册|+---examples//采用HttpUnit编写的一些示例程序|+---src//HttpUnit源代码|+---test//HttpUnit单元测试的一些很好的例子只有lib和jars这两个目录对于运行HttpUnit来说是必需的.
我们必须将HttpUnitjar添加到系统的classpath,而其他的一些jar均为可选.
由于我们考虑Web页面是在Eclipse中开发、执行的,所以环境配置都是以Eclipse为例.
如果使用其他的开发工具,则可根据以下步骤进行环境配置.
(1)启动Eclipse,建立一个Java项目.
(2)将%httpunit_home%/lib/*.
jar、%httpunit_home%/jars/*.
jar加入到该Java项目的JavabuildPath变量中.
8.
2.
2HttpUnit的工作方式1.
在使用HttpUnit进行页面测试时,需要特别关注如下几个类WebConversation是HttpUnit框架中最重要的类,它用于模拟浏览器的行为.
WebRequest模仿客户请求,通过它可以向服务器发送信息.
第8章Web页面测试257WebResponse模拟浏览器,获取服务器端的响应信息.
下面通过示例介绍上述类的具体应用:1)类的最基本应用System.
out.
println("直接获取网页内容:");//建立一个WebConversation实例WebConversationwc=newWebConversation();//向指定的URL发出请求,获取响应WebResponsewr=wc.
getResponse("http://localhost:6888/HelloWorld.
html");//用getText方法获取响应的全部内容//用System.
out.
println将获取的内容打印在控制台上System.
out.
println(wr.
getText());2)通过Get方法访问页面并加入参数System.
out.
println("向服务器发送数据,然后获取网页内容:");//建立一个WebConversation实例WebConversationwc=newWebConversation();//向指定的URL发出请求WebRequestreq=newGetMethodWebRequest("http://localhost:6888/HelloWorld.
jsp");//给请求加上参数req.
setParameter("username","姓名");//获取响应对象WebResponseresp=wc.
getResponse(req);//用getText方法获取响应的全部内容//用System.
out.
println将获取的内容打印在控制台上System.
out.
println(resp.
getText());3)通过Post方法访问页面并加入参数System.
out.
println("使用Post方式向服务器发送数据,然后获取网页内容:");//建立一个WebConversation实例WebConversationwc=newWebConversation();//向指定的URL发出请求WebRequestreq=newPostMethodWebRequest("http://localhost:6888/HelloWorld.
jsp");//给请求加上参数req.
setParameter("username","姓名");//获取响应对象WebResponseresp=wc.
getResponse(req);//用getText方法获取响应的全部内容//用System.
out.
println将获取的内容打印在控制台上第Ⅳ部分图形用户界面测试篇258System.
out.
println(resp.
getText());大家可以关注上面代码中打了下划线的两处内容,应该可以看到,使用Get、Post方法访问页面的区别就是使用的请求对象不同.
2.
处理页面中的链接找到页面中的某一个链接,然后模拟用户的点击行为,获得它指向文件的内容.
比如在页面HelloWorld.
html中有一个链接,它显示的内容是TestLink,它指向另一个页面TestLink.
html.
TestLink.
html页面只显示TestLink.
html页面的几个字符.
下面是处理代码:System.
out.
println("获取页面中链接指向页面的内容:");//建立一个WebConversation实例WebConversationwc=newWebConversation();//获取响应对象WebResponseresp=wc.
getResponse("http://localhost:6888/HelloWorld.
html");//获得页面链接对象WebLinklink=resp.
getLinkWith("TestLink");//模拟用户单击事件link.
click();//获得当前的响应对象WebResponsenextLink=wc.
getCurrentPage();//用getText方法获取响应的全部内容//用System.
out.
println将获取的内容打印在控制台上System.
out.
println(nextLink.
getText());3.
处理页面中的表格表格是用来控制页面显示的常规对象,HttpUnit使用数组来处理页面中的多个表格,我们可以用resp.
getTables()方法获取页面中所有的表格对象.
它们依照出现在页面中的顺序保存在一个数组里面.
注意:Java中数组的下标是从0开始的,所以取第一个表格时应该是resp.
getTables()[0],其他依此类推.
下面的示例演示了如何从页面中取出第一个表格的内容并将它们循环显示出来:System.
out.
println("获取页面中表格的内容:");//建立一个WebConversation实例WebConversationwc=newWebConversation();//获取响应对象WebResponseresp=wc.
getResponse("http://localhost:6888/HelloWorld.
html");//获得对应的表格对象WebTablewebTable=resp.
getTables()[0];第8章Web页面测试259//将表格对象的内容传递给字符串数组String[][]datas=webTable.
asText();//循环显示表格内容inti=0,j=0;intm=datas[0].
length;intn=datas.
length;while(iHelloWorld!
");out.
close();}}测试的调用代码如下://创建Servlet的运行环境ServletRunnersr=newServletRunner();//向环境中注册Servletsr.
registerServlet("myServlet",MyServlet.
class.
getName());//创建访问Servlet的客户端ServletUnitClientsc=sr.
newClient();//发送请求WebRequestrequest=newGetMethodWebRequest("http://localhost/myServlet");//获得模拟服务器的信息WebResponseresponse=sc.
getResponse(request);//将获得的结果打印在控制台上System.
out.
println(response.
getText());测试Servlet的内部行为:对于开发者来说,仅仅测试请求和返回信息是不够的,所以HttpUnit提供的ServletRunner模拟器可以对被调用Servlet的内部行为进行测试.
和简单测试中不同,这里使用了InvocationContext来获得该Servlet的环境,然后可以通过InvocationContext对象针对request、response等对象或者该Servlet的内部行为(非服务方法)进行操作.
下面的代码演示了如何使用HttpUnit模拟Servlet容器,并通过InvocationContext对象测试Servlet内部行为的大部分工作,比如控制request、session、response等.
//创建Servlet的运行环境ServletRunnersr=newServletRunner();//向环境中注册Servletsr.
registerServlet("InternalServlet",InternalServlet.
class.
getName());//创建访问Servlet的客户端ServletUnitClientsc=sr.
newClient();第Ⅳ部分图形用户界面测试篇262//发送请求WebRequestrequest=newGetMethodWebRequest("http://localhost/InternalServlet");request.
setParameter("pwd","pwd");//获得该请求的上下文环境InvocationContextic=sc.
newInvocation(request);//调用Servlet的非服务方法InternalServletis=(InternalServlet)ic.
getServlet();is.
myMethod();//直接通过上下文获得request对象System.
out.
println("request中获取的内容:"+ic.
getRequest().
getParameter("pwd"));//直接通过上下文获得response对象,并向客户端输出信息ic.
getResponse().
getWriter().
write("haha");//直接通过上下文获得session对象,控制session对象//给session赋值ic.
getRequest().
getSession().
setAttribute("username","timeson");//获取session的值System.
out.
println("session中的值:"+ic.
getRequest().
getSession().
getAttribute("username"));//使用客户端获取返回信息,并且打印出来WebResponseresponse=ic.
getServletResponse();System.
out.
println(response.
getText());注意在测试Servlet之前,必须通过InvocationContext完成Servlet中的service方法中完成的工作;因为通过newInvocation方法获取InvocationContext实例的时候,该方法并没有被调用.
8.
3Web页面测试工具之二——JWebUnitJWebUnit是基于Java的用于测试网络程序的框架,架构在HttpUnit之上——即JWebUnit以HttpUnit和JUnit单元测试框架为基础,适合做Web应用的验收测试.
实际上也可以这么说,JWebUnit是HttpUnit的更高一层API封装,提供了访问Web应用程序的高级API,并组合了一组断言,用它们来验证链接导航、表单输入项和提交、表格内容以及其他典型业务类Web应用程序特性的正确性,避免了使用HttpUnit来编写繁琐复杂的测试用例.
JWebUnit是以JAR文件形式提供的,可以很容易地将它作为插件集成到大多数的IDE中,JWebUnit还包含了其他必要的库.
除了底层的一些逻辑API外,JWebUnit还轻量地集成了现有的测试框架HtmlUnit和Selenium,并提供统一的一组简单易用的接口,可以很方便地与HtmlUnit或Selenium测试项目集成.
所以对于目标测试用例来说,所有的接口都是透明且统一语义的,这将极大保证测试用例的通用性并降低了开发难度.
第8章Web页面测试2638.
3.
1JWebUnit测试环境建立JWebUnit可以通过点击链接http://sourceforge.
net/projects/jwebunit来下载.
JWebUnit编译需要下面这几个包的支持:HttpUnitJava库包,HttpUnit用到的RhinoJavaScript(仅在对JavaScript进行测试时需要),HttpUnit用到的nekohtml分析器和美化器,JUnit.
另外,如用到Tidy/HttpUnit或HttpUnit/neko等功能,则还需下载ApacheXMLAPICommonXMLstuff和Xercesxmlparser等.
下载完JWebUnit之后,请按以下步骤在Eclipse平台上配置JWebUnit库:(1)把下载的JWebUnit文件释放到临时目录中(假设是C:\temp).
JWebUnit当前的最新版本为2.
2.
(2)在Eclipse(这里用到的测试环境为MyEclipse6.
0.
1)中创建新Java项目,将其命名为JWebUnitTest.
(3)右击PackageExplorer视图中的JWebUnitTest项目,然后选择"Properties".
(4)单击"JavaBuildPath".
单击"Libraries"标签中的"AddExternalJARs".
(5)浏览到C:\temp\jwebunit-2.
2\lib目录,选择这个目录中的所有JAR文件.
(6)单击"OK".
现在可以在Eclipse中的JWebUnitTest项目下开发jWebUnit测试用例了,如图8-1所示.
图8-1建立JWebUnit测试环境第Ⅳ部分图形用户界面测试篇264图8-1建立JWebUnit测试环境(续表)8.
3.
2JWebUnit应用方法1.
快速应用JWebUnit大致有两种方式来建立测试用例:继承模式和委托模式.
下面这种是使用继第8章Web页面测试265承模式继承JWebUnit提供的WebTestCase类,该类继承于junit.
framework.
TestCase类,代码示例如下:importnet.
sourceforge.
jwebunit.
WebTestCase;publicclassExampleWebTestCaseextendsWebTestCase{publicExampleWebTestCase(Stringname){super(name);}}委托模式的实现比上面的实现方式麻烦一点,代码示例如下:importjunit.
framework.
TestCase;importnet.
sourceforge.
jwebunit.
WebTester;publicclassExampleWebTestCaseextendsTestCase{privateWebTestertester;publicExampleWebTestCase(Stringname){super(name);tester=newWebTester();}}用户测试用例代码继承了junit.
framework.
TestCase类,并在该类的全局变量里声明了一个WebTester类,该类封装了一些基本的Web操作动作,它属于JWebUnit.
在ExampleWebTestCase构造函数中将WebTester实例化.
委托模式有个好处,代码表现上很简洁,测试动作和被测试业务代码将被表现得异常清晰,有利于后期的测试开发迭代.
2.
HttpUnit和JWebUnit测试方法对比对Web应用程序自动进行测试意味着跳过Web浏览器,通过程序来处理Web站点.
首先,我们看看HttpUnit(JWebUnit的构建块之一)是如何简化这项工作的.
HttpUnit可以模拟帧、JavaScript、页面重定向cookie等等.
在将HttpUnit用于JUnit时,它可以迅速地对Web站点的功能进行验证.
下面代码显示了一个用HttpUnit编写的测试用例,它试图单击HttpUnit主页上的"Cookbook"链接:1publicclassHttpUnitTest{2publicstaticvoidmain(String[]args){3try{4WebConversationwc=newWebConversation();5WebRequestrequest=newGetMethodWebRequest("http://httpunit.
sourceforge.
net/index.
html");6wc.
setProxyServer("your.
proxy.
com",80);第Ⅳ部分图形用户界面测试篇2667WebResponseresponse=wc.
getResponse(request);8WebLinkhttpunitLink=response.
getFirstMatchingLink(WebLink.
MATCH_CONTAINED_TEXT,"Cookbook");9response=httpunitLink.
click();10System.
out.
println("Testsuccessful!
!
");11}catch(Exceptione){12System.
err.
println("Exception:"+e);13}14}这段代码的第6行用your.
proxy.
com连接Internet.
如果存在直接Internet连接,那么可以把这条语句注释掉.
第8行的语句用于在页面中搜索包含文本Cookbook的Web链接.
第9行的语句用于单击这个链接.
如果找到链接,用户将会看到TestSuccessful!
这条消息.
下面代码是用JWebUnit改写后的上述HttpUnit的测试代码,看上去更简单了.
1publicclassJWebUnitTestextendsWebTestCase{2publicstaticvoidmain(String[]args){3junit.
textui.
TestRunner.
run(newTestSuite(JWebUnitTest.
class));4}5publicvoidsetUp(){6getTestContext().
setBaseUrl("http://httpunit.
sourceforge.
net");7getTestContext().
setProxyName("webproxy.
watson.
ibm.
com");8getTestContext().
setProxyPort(8080);9}10publicvoidtestSearch(){11beginAt("/index.
html");12clickLinkWithText("Cookbook");13}14}如果没注意特定于JUnit的代码,那么我们可以看到,测试用例现在变得相当整洁、简练.
需要查看的重要的行是第6行、第11行和第12行.
在第6行,基本URL被设置到HttpUnit的主页中.
第11行用相对路径/index.
html连接站点.
第12行用于单击页面上具有文本Cookbook的链接.
如果链接有效,那么JUnit会报告成功;否则,JUnit会报告异常.
3.
JWebUnitAPI每个JWebUnit测试的核心都是net.
sourceforge.
jwebunit.
WebTestCase类,它代表测试用例.
每个测试用例都必须是从这个类扩展而来的(net.
sourceforge.
jwebunit.
WebTestCase类本身则是从junit.
framework.
TestCase类扩展而来的,它在JUnit中代表测试用例).
WebTestCase类的重要方法参见表8-1.
第8章Web页面测试267表8-1net.
sourceforge.
jwebunit.
WebTestCase类的重要方法方法说明publicTestContextgetTestContext()得到测试用例的上下文.
可以用它访问诸如地区、基本URL和cookie之类的项目publicvoidbeginAt(StringrelativeURL)在相对于基本URL的URL处开始对话publicvoidsetWorkingForm(StringnameOrId)与指定的表单开始交互.
如果当前页面只有一个表单,就不需要调用这个方法protectedvoidsubmit()提交表单——等同于单击表单的"提交"按钮publicvoidgotoFrame(StringframeName)激活命名帧另一个重要的类是net.
sourceforge.
jwebunit.
TestContext,它用于为测试创建上下文.
可以用这个类来处理诸如cookie、会话和授权之类的信息.
表8-2显示了这个类的一些重要方法.
表8-2net.
sourceforge.
jwebunit.
TestContext类的重要方法方法说明publicvoidaddCookie(Stringname,Stringvalue)向测试上下文中添加cookie.
在HttpUnitDialog开始时,添加的cookie被设置到WebConversation上publicvoidsetResourceBundleName(Stringname)为测试上下文设置一个使用的资源绑定.
用于按照WebTester中的键查找期望的值publicvoidsetProxyName(StringproxyName)为测试上下文设置代理服务器名称publicvoidsetBaseUrl(Stringurl)为测试上下文设置基本URL8.
3.
3JWebUnit测试应用举例现在我们通过例子来介绍JWebUnitAPI的实际应用.
我们考察的应用程序是一个测试用例,用于打开一个Google搜索页面并搜索文本HttpUnit.
应用程序需要测试以下场景:打开Google主页http://www.
google.
com.
确定该页包含一个名为q的表单元素(在Google的主页上,名为q的文本框用于接收用户的查询输入条件).
应用程序用这个元素输入搜索参数.
在搜索文本框中输入字符串"HttpUnitHome",并提交表单.
获得结果页,并确定该页面包含的链接中包含文本HttpUnitHome.
单击包含文本HttpUnitHome的链接.
现在测试场景已经就绪,可以编写Java应用程序,用JWebUnit实现这些需求了.
第一步是声明一个从WebTestCase扩展而来的类,如(1)所示:(1)声明测试用例类:第Ⅳ部分图形用户界面测试篇268publicclassGoogleTestextendsWebTestCase{staticStringsearchLink="";}正如我们在前面提到过的,JWebUnit要求每个测试用例都是从WebTestCase中扩展而来的.
searchLink保存传入的搜索参数.
这个值以命令行参数的形式传递给测试用例.
下一步是声明入口点——main()方法,如(2)所示.
(2)声明main()方法:publicstaticvoidmain(String[]args){searchLink=args[0];junit.
textui.
TestRunner.
run(newTestSuite(GoogleTest.
class));}main()方法调用junit.
textui.
TestRunner.
run()来执行测试用例.
因为需要运行GoogleTest测试用例,所以作为参数传递给run()方法的测试套件采用GoogleTest.
class作为参数.
接下来,浏览用例调用setUp()方法来设置基本URL和代理,如(3)所示.
(3)设置基本URL和代理:publicvoidsetUp(){getTestContext().
setBaseUrl("http://www.
google.
com");getTestContext().
setProxyName("proxy.
host.
com");getTestContext().
setProxyPort(80);}上面把基本URL设置为http://www.
google.
com,这意味着测试用例的启动是相对于这个URL的.
接下来的两条语句设置连接到Internet的代理主机和代理端口,如果是直接连接到Internet,那么可以忽略代理设置语句.
现在开始浏览站点并输入搜索参数.
(4)显示了访问Web页面,然后测试所有场景的代码:(5)测试所有场景publicvoidtestSearch(){beginAt("/");assertFormElementPresent("q");setFormElement("q","HttpUnit");submit("btnG");assertLinkPresentWithText(searchLink);clickLinkWithText(searchLink);}上述代码连接到基本URL,并相对于"/"开始浏览.
然后它断定页面中包含一个名为q的表单元素——q是Google主页上查询输入文本框的名称.
下一条语句用值HttpUnit第8章Web页面测试269来设置名为q的文本框.
再下一条语句提交表单上名为btnG的提交按钮(在Google主页上,名为btnG的按钮是标签为"GoogleSearch"的按钮).
表单是在这个对话中提交的,下一页列出搜索结果.
在结果页面上,代码首先检查是否有一个链接的文本是HttpUnitHome.
如果该链接不存在,那么测试就以AssertionFailedError失败.
如果该链接存在,则测试执行的下一个操作是单击链接.
我们在测试环境中编写上述的完整Java测试程序:packagecom.
jweb.
test;importjunit.
framework.
TestSuite;importjunit.
textui.
TestRunner;importnet.
sourceforge.
jwebunit.
TestContext;importnet.
sourceforge.
jwebunit.
WebTestCase;publicclassGoogleTestextendsWebTestCase{staticStringsearchLink="";publicstaticvoidmain(String[]args){searchLink=args[0];TestRunner.
run(newTestSuite(GoogleTest.
class));}publicvoidsetUp(){getTestContext().
setBaseUrl("http://www.
google.
com");getTestContext().
setProxyName("proxy.
host.
com");getTestContext().
setProxyPort(80);}publicvoidtestSearch(){beginAt("/");assertFormElementPresent("q");setFormElement("q","HttpUnit");submit("btnG");assertLinkPresentWithText(searchLink);clickLinkWithText(searchLink);}}在控制台执行javacom.
jweb.
test.
GoogleTest"HttpUnitHome"命令,运行程序.
在执行了测试用例之后,会在命令行输出一个测试用例报告.
如果测试失败,报告将看起来如(6)中所示.
(6)带有断言失败的输出:C:\temp>javacom.
jweb.
test.
GoogleTest"HttpUnitHwee".
FTime:5.
338第Ⅳ部分图形用户界面测试篇270Therewas1failure:1)testSearch(com.
jweb.
test.
GoogleTest)junit.
framework.
AssertionFailedError:Linkwithtext[HttpUnitHwee]notfoundinresponse.
atnet.
sourceforge.
jwebunit.
WebTester.
assertLinkPresentWithText(WebTester.
java:618)atnet.
sourceforge.
jwebunit.
WebTestCase.
assertLinkPresentWithText(WebTestCase.
java:244)atcom.
jweb.
test.
GoogleTest.
testSearch(GoogleTest.
java:36)atsun.
reflect.
NativeMethodAccessorImpl.
invoke0(NativeMethod)atsun.
reflect.
NativeMethodAccessorImpl.
invoke(UnknownSource)atsun.
reflect.
DelegatingMethodAccessorImpl.
invoke(UnknownSource)atcom.
jweb.
test.
GoogleTest.
main(GoogleTest.
java:19)FAILURES!
!
!
Testsrun:1,Failures:1,Errors:0正如在(6)中可以看到的,可以以HttpUnitHwee作为参数来执行测试用例.
这个测试用例遇到断言的地方会失败,因为结果页面中不包含带有这个文本的链接.
由此也就产生了junit.
framework.
AssertionFailedError.
在(7)中执行时以HttpUnitHome作为参数.
测试用例找到了一个带有这个文本的链接,所以测试通过了.
(7)成功测试的输出:C:\temp>javacom.
jweb.
test.
GoogleTest"HttpUnitHome".
Time:6.
991OK(1test)8.
3.
4JWebUnit应用小结前面通过讨论JWebUnit框架的一些突出特性和最重要的类,介绍了如何用它创建简洁的测试用例,使大家能够对JWebUnit框架有一个认识.
JWebUnit还有更多特性可以用在测试用例中.
它支持测试Web页面中的链接行数,可以对字符串、表或者带有指定标签的表单输入元素是否存在于页面上进行断言.
此外,JWebUnit还可以处理cookie(例如断言存在某个cookie、删除cookie等).
测试可以对某个文本之后出现的特定文本的链接进行单击.
如果想为Web应用程序构建快而有效的测试用例,JWebUnit可能是最好的工具.
实验习题1.
应用HtmlUnit对Web应用进行测试,并给出具体的测试过程,同时与HttpUnit进行比较.
2.
在Eclipse环境下建立swtbot的Web应用测试环境,并对具体的Web应用进行测试,详细描述测试过程.

速云:广州移动/深圳移动/广东联通/香港HKT等VDS,9折优惠,最低月付9元;深圳独立服务器1050元/首月起

速云怎么样?速云,国人商家,提供广州移动、深圳移动、广州茂名联通、香港hkt等VDS和独立服务器。现在暑期限时特惠,力度大。广州移动/深圳移动/广东联通/香港HKT等9折优惠,最低月付9元;暑期特惠,带宽、流量翻倍,深港mplc免费试用!点击进入:速云官方网站地址速云优惠码:全场9折优惠码:summer速云优惠活动:活动期间,所有地区所有配置可享受9折优惠,深圳/广州地区流量计费VDS可选择流量翻...

哪个好Vultr搬瓦工和Vultr97%,搬瓦工和Vultr全方位比较!

搬瓦工和Vultr哪个好?搬瓦工和Vultr都是非常火爆的国外VPS,可以说是国内网友买的最多的两家,那么搬瓦工和Vultr哪个好?如果要选择VPS,首先我们要考虑成本、服务器质量以及产品的售后服务。老玩家都知道目前在国内最受欢迎的国外VPS服务商vultr和搬瓦工口碑都很不错。搬瓦工和Vultr哪个稳定?搬瓦工和Vultr哪个速度快?为了回答这些问题,本文从线路、速度、功能、售后等多方面对比这两...

Vinahost - 越南VPS主机商月6美元 季付以上赠送时长最多半年

Vinahost,这个主机商还是第一次介绍到,翻看商家的介绍信息,是一家成立于2008年的老牌越南主机商,业务涵盖网站设计、域名、SSL证书、电子邮箱、虚拟主机、越南VPS、云计算、越南服务器出租以及设备托管等,机房主要在越南胡志明市的Viettle和VNPT数据中心,其中VNPT数据中心对于国内是三网直连,速度优。类似很多海外主机商一样,希望拓展自己的业务,必须要降价优惠或者增加机房迎合需求用户...

网站检测工具为你推荐
vc组合天然维生素c和合成维生素c有区别吗12306崩溃12306是不是瘫痪了?Baby被问婚变绯闻终于知道黄晓明为什么会娶baby留学生认证留学生回国学历认证 需要带什么材料广东GDP破10万亿在已披露的2017年GDP经济数据中,以下哪个省份GDP总量排名第一?www.983mm.comwww.47683.com百度关键词分析怎样对关键词进行分析和选择www.55125.cnwww95599cn余额查询www.765.com哪里有免费的电影网站www.zjs.com.cn中国快递公司排名
空间租用 域名服务 淘宝抢红包攻略 t牌 便宜域名 linode 谷歌香港 php免费空间 183是联通还是移动 爱奇艺vip免费试用7天 1美金 百度云加速 成都主机托管 网络速度 小夜博客 zcloud 腾讯云平台 机柜尺寸 侦探online 免费php空间申请 更多