Web页面测试

时间:2024.5.7

Web页面测试

随着Internet和Intranet的快速发展,Web技术已经对工商业、医疗业、教育、政府、 娱乐以及我们的生活产生了深远的影响。Web平台能支持几乎所有媒体类型的信息发布, 容易为最终用户存取,更多传统的信息和数据系统正在逐渐迁移到互联网上:电子商务正 迅速增长,范围广泛、复杂的云应用和云计算也正在 Web 环境中出现。基于 Web 的系统 在变得越来越复杂和强大的同时,Web 应用软件的缺陷危机也越来越严重。早在 1998 年 Yogesh Deshpande和Steve Hansen就提出了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.1 Web页面测试工具介绍

基于Web的测试基本上采用两种思路和方法。一种可以称为“浏览器测试”,这种测试 通常是模拟浏览器端的一些操作, 比如在TextBox中输入一些文本, 选择表单组件中的某个部

件等。因为可以看见具体的操作界面,这种方法更多地被应用到UI和本地化方面的测试中。 另一种方法称为“协议测试”。这是建立在HTTP协议之上的JavaScript级别的测试, 通过JavaScript伪协议或者POST、Web Service向服务器发送请求,然后对服务器响应回

来的数据进行解析、验证。一些功能测试会更多地采用这种方法。最简单的应用就是检查 链接的有效性:向服务器发送 URL 请求,检查响应回来的数据,来判断链接是否指向了 正确的页面。

本章所介绍的Web页面测试工具事实上能够很好地支持上述测试方法, 并且它们均是 以JUnit为基础扩展出来的,但应用模式各有不同。

1. HttpUnit

HttpUnit 是在JUnit 之上构建的测试框架,它支持Web 应用的黑盒测试和in-container容

器内测试。作为功能测试工具,可以用它来验证软件是否符合业务需求,以及是否在可视的级

别符合预期行为。有趣的是,HttpUnit的基础代码实际上跟测试没什么关系。开发HttpUnit库

的目的是加强 HTTP 对 Web 应用的访问,它支持的特征包括状态管理(cookies)、请求提交、 应答解析(HTML解析),以及网络爬虫(Web Spider)工具包需要的一些特征。HttpUnit还有一个

支持容器内测试的类ServletUnit。在JUnit提供的断言功能和结果报告功能的基础上,HttpUnit

成了一个非常有用的测试Web应用的工具。可以在上找到HttpUnit。

2. JWebUnit

JWebUnit 是在 HttpUnit 上创建的一个辅助工具包,它减少了测试 Web 程序所需要编第Ⅳ部分 图形用户界面测试篇 ? 254 ?

写的代码。简单地说,可以把它当作HttpUnit的宏程序库,提供到 HttpUnit代码段的快捷 方式,简化Web程序测试中的大多数行为。HttpUnit提供的相对底层的接口可以让测试人 员定制许多事情。如果用 HttpUnit 可以解决问题,那么用 JWebUnit 也可以。JWebUnit 的 好处是它对代码有更好的控制。可以在/上找到JWebUnit。

3. StrutsTestCase

StrutsTestCase是为测试Struts应用而在JUnit基础上创建的测试框架。 Struts是用Java 开发Web应用的程序员非常喜欢的模型-视图-控制器(MVC)平台,它简化了数据、表示和 逻辑分离的易维护性组件式代码开发。 Struts使Web程序容器间(in-container)的功能测试和

单元测试变得更复杂了,因为它们夹在servlet容器和程序之间。这就意味着这个测试框架 要认识Struts,能处理Struts的容器间测试。由于不需要知道Web程序的内部实现,所以尽

管HttpUnit的黑盒测试仍然工作得很好, 也仍然无法用HttpUnit做Struts应用的容器间测试,

因为 HttpUnit 是独立地位于程序和 servlet 容器之间。StrutsTestCase 是专为 Struts 程序的容

器间测试而设计的。StrutsTestCase可以从/获得。

4. Selenium

