软件测试中使用HttpUnit进行集成测试

发表于:2009-11-11来源:作者:点击数: 标签:软件测试HttpUnithttpunit
软件测试 中使用HttpUnit进行集成测试 [内容摘要] HttpUnit是一个集成 测试工具 ,主要关注Web应用的测试,提供的帮助类让测试者可以通过 Java 类和 服务器 进行交互,并且将服务器端的响应当作文本或者DOM对象进行处理。HttpUnit还提供了一个模拟Servlet容

软件测试中使用HttpUnit进行集成测试

[内容摘要] HttpUnit是一个集成测试工具,主要关注Web应用的测试,提供的帮助类让测试者可以通过Java类和服务器进行交互,并且将服务器端的响应当作文本或者DOM对象进行处理。HttpUnit还提供了一个模拟Servlet容器,让你可以不需要发布Servlet,就可以对Servlet的内部代码进行测试。本文中作者将详细的介绍如何使用HttpUnit提供的类完成集成测试。

关键词: httpunit 集成测试
 1 HttpUnit简介
 HttpUnit是SourceForge下面的一个开源项目,它是基于JUnit的一个测试框架,主要关注于测试Web应用,解决使用JUnit框架无法对远程Web内容进行测试的弊端。当前的最新版本是1.5.4。为了让HtpUnit正常运行,你应该安装JDK1.3.1或者以上版本。

 1.1 工作原理
 HttpUnit通过模拟浏览器的行为,处理页面框架(frames),cookies,页面跳转(redirects)等。通过HttpUnit提供的功能,你可以和服务器端进行信息交互,将返回的网页内容作为普通文本、XML Dom对象或者是作为链接、页面框架、图像、表单、表格等的集合进行处理,然后使用JUnit框架进行测试,还可以导向一个新的页面,然后进行新页面的处理,这个功能使你可以处理一组在一个操作链中的页面。

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

 举个例子:如果页面上有个元素最先的设计是采用单选框,这个时候你开始测试,那么这些工具记录的就是你的单项选择动作,但是如果你的设计发生了变化,比如说我改成了下拉选择,或者使用文本框接受用户输入,这时候,你以前录制的测试过程就无效了,必须要重新录制。
而HttpUnit因为关注点是这些控件的内容,所以不管你的外在表现形式如何变化,都不影响你已确定测试的可重用性。

更多的关于httpunit的信息请访问httpunit的主页 http://httpunit.sourceforge.net/

 2 作者的演示环境
 系统平台:Windows 2000 Sercver
 应用服务器:深圳金蝶的apusic3.0
 开发工具: eclipse 2.1.2
 说明: 所有的代码请下载作者提供的code.jar文件。

 3 HttpUnit安装、环境配置
 3.1 安装
 1. 到HttpUnit的主页 http://httpunit.sourceforge.net 下载最新的包文件,当前的最新版本是1.5.4。/
 2. 将下载。Zip包解压缩到c:/httpunit(后面将使用%httpunit_home%引用该目录)
 
 3.2 环境配置
 作者的演示程序都是在eclipse中开发、执行的,所以环境配置都是以eclipse为例,如果你使用其他的开发工具,请根据这些步骤进行环境配置。

 1. 启动eclipse,建立一个java工程
 2. 将%httpunit_home%/lib/*.jar; %httpunit_home%/jars/*.jar加入到该java工程的Java build Path变量中
 
 4 如何使用httpunit处理页面的内容
 WebConversation类是HttpUnit框架中最重要的类,它用于模拟浏览器的行为。其他几个重要的类是:
 WebRequest 模仿客户请求,通过它可以向服务器发送信息
 WebResponse 模拟浏览器获取服务器端的响应信息

 4.1 获取指定页面的内容

 4.1.1 直接获取页面内容

clearcase/" target="_blank" >cccccc>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() );

4.1.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() );

4.1.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将获取的内容打印在控制台上
 System.out.println( resp.getText() );

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

 4.2 处理页面中的链接
 这里的演示是找到页面中的某一个链接,然后模拟用户的单机行为,获得它指向文件的内容。比如在我的页面HelloWorld.html中有一个链接,它显示的内容是TestLink,它指向我另一个页面TestLink.htm. TestLink.htm里面只显示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() );

4.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];
 //将表格对象的内容传递给字符串数组
 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;
 }

原文转自:http://www.ltesting.net