`
高级java工程师
  • 浏览: 404986 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

httpUnit测试htnm

阅读更多
httpUnit测试html 、servlet、jsp

内容摘要

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

应用服务器:深圳金蝶的apusic3.0

开发工具: eclipse 2.1.2

3  HttpUnit安装、环境配置

3.1  安装

1. 到HttpUnit的主页http://httpunit.sourceforge.net下载最新的包文件,当前的最新版本是1.5.4。 

2. 将下载的Zip包解压缩到c:/httpunit(后面将使用%httpunit_home%引用该目录) 

3.2  环境配置

作者的演示程序都是在eclipse中开发、执行的,所以环境配置都是以eclipse为例,如果你使用其他的开发工具,请根据这些步骤进行环境配置。

启动eclipse,建立一个java工程 
将%httpunit_home%/lib/*.jar; %httpunit_home%/jars/*.jar加入到该java工程的Java build Path变量中 
4  如何使用httpunit处理页面的内容

WebConversation类是HttpUnit框架中最重要的类,它用于模拟浏览器的行为。其他几个重要的类是:

WebRequest类,模仿客户请求,通过它可以向服务器发送信息。

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

4.1  获取指定页面的内容

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

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[i][j]);
    ++j;
  }
  ++i;
}

4.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[i]+
   ",里面的内容是"+webForm.getParameterValue(pNames[i]));
   ++i;
}

5  如何使用httpunit进行测试

5.1  对页面内容进行测试

httpunit中的这部分测试完全采用了JUnit的测试方法,即直接将你期望的结果和页面中的输出内容进行比较。不过这里的测试就简单多了,只是字符串和字符串的比较。

比如你期望中的页面显示是中有一个表格,它是页面中的第一个表格,而且他的第一行第一列的数据应该是显示username,那么你可以使用下面的代码进行自动化测试:

System.out.println("获取页面中表格的内容并且进行测试:");
//建立一个WebConversation实例
WebConversation wc = new WebConversation();
//获取响应对象
WebResponse   resp = wc.getResponse( "http://localhost:6888/TableTest.html" );
//获得对应的表格对象
WebTable webTable = resp.getTables()[0];
//将表格对象的内容传递给字符串数组
String[][] datas = webTable.asText();
//对表格内容进行测试
String expect = "中文";
Assert.assertEquals(expect,datas[0][0]);

5.2  对Servlet进行测试

除了对页面内容进行测试外,有时候(比如开发复杂的Servlets的时候),你需要对Servlet本身的代码块进行测试,这时候你可以选择HttpUnit,它可以提供一个模拟的Servlet容器,让你的Servlet代码不需要发布到Servlet容器(如tomcat)就可以直接测试。 

5.2.1  原理简介

使用httpunit测试Servlet时,请创建一个ServletRunner的实例,他负责模拟Servlet容器环境。如果你只是测试一个Servlet,你可以直接使用registerServlet方法注册这个Servlet,如果需要配置多个Servlet,你可以编写自己的web.xml,然后在初始化ServletRunner的时候将它的位置作为参数传给ServletRunner的构造器。

在测试Servlet时,应该记得使用ServletUnitClient类作为客户端,他和前面用过的WebConversation差不多,都继承自WebClient,所以他们的调用方式基本一致。要注意的差别是,在使用ServletUnitClient时,他会忽略URL中的主机地址信息,而是直接指向他的ServletRunner实现的模拟环境。

5.2.2  简单测试

本实例只是演示如何简单的访问Servlet并且获取他的输出信息,例子中的Servlet在接到用户请求的时候只是返回一串简单的字符串:Hello World!. 

1. Servlet的代码如下: 

public class MyServlet extends HttpServlet {

 public void service(HttpServletRequest req, HttpServletResponse resp)
 throws IOException
 {
  PrintWriter out = resp.getWriter();
  //向浏览器中写一个字符串Hello World!
  out.println("Hello World!");
  out.close();
 } 
          
}

2. 测试的调用代码如下: 

//创建Servlet的运行环境
ServletRunner sr = new ServletRunner();
//向环境中注册Servlet
sr.registerServlet( "myServlet", MyServlet.class.getName() );
//创建访问Servlet的客户端
ServletUnitClient sc = sr.newClient();
//发送请求
WebRequest request   = new GetMethodWebRequest( "http://localhost/myServlet" );
//获得模拟服务器的信息
WebResponse response = sc.getResponse( request );
//将获得的结果打印到控制台上
System.out.println(response.getText());

5.2.3  测试Servlet的内部行为

对于开发者来说,仅仅测试请求和返回信息是不够的,所以HttpUnit提供的ServletRunner模拟器可以让你对被调用Servlet内部的行为进行测试。和简单测试中不同,这里使用了InvocationContext获得该Servlet的环境,然后你可以通过InvocationContext对象针对request、response等对象或者是该Servlet的内部行为(非服务方法)进行操作。

下面的代码演示了如何使用HttpUnit模拟Servlet容器,并且通过InvocationContext对象,测试Servlet内部行为的大部分工作,比如控制request、session、response等。

//创建Servlet的运行环境
ServletRunner sr = new ServletRunner();
//向环境中注册Servlet
sr.registerServlet( "InternalServlet", InternalServlet.class.getName() );
//创建访问Servlet的客户端
ServletUnitClient sc = sr.newClient();

//发送请求
WebRequest request   = new GetMethodWebRequest( "http://localhost/InternalServlet" );
request.setParameter("pwd","pwd");
//获得该请求的上下文环境
InvocationContext ic = sc.newInvocation( request );
        
//调用Servlet的非服务方法
InternalServlet is = (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"));
          
//使用客户端获取返回信息,并且打印出来
WebResponse response = ic.getServletResponse();
System.out.println(response.getText());

[注意]

在测试Servlet的之前,你必须通过InvocationContext完成Servlet中的service方法中完成的工作,因为通过newInvocation方法获取InvocationContext实例的时候该方法并没有被调用。

6  总结

本文中,作者详细的演示和介绍了如何使用HttpUnit提供的类来进行集成测试,主要实现以下操作:

模拟用户行为向服务器发送请求,传递参数 
模拟用户接受服务器的响应信息,并且通过辅助类分析这些响应信息,结合JUnit框架进行测试 
使用HttpUnit提供的模拟Servler容器,测试开发中的Servlet的内部行为 
参考资料

HttpUnit帮助  http://httpunit.sourceforge.net 
JUnit帮助  http://junit.org/index.htm 

分享到:
评论

相关推荐

    httpunit测试包

    `HttpUnit` 是一个Java库,主要用于模拟浏览器行为,执行网页接口测试和网站自动化测试。这个“httpunit测试包”包含了多个组件和依赖库,这些组件和库一起支持了HttpUnit的功能,让我们逐一解析其中的关键部分。 1...

    基于Junit的HttpUnit测试

    **基于Junit的HttpUnit测试** 在软件开发中,单元测试是确保代码质量的重要环节,它可以帮助开发者在早期发现和修复问题,提高软件的稳定性和可靠性。`JUnit` 是一个广泛使用的 Java 测试框架,而 `HttpUnit` 则是...

    使用HttpUnit进行集成测试使用HttpUnit进行集成测试

    使用HttpUnit进行集成测试使用HttpUnit进行集成测试使用HttpUnit进行集成测试使用HttpUnit进行集成测试

    使用HttpUnit进行集成测试

    ### 使用HttpUnit进行集成测试 #### 一、HttpUnit简介 HttpUnit是一个强大的开源测试工具,主要用于Web应用程序的集成测试。它基于JUnit构建,并且在功能上做了许多增强,能够帮助开发者有效地完成针对Web应用的...

    selenium httpunit测试程序

    继承了httpunit selenium两组插件包。 包含完全源代码和JAVA包。 自己花了20多个积分,东拼西凑,用了一个星期,总算把程序调通。希望后来者能够减少弯路。 驱动器 C 中的卷是 系统 卷的序列号是 68C8-B91E C:\...

    使用HttpUnit进行集成测试源码.zip_Httpunit

    HttpUnit 是一个Java库,专为Web应用程序设计的集成测试框架。它允许开发者模拟浏览器行为,执行HTTP请求并检查响应结果,从而无需实际浏览器就能测试Web应用的功能。这个压缩包"使用HttpUnit进行集成测试源码.zip_...

    httpunit所有需要的包

    HTTPUnit 是一个Java库,主要用于自动化Web应用程序的测试。它模拟浏览器行为,允许开发者无需实际浏览器就能测试网页的响应和交互。这个压缩包文件“httpunit所有需要的包”包含了运行HTTPUnit测试所需的所有组件。...

    httpunit单元测试所需jar包

    内部含有httpunit单元测试所必需的jar包 httpunit.jar, js.jar, nekohtml.jar, xercesImpl.jar, xercesSamples.jar, servlet-api.jar, resolver.jar

    httpUnit的应用模拟登录一个网站

    使用HttpUnit,开发者可以编写单元测试或集成测试,以验证Web应用程序的功能。 1. **HttpUnit的基本使用**: - 创建`WebConversation`对象,这是HttpUnit执行请求的基础。 - 使用`WebConversation`的`...

    httpunit2.21jar及关联jar包

    HTTPUnit 是一个Java库,主要用于自动化Web应用程序的测试。它提供了对HTTP协议的模拟,使得开发者可以在不依赖浏览器的情况下测试Web应用。这个标题提到的是HTTPUnit的2.21版本的jar包及其关联的jar包。在Java开发...

    httpunit-1.7

    《深入解析Java Web测试工具HttpUnit 1.7》 HttpUnit是一款强大的Java实现的Web测试工具,专为简化Web应用程序的功能和负载测试而设计。它允许开发者在没有实际浏览器参与的情况下模拟用户与Web应用程序的交互,...

    httpunit jar包以及关于它文档

    5. 性能测试和压力测试通常不在HTTPUnit的范畴内,如果需要进行这类测试,可以考虑使用Apache JMeter或其他专门的性能测试工具。 总之,HTTPUnit是一个强大的工具,它为Java开发者提供了简洁的API,使得测试Web应用...

    httpunit-1.7相关所有jar文件

    HTTPUnit是一个Java库,专为Web应用程序测试设计。它允许开发者模拟浏览器行为,执行HTTP请求并解析响应,而无需实际浏览器的参与。这个工具在自动化测试领域非常有用,特别是在进行功能测试和集成测试时,可以极大...

    java爬取工具httpunit全部jar包(包含httpunit使用需要的全部jar包)

    在Java中,HttpUnit是一个强大的工具,专门设计用于模拟浏览器行为,进行无头(headless)测试和网页抓取。这个压缩包包含了使用HttpUnit进行网页爬取所需的所有jar包,确保了在你的开发环境中可以直接运行而无需...

    httpunit-1.6.2.zip_Httpunit_httpun_httpunit-1.5.41.zip_httpunit-

    HttpUnit 是一个强大的Java库,专门用于自动化Web应用程序的测试。在标题中提到的"Httpunit-1.6.2.zip_Httpunit_httpun_httpunit-1.5.41.zip_httpunit-",这可能是一个包含不同版本的HttpUnit库的压缩包,包括...

    httpunit源代码

    HTTPUnit 是一个Java库,主要用于自动化Web客户端测试。它允许开发者模拟浏览器行为,发送HTTP请求并接收响应,而无需实际的浏览器参与。这个库在Web应用程序的单元测试中非常有用,因为它可以快速、高效地测试...

    如何使用HttpUnit进行集成测试

    如何使用HttpUnit进行集成测试软件测试1HttpUnit简介HttpUnit是SourceForge下面的一个开源项目,它是基于JUnit的一个测试框架,主要关注于测试Web应用,解决使用JUnit框架无法对远程Web内容进行测试的弊端。...

    httpunit Java模拟JS点击事件

    对于自动化测试,可以编写JUnit测试用例,集成HttpUnit来模拟用户交互。这样,每次运行测试时,都可以检查网页行为是否符合预期,从而确保代码质量。 总之,HttpUnit提供了一种高效且灵活的方式来模拟JavaScript...

    httpUnit1.7_API

    HttpUnit 是一个Java库,它允许开发者在没有实际浏览器参与的情况下对Web应用程序进行自动化测试。这个工具主要用于单元测试,它模拟浏览器行为,可以执行HTTP请求,解析HTML响应,并检查返回的内容、链接、表单和...

    httpUnit完整的web工程实例,包括源码和依赖包,数据页面具有异步数据

    1. **HTTPUnit**:HTTPUnit是一个Java库,用于单元测试Web应用程序。它允许开发者模拟浏览器行为,发送HTTP请求并接收响应,而无需实际的浏览器环境。在本实例中,`HttpUtilTest`类是HTTPUnit的使用示例,通过它我们...

Global site tag (gtag.js) - Google Analytics