Selenium是一个用于Web应用程序测试的工具, 它将核心组件内插到浏览器中。 Selenium 测试直接运行在浏览器中,就像真正的用户在操作一样,所有的测试都是可见的。支持的浏览

器包括IE、Mozilla、Firefox 等。这个工具的主要功能包括:测试与浏览器的兼容性,即测试

应用程序是否能够很好地工作在不同浏览器和操作系统之上, 测试系统功能, 检验软件功能和

用户需求。Selenium可从http://seleniumhq.org/download/上下载。

5. HtmlUnit

HtmlUnit是一个具有浏览器基本功能的Java组件。HtmlUnit是JUnit的扩展测试框架 之一,它支持HTML文件,并提供了一些API,允许访问网页、填写表格、点击链接等。 HtmlUnit将返回文档模拟成HTML,这样我们便可以直接处理这些文档了。HtmlUnit使用 诸如 table、form 等标识符将测试文档作为 HTML 来处理。它同样需要遵循 JUnit 测试框 架结构的 Java 测试程序。这里要注意的是:前面介绍的 HttpUnit 主要是在 http 的 request

和response层次上进行操作,而HtmlUnit则是在比http高一些的HTML层次上进行操作。 HtmlUnit可从/上下载。

8.2 Web页面测试工具之一 ——HttpUnit

HttpUnit是SourceForge下面的一个开源项目,它是基于JUnit的一个测试框架,主要 关注于测试Web应用,解决使用JUnit框架无法对远程Web内容进行测试的弊端。当前的 最新版本是1.7。为了使用HtpUnit能正常运行,您应该安装JavaJDK1.3.1或以上版本。 第8章 Web 页面测试 ? 255 ?

1. HttpUnit的工作原理

HttpUnit 不需要使用浏览器。我们可以使用 HttpUnit 直接调用要测试的代码。从本质 上来说,HttpUnit是模拟Web浏览器,并且HttpUnit API可以模拟浏览器的许多行为,包 括表单提交、 JavaScript、 HTTP认证和Cookie等。 我们也可以在装入Web页面时用HttpUnit

API分析返回的内容。

HttpUnit通过模拟浏览器的行为,处理页面帧(frames)、cookies、页面重定向(redirects) 等。通过HttpUnit提供的功能,我们可以和服务器端进行信息交互,将返回的网页内容作 为普通文本、XML DOM对象或者是作为链接、页面框架、图像、表单、表格等的集合进 行处理,然后使用 JUnit 框架进行测试;还可以导向一个新的页面,然后进行新页面的处 理,这个功能使我们可以处理一组在一个操作链中的页面,轻松地测试Web页面。 HttpUnit 可以被分为两个核心组件:

● 一个发送请求并接收响应的Web客户机

● 一个分析并验证响应内容的方法集

在这里,我们要澄清一个概念——使用HttpUnit是不是相当于进行单元测试?

与其名称可能暗示的相反,HttpUnit 实际上并不做单元测试。实际上,HttpUnit 更适 合做功能测试或“黑盒”测试。测试人员用HttpUnit编写的测试从外部查询Web服务器并 使我们能够分析接收到的响应。功能测试在 XP 方法中起着重要的作用,这种方法强调功 能测试,使开发者可以获取有关系统整体状态的反馈。使用单元测试,有时会丢失大方向。 在将整个站点投入到实际使用的过程中,自动功能测试可以使开发者从手工检查站点区域 的繁重工作中解脱出来。在 Web 环境中,有些专家认为每个“请求-响应”周期都是原子 的,这些原子的周期可以依次被作为单独的代码单元,因此使用HttpUnit可以被认为是在 进行这种意义上的单元测试。

2. HttpUnit和其他商业工具的对比

商业工具一般使用录制、回放功能来实现测试,但是这里有个缺陷,就是当页面设计 被修改以后,这些被记录的行为就不能重用了,需要重新录制才能继续测试。

举个例子:如果页面上有个元素最先的设计是采用单选框,这个时候你开始测试,那

