1 HttpUnit安装、环境配置
1.1 安装
1. 到HttpUnit的主页http://httpunit.sourceforge.net下载最新的包文件,当前的最新版本是1.7。
maven 配置httpunit pom.xml
<dependency>
<groupId>httpunit</groupId>
<artifactId>httpunit</artifactId>
<version>1.5</version>
</dependency>
<dependency>
<groupId>rhino</groupId>
<artifactId>js</artifactId>
<version>1.5R4.1</version>
</dependency>
<dependency>
<groupId>nekohtml</groupId>
<artifactId>nekohtml</artifactId>
<version>1.9.6.2</version>
</dependency>
2 如何使用httpunit处理页面的内容
WebConversation类是HttpUnit框架中最重要的类,它用于模拟浏览器的行为。其他几个重要的类是:
WebRequest类,模仿客户请求,通过它可以向服务器发送信息。
WebResponse类,模拟浏览器获取服务器端的响应信息。
3.1 获取指定页面的内容
3.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() );
3.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() );
3.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方法访问页面的区别就是使用的请求对象不同。
3.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() );
3.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;
}
3.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;
}
4 如何使用httpunit进行测试
4.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]);
4.2 对Servlet进行测试
除了对页面内容进行测试外,有时候(比如开发复杂的Servlets的时候),你需要对Servlet本身的代码块进行测试,这时候你可以选择HttpUnit,它可以提供一个模拟的Servlet容器,让你的Servlet代码不需要发布到Servlet容器(如tomcat)就可以直接测试。
4.2.1 原理简介
使用httpunit测试Servlet时,请创建一个ServletRunner的实例,他负责模拟Servlet容器环境。如果你只是测试一个Servlet,你可以直接使用registerServlet方法注册这个Servlet,如果需要配置多个Servlet,你可以编写自己的web.xml,然后在初始化ServletRunner的时候将它的位置作为参数传给ServletRunner的构造器。
在测试Servlet时,应该记得使用ServletUnitClient类作为客户端,他和前面用过的WebConversation差不多,都继承自WebClient,所以他们的调用方式基本一致。要注意的差别是,在使用ServletUnitClient时,他会忽略URL中的主机地址信息,而是直接指向他的ServletRunner实现的模拟环境。
4.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());
4.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());
[注意]
分享到:
相关推荐
#### 三、使用HttpUnit进行Web页面测试 ##### 1. 获取指定网页内容 ```java System.out.println("直接获取网页内容:"); // 创建一个WebConversation实例 WebConversation wc = new WebConversation(); // 指定URL...
开发者可以使用HttpUnit编写测试用例,检查服务器返回的HTTP状态码、页面内容、表单提交结果等。 4. **Tidy.jar**:Tidy是一个HTML解析器,能够处理不规范的HTML代码。在测试过程中,HttpUnit可能遇到格式不标准的...
6. **无界面测试**:HttpUnit的一个优点是它的无界面特性,这意味着测试可以在没有图形用户界面的环境中运行,如持续集成服务器上。 在"www.pudn.com.txt"文件中,可能包含了示例代码或者是一些关于如何使用...
**基于Junit的HttpUnit测试** 在软件开发中,单元测试是确保代码质量的重要环节,它可以帮助开发者在早期发现和修复问题,提高软件的稳定性和可靠性。`JUnit` 是一个广泛使用的 Java 测试框架,而 `HttpUnit` 则是...
项目实现了JAVA底层自动打开页面,模拟事件操作,获取源文件整体功能。 继承了httpunit selenium两组插件包。 包含完全源代码和JAVA包。 自己花了20多个积分,东拼西凑,用了一个星期,总算把程序调通。希望后来者...
5. **断言验证**:测试过程中,开发者可以使用HTTPUnit进行断言来验证响应是否符合预期,比如确认页面内容、状态码或头信息。 描述中的链接指向了一个博客文章,虽然无法在此直接访问,但通常这样的链接会提供使用...
3. **模拟用户交互**:对于动态网页,HttpUnit能模拟用户与页面的交互,如点击按钮、填写表单等,这对于测试网页应用非常有用。 4. **异常处理**:如果服务器返回错误状态码或网络出现问题,HttpUnit会抛出相应的...
使用HttpUnit,开发者可以编写单元测试或集成测试,以验证Web应用程序的功能。 1. **HttpUnit的基本使用**: - 创建`WebConversation`对象,这是HttpUnit执行请求的基础。 - 使用`WebConversation`的`...
3. JavaScript支持:虽然HTTPUnit最初设计时并不支持JavaScript,但后来的版本增加了一定程度的JavaScript执行能力,允许测试某些基于JavaScript的页面功能。这部分源代码可能涉及到JavaScript引擎的集成和调用。 4...
它模拟浏览器行为,允许开发者在没有图形用户界面的情况下测试Web应用程序。这个工具特别适用于那些需要进行功能测试、集成测试或者端到端测试的项目,因为它们可以高效地验证服务器端的逻辑,而不必依赖于复杂的...
1. **HTTPUnit**:HTTPUnit是一个Java库,用于单元测试Web应用程序。它允许开发者模拟浏览器行为,发送HTTP请求并接收响应,而无需实际的浏览器环境。在本实例中,`HttpUtilTest`类是HTTPUnit的使用示例,通过它我们...
它能够执行JavaScript,加载和渲染HTML页面,这对于HTTPUnit测试Web应用中的动态内容尤其重要。HTMLUnit2.21版本与HTTPUnit2.21相匹配,确保了两者之间的兼容性。 使用HTTPUnit进行Web应用测试时,开发者可以编写...
HTTPUnit常用于Web应用的单元测试和集成测试,尤其适合于那些没有复杂DOM操作或大量JavaScript交互的页面。它也可以作为开发工具,快速验证服务端接口的正确性,或者在没有浏览器环境的情况下进行测试。 总结,...
通过HttpUnit,开发者可以创建测试脚本来模拟用户与JSP页面的交互,检查服务器的响应,确保Web应用功能的正确性。 标签"www.pudn.com.txt"可能是指这个压缩包来源于PUDN(太平洋下载网)的一个文本文件,通常这样的...
HttpUnit 是一个Java库,它允许开发者在没有实际浏览器参与的情况下对Web应用程序进行自动化测试。这个工具主要用于单元测试,它模拟浏览器行为,可以执行HTTP请求,解析HTML响应,并检查返回的内容、链接、表单和...
对于自动化测试,可以编写JUnit测试用例,集成HttpUnit来模拟用户交互。这样,每次运行测试时,都可以检查网页行为是否符合预期,从而确保代码质量。 总之,HttpUnit提供了一种高效且灵活的方式来模拟JavaScript...
HttpUnit特别适合用于测试Web应用的功能性和完整性,包括检查特定页面是否存在、验证页面重定向是否正确、验证页面内容是否符合预期,以及测试链接和表单的正确性。对于Servlet的内部逻辑测试,HttpUnit的`...
在HttpUnit中,测试者可以模拟浏览器的各种行为,如提交表单、处理JavaScript、执行基本的HTTP认证、管理cookies以及自动处理页面重定向。HttpUnit还提供了一个内建的Servlet容器模拟器,允许测试者直接对Servlet的...
### HttpUnit与JWebUnit在Web应用测试中的应用 #### 概述 随着Web应用程序的日益普及和发展,确保这些应用程序的稳定性和功能性变得至关重要。测试是软件开发过程的关键部分,对于Web应用程序而言更是如此。本篇...