么这些工具记录的就是你的单项选择动作;但是如果你的设计发生了变化,比如说我改成 了下拉选择,或者使用文本框来接收用户输入,那么这时候,你以前录制的测试过程就无 效了,必须重新录制。

而HttpUnit因为关注点是这些控件的内容,所以不管控件的外在表现形式如何变化, 都不会影响已确定测试的可重用性。

最重要的是,由于 Web 应用的快速发展以及 Web 编程错误容易产生的特征,市场上

出现的许多商业测试产品都用详细的GUI来引导开发者进行测试。另一方面,开放源代码 的 HttpUnit 无需许可费用,而且使用简单(我们将在下面看到这一点)。正是它的简单性, 使它如此受欢迎。虽然没有漂亮的GUI,但HttpUnit Java源代码的可用性和它的简单API, 使开发者能够创建他们自己的测试解决方案以满足特定组织的需要。 以HttpUnit作为基础,第Ⅳ部分 图形用户界面测试篇 ? 256 ?

我们可以用最小的成本构建复杂的测试套件。

8.2.1 HttpUnit环境建立

可以从HttpUnit项目网站—— 2上下载到最新版的HttpUnit,

HttpUnit应运行在支持Java JDK 1.3及更高版本的系统上。

将 HttpUnit 解压缩到 c:/httpunit(后面将使用“%httpunit_home%”引用该目录),目录 结构应该如下所示:

httpunit

+--- jars //包含创建、测试及运行HttpUnit所必需的jar

|

+--- lib // 包含HttpUnit jar

|

+--- doc //文档

| |

| +--- tutorial //基于servlet Web网站的测试优先开发的简单教程 | |

| +--- api // javadoc

| |

| +--- manual // 用户手册

|

+--- examples // 采用HttpUnit编写的一些示例程序

|

+--- src // HttpUnit 源代码

|

+--- test // HttpUnit单元测试的一些很好的例子

只有lib和jars这两个目录对于运行HttpUnit来说是必需的。我们必须将HttpUnit jar 添加到系统的classpath,而其他的一些jar均为可选。

由于我们考虑Web页面是在Eclipse中开发、执行的,所以环境配置都是以Eclipse为 例。如果使用其他的开发工具,则可根据以下步骤进行环境配置。

(1) 启动Eclipse,建立一个Java项目。

(2) 将%httpunit_home%/lib/*.jar、 %httpunit_home%/jars/*.jar加入到该Java项目的Java

build Path变量中。

8.2.2 HttpUnit的工作方式

1. 在使用HttpUnit进行页面测试时,需要特别关注如下几个类

● WebConversation是HttpUnit框架中最重要的类,它用于模拟浏览器的行为。

● WebRequest模仿客户请求,通过它可以向服务器发送信息。 第8章 Web 页面测试 ? 257 ?

● WebResponse模拟浏览器,获取服务器端的响应信息。

下面通过示例介绍上述类的具体应用:

1) 类的最基本应用

System.out.println("直接获取网页内容:");

// 建立一个WebConversation实例

WebConversation wc = new WebConversation();

// 向指定的URL发出请求,获取响应

WebResponse wr = wc.getResponse( " http://localhost:6888/HelloWorld.html " ); // 用getText方法获取响应的全部内容

// 用System.out.println将获取的内容打印在控制台上

System.out.println( wr.getText() );

2) 通过Get方法访问页面并加入参数

System.out.println("向服务器发送数据,然后获取网页内容:");

//建立一个WebConversation实例

WebConversation wc = new WebConversation();

//向指定的URL发出请求

WebRequest req = new GetMethodWebRequest(" http://localhost:6888/HelloWorld.jsp " );

//给请求加上参数

req.setParameter("username","姓名");

//获取响应对象

WebResponse resp = wc.getResponse(req);

//用getText方法获取响应的全部内容

//用System.out.println将获取的内容打印在控制台上

System.out.println(resp.getText());

3) 通过Post方法访问页面并加入参数

System.out.println("使用Post方式向服务器发送数据,然后获取网页内容:"); //建立一个WebConversation实例

WebConversation wc = new WebConversation();

//向指定的URL发出请求

WebRequest req = new PostMethodWebRequest(" http://localhost:6888/HelloWorld.jsp ");

//给请求加上参数

req.setParameter("username","姓名");

//获取响应对象

WebResponse resp = wc.getResponse(req);

//用getText方法获取响应的全部内容

//用System.out.println将获取的内容打印在控制台上 第Ⅳ部分 图形用户界面测试篇 ? 258 ?

System.out.println(resp.getText());

大家可以关注上面代码中打了下划线的两处内容,应该可以看到,使用 Get、Post 方 法访问页面的区别就是使用的请求对象不同。

2. 处理页面中的链接

找到页面中的某一个链接,然后模拟用户的点击行为,获得它指向文件的内容。比如 在页面 HelloWorld.html 中有一个链接,它显示的内容是 TestLink,它指向另一个页面 TestLink.html。TestLink.html页面只显示TestLink.html页面的几个字符。

下面是处理代码:

System.out.println("获取页面中链接指向页面的内容:");

//建立一个WebConversation实例

WebConversation wc = new WebConversation();

//获取响应对象

WebResponse resp = wc.getResponse( " http://localhost:6888/HelloWorld.html " ); //获得页面链接对象

WebLink link = resp.getLinkWith( "TestLink" );

//模拟用户单击事件

link.click();

//获得当前的响应对象

WebResponse nextLink = wc.getCurrentPage();

//用getText方法获取响应的全部内容

//用System.out.println将获取的内容打印在控制台上

System.out.println( nextLink.getText() );

3. 处理页面中的表格

表格是用来控制页面显示的常规对象,HttpUnit 使用数组来处理页面中的多个表格,

我们可以用 resp.getTables()方法获取页面中所有的表格对象。它们依照出现在页面中的顺 序保存在一个数组里面。

注意: Java中数组的下标是从0开始的, 所以取第一个表格时应该是resp.getTables()[0], 其他依此类推。

下面的示例演示了如何从页面中取出第一个表格的内容并将它们循环显示出来:

System.out.println("获取页面中表格的内容:");

//建立一个WebConversation实例

WebConversation wc = new WebConversation();

//获取响应对象

WebResponse resp = wc.getResponse( " http://localhost:6888/HelloWorld.html " ); //获得对应的表格对象

WebTable webTable = resp.getTables()[0]; 第8章 Web 页面测试 ? 259 ? //将表格对象的内容传递给字符串数组

String[][] datas = webTable.asText();

//循环显示表格内容

int i = 0 ,j = 0;

int m = datas[0].length;

int n = datas.length;

while (i<n){

j=0;

while(j<m){

System.out.println("表格中第"+(i+1)+"行第"+(j+1)+"列的内容是:"+datas[j]); ++j;

}

++i;

}

4. 处理页面中的表单

表单用来接收用户输入,也可以向用户显示用户已输入的信息(如需要用户修改数据

时,通常会显示他之前输入过的信息)。HttpUnit使用数组来处理页面中的多个表单,我们 可以用 resp.getForms()方法获取页面中所有的表单对象。它们依照出现在页面中的顺序保 存在一个数组里面。

注意: Java中数组的下标是从0开始的, 所以取第一个表单时应该是resp.getForms()[0], 其他依此类推。

下面的示例演示了如何从页面中取出第一个表单的内容并将它们循环显示出来:

System.out.println("获取页面中表单的内容:");

//建立一个WebConversation实例

WebConversation wc = new WebConversation();

//获取响应对象

WebResponse resp = wc.getResponse( " http://localhost:6888/HelloWorld.html " ); //获得对应的表单对象

WebForm webForm = resp.getForms()[0];

//获得表单中所有控件的名称

String[] pNames = webForm.getParameterNames();

int i = 0;

int m = pNames.length;

//循环显示表单中所有控件的内容

while(i<m){

System.out.println("第"+(i+1)+"个控件的名称是"+pNames+",\

里面的内容是"+webForm.getParameterValue(pNames));

++i; 第Ⅳ部分 图形用户界面测试篇 ? 260 ?

}

第Ⅳ部分 图形用户界面测试篇 ? 264 ?

图8-1 建立JWebUnit测试环境(续表)

8.3.2 JWebUnit应用方法

1. 快速应用

JWebUnit大致有两种方式来建立测试用例:继承模式和委托模式。下面这种是使用继第8章 Web 页面测试 ? 265 ?

承模式继承JWebUnit提供的WebTestCase类,该类继承于junit.framework.TestCase类,代

码示例如下:

import net.sourceforge.jwebunit.WebTestCase;

public class ExampleWebTestCase extends WebTestCase {

public ExampleWebTestCase(String name) {

super(name);

}

}

委托模式的实现比上面的实现方式麻烦一点,代码示例如下:

import junit.framework.TestCase;

import net.sourceforge.jwebunit.WebTester;

public class ExampleWebTestCase extends TestCase {

private WebTester tester;

public ExampleWebTestCase(String name) {

super(name);

tester = new WebTester();

}

}

用户测试用例代码继承了junit.framework.TestCase类, 并在该类的全局变量里声明了一个

WebTester类,该类封装了一些基本的Web操作动作,它属于JWebUnit。在ExampleWeb TestCase 构造函数中将WebTester实例化。委托模式有个好处,代码表现上很简洁,测试动 作和被测试业务代码将被表现得异常清晰,有利于后期的测试开发迭代。

2. HttpUnit和JWebUnit测试方法对比

对Web应用程序自动进行测试意味着跳过Web浏览器,通过程序来处理Web站点。

首先,我们看看 HttpUnit(JWebUnit 的构建块之一)是如何简化这项工作的。HttpUnit可以 模拟帧、JavaScript、页面重定向cookie等等。在将 HttpUnit用于JUnit时,它可以迅速地

对Web站点的功能进行验证。

下面代码显示了一个用 HttpUnit 编写的测试用例,它试图单击 HttpUnit 主页上的 “Cookbook”链接:

1 public class HttpUnitTest {

2 public static void main(String[] args) {

3 try {

4 WebConversation wc = new WebConversation();

5 WebRequest request =

new GetMethodWebRequest("/index.html"); 6 wc.setProxyServer( "", 80 ); 第Ⅳ部分 图形用户界面测试篇 ? 266 ?

7 WebResponse response = wc.getResponse(request);

8 WebLink httpunitLink =

response.getFirstMatchingLink(WebLink.MATCH_CONTAINED_TEXT,"Cookbook"); 9 response = httpunitLink.click();

10 System.out.println("Test successful !!");

11 } catch (Exception e) {

12 System.err.println("Exception: " + e);

13 }

14 }

这段代码的第6 行用 连接 Internet。如果存在直接 Internet 连接,那么

可以把这条语句注释掉。 第8行的语句用于在页面中搜索包含文本Cookbook的Web链接。 第9行的语句用于单击这个链接。如果找到链接,用户将会看到Test Successful!这条消息。 下面代码是用JWebUnit改写后的上述HttpUnit的测试代码,看上去更简单了。

1 public class JWebUnitTest extends WebTestCase{

2 public static void main(String[] args){

3 junit.textui.TestRunner.run(new TestSuite(JWebUnitTest.class));

4 }

5 public void setUp(){

6 getTestContext().setBaseUrl("");

7 getTestContext().setProxyName("webproxy.");

8 getTestContext().setProxyPort(8080);

9 }

10 public void testSearch(){

11 beginAt("/index.html");

12 clickLinkWithText("Cookbook");

13 }

14 }

如果没注意特定于 JUnit 的代码,那么我们可以看到,测试用例现在变得相当整洁、 简练。需要查看的重要的行是第 6 行、第 11 行和第 12 行。

在第 6 行,基本 URL 被设置到 HttpUnit 的主页中。第 11 行用相对路径

/index.html 连接站点。第 12 行用于单击页面上具有文本 Cookbook 的链接。如果链接有 效,那么 JUnit 会报告成功;否则,JUnit 会报告异常。

3. JWebUnit API

每个 JWebUnit 测试的核心都是 net.sourceforge.jwebunit.WebTestCase 类,它代表测试 用例。每个测试用例都必须是从这个类扩展而来的(net.sourceforge. jwebunit.WebTestCase

类本身则是从 junit.framework.TestCase 类扩展而来的,它在 JUnit 中代表测试用例)。 WebTestCase类的重要方法参见表8-1。 第8章 Web 页面测试 ? 267 ?

表8-1 net.sourceforge.jwebunit.WebTestCase类的重要方法

方 法 说 明

public TestContext getTestContext()

得到测试用例的上下文。可以用它访问诸如地区、基本

URL 和 cookie 之类的项目

public void beginAt(String relativeURL) 在相对于基本 URL 的 URL 处开始对话 public void setWorkingForm(String nameOrId)

与指定的表单开始交互。如果当前页面只有一个表单,

就不需要调用这个方法

protected void submit() 提交表单——等同于单击表单的“提交”按钮

public void gotoFrame(String frameName) 激活命名帧

另一个重要的类是net.sourceforge.jwebunit.TestContext,它用于为测试创建上下文。可 以用这个类来处理诸如 cookie、会话和授权之类的信息。表 8-2 显示了这个类的一些重要

方法。

表8-2 net.sourceforge.jwebunit.TestContext 类的重要方法

方 法 说 明

public void addCookie(String name,

String value)

向测试上下文中添加cookie。 在HttpUnitDialog 开始

时,添加的cookie被设置到WebConversation 上

public void setResourceBundleName(String name)

为测试上下文设置一个使用的资源绑定。用于按照

WebTester 中的键查找期望的值

public void setProxyName(String proxyName) 为测试上下文设置代理服务器名称 public void setBaseUrl(String url) 为测试上下文设置基本 URL

8.3.3 JWebUnit测试应用举例

现在我们通过例子来介绍JWebUnit API的实际应用。 我们考察的应用程序是一个测试

用例,用于打开一个Google搜索页面并搜索文本HttpUnit。应用程序需要测试以下场景: ● 打开Google主页。

● 确定该页包含一个名为 q 的表单元素(在 Google 的主页上,名为 q 的文本框用于 接收用户的查询输入条件)。应用程序用这个元素输入搜索参数。

● 在搜索文本框中输入字符串“HttpUnit Home“,并提交表单。

● 获得结果页,并确定该页面包含的链接中包含文本HttpUnit Home。

● 单击包含文本HttpUnit Home的链接。

现在测试场景已经就绪,可以编写 Java 应用程序,用JWebUnit 实现这些需求了。 第一步是声明一个从WebTestCase扩展而来的类,如(1)所示:

(1) 声明测试用例类: 第Ⅳ部分 图形用户界面测试篇 ? 268 ?

public class GoogleTest extends WebTestCase {

static String searchLink = "";

}

正如我们在前面提到过的, JWebUnit要求每个测试用例都是从WebTestCase中扩展而 来的。searchLink保存传入的搜索参数。这个值以命令行参数的形式传递给测试用例。 下一步是声明入口点——main()方法,如(2)所示。

(2) 声明main()方法:

public static void main(String[] args) {

searchLink = args[0];

junit.textui.TestRunner.run(new TestSuite(GoogleTest.class));

}

main()方法调用junit.textui.TestRunner.run()来执行测试用例。 因为需要运行GoogleTest

测试用例,所以作为参数传递给run()方法的测试套件采用GoogleTest.class作为参数。 接下来,浏览用例调用setUp()方法来设置基本 URL 和代理,如(3)所示。

(3) 设置基本URL和代理:

public void setUp() {

getTestContext().setBaseUrl("");

getTestContext().setProxyName("");

getTestContext().setProxyPort(80);

}

上面把基本URL设置为, 这意味着测试用例的启动是相对于这 个URL的。接下来的两条语句设置连接到Internet的代理主机和代理端口,如果是直接连 接到Internet,那么可以忽略代理设置语句。

现在开始浏览站点并输入搜索参数。

(4) 显示了访问Web页面,然后测试所有场景的代码:

(5) 测试所有场景

public void testSearch() {

beginAt("/");

assertFormElementPresent("q");

setFormElement("q", "HttpUnit");

submit("btnG");

assertLinkPresentWithText(searchLink);

clickLinkWithText(searchLink);

}

上述代码连接到基本 URL,并相对于“/”开始浏览。然后它断定页面中包含一个名

为q的表单元素——q是Google主页上查询输入文本框的名称。下一条语句用值HttpUnit

第8章 Web 页面测试 ? 269 ?

来设置名为q的文本框。 再下一条语句提交表单上名为btnG的提交按钮(在Google主页上, 名为btnG的按钮是标签为“Google Search”的按钮)。表单是在这个对话中提交的,下一 页列出搜索结果。在结果页面上,代码首先检查是否有一个链接的文本是HttpUnit Home。 如果该链接不存在,那么测试就以 AssertionFailedError 失败。如果该链接存在,则测试执

行的下一个操作是单击链接。

我们在测试环境中编写上述的完整Java测试程序:

package com.jweb.test;

import junit.framework.TestSuite;

import junit.textui.TestRunner;

import net.sourceforge.jwebunit.TestContext;

import net.sourceforge.jwebunit.WebTestCase;

public class GoogleTest extends WebTestCase

{

static String searchLink = "";

public static void main(String[] args) {

searchLink = args[0];

TestRunner.run(new TestSuite(GoogleTest.class));

}

public void setUp() {

getTestContext().setBaseUrl("");

getTestContext().setProxyName("");

getTestContext().setProxyPort(80);

}

public void testSearch() {

beginAt("/");

assertFormElementPresent("q");

setFormElement("q", "HttpUnit");

submit("btnG");

assertLinkPresentWithText(searchLink);

clickLinkWithText(searchLink);

}

}

在控制台执行java com.jweb.test.GoogleTest "HttpUnit Home"命令,运行程序。 在执行了测试用例之后,会在命令行输出一个测试用例报告。如果测试失败,报告将 看起来如(6)中所示。

(6) 带有断言失败的输出:

C:\temp>java com.jweb.test.GoogleTest "HttpUnit Hwee"

.F

Time: 5.338 第Ⅳ部分 图形用户界面测试篇 ? 270 ?

There was 1 failure:

1) testSearch(com.jweb.test.GoogleTest)junit.framework.AssertionFailedError: Link with text [HttpUnit Hwee] not found in response.

at

net.sourceforge.jwebunit.WebTester.assertLinkPresentWithText(WebTester.java:618) at

net.sourceforge.jwebunit.WebTestCase.assertLinkPresentWithText(WebTestCase.java:244)

at com.jweb.test.GoogleTest.testSearch(GoogleTest.java:36)

at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)

at sun.reflect.NativeMethodAccessorImpl.invoke(Unknown Source)

at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source) at com.jweb.test.GoogleTest.main(GoogleTest.java:19)

FAILURES!!!

Tests run: 1, Failures: 1, Errors: 0

正如在(6)中可以看到的,可以以HttpUnit Hwee作为参数来执行测试用例。这个测试 用例遇到断言的地方会失败,因为结果页面中不包含带有这个文本的链接。由此也就产生 了junit.framework.AssertionFailedError。

在(7)中执行时以HttpUnit Home作为参数。 测试用例找到了一个带有这个文本的链接, 所以测试通过了。

(7) 成功测试的输出:

C:\temp>java com.jweb.test.GoogleTest "HttpUnit Home"

.

Time: 6.991

OK (1 test)

8.3.4 JWebUnit应用小结

前面通过讨论 JWebUnit 框架的一些突出特性和最重要的类,介绍了如何用它创建简

洁的测试用例,使大家能够对 JWebUnit 框架有一个认识。JWebUnit 还有更多特性可以用 在测试用例中。它支持测试Web页面中的链接行数,可以对字符串、表或者带有指定标签 的表单输入元素是否存在于页面上进行断言。此外,JWebUnit 还可以处理 cookie(例如断

言存在某个 cookie、删除 cookie 等)。测试可以对某个文本之后出现的特定文本的链接进 行单击。如果想为Web应用程序构建快而有效的测试用例,JWebUnit可能是最好的工具。 实验习题

1. 应用HtmlUnit对Web应用进行测试,并给出具体的测试过程,同时与HttpUnit进 行比较。

2. 在 Eclipse 环境下建立 swtbot 的 Web 应用测试环境,并对具体的 Web 应用进行测 试,详细描述测试过程。

更多相关推荐:
web系统性能测试报告

web系统性能测试报告1总述11测试对象web系统数据库建表sql的版本是20xx02281程序代码的版本是20xx0310112测试目的确定系统支持的最大并发用户数系统的处理能力能达到2次请求分钟13测试环境...

范例(web系统性能测试报告)

系统性能测试报告南海东软信息技术职业学院YYYY年MM月DD日文档说明本文档所涉及到的文字和图表仅限开发方和需求方内部使用未经开发方的书面许可请勿扩散到任何第三方目录1总述111测试对象112测试目的113测试...

web压力测试实验报告

软件测试实验报告班级030513学号03051235姓名陆义良地点E508时间20xx年5月16日软件测试实验报告03051235陆义良实验目的一理解web压力测试概念二熟练运用WASwebapplicatio...

web系统测试

测试基于Web的应用程序测试web应用程序和测试桌面系统用很多共同点例如你需要和执行所有标准测试类型一样测试常见的功能点配置及兼容性但是由于与应用程序交互的所有分布式系统组件的复杂性成倍的增加的原因导致web应...

web测试最全的功能测试范例

Web测试有以下几点需要关注UI测试UI测试包括的内容有如下几方面1各页面的风格是否统一2各页面的大小是否一致同样的LOGO图片在各个页面中显示是否大小一致页面及图片是否居中显示3各页面的title是否正确4栏...

web系统性能测试实验报告

附录实验报告格式一实验目的应用Web测试工具对Web系统进行功能和性能测试二实验内容2题目二对博客测试网站进行性能测试1题目内容描述要求使用LoadRunner对博客网站进行性能测试重点进行用户并发测试并发测试...

web测试常用工具

1兼容性测试2负载测试3性能测试4安全测试5HTML代码检查web测试常用工具1Selenium兼容性测试Selenium是一个用于Web应用程序测试的工具Selenium测试直接运行在浏览器中就像真正的用户在...

Web_应用开发——软件测试分析报告

Web应用开发大赛信息管理系统测试分析报告学校名称指导老师完成日期文档修改历史记录1目录一引言11编写目的12项目背景33定义34参考资料3二测试计划执行情况程31测试项目42测试机构和人员43测试结果4三软件...

测试新手怎么进行web测试

测试新手怎么进行web测试作者发布时间20xx1103浏览次数144次要做web测试首先要弄清楚web测试的测试范围通常web测试包含功能测试性能测试浏览器兼容测试安全测试以及用户界面测试等作为一个初级测试员或...

web测试知识

Web测试知识由于Web应用与用户直接相关又通常需要承受长时间的大量操作因此Web项目的功能和性能都必须经过可靠的验证这就要经过Web项目的全面测试Web测试通常通过界面测试功能测试性能测试几个方面来进行测试方...

安全监控系统功能测试报告

安全监控系统功能测试报告

Web安全性测试

安全性测试安全性测试安全性测试主要是测试系统在没有授权的内部或者外部用户对系统进行攻击或者恶意破坏时如何进行处理是否仍能保证数据和页面的安全测试人员可以学习一些黑客技术来对系统进行攻击另外对操作权限的测试也包含...

web测试报告(15篇)