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进行集成测试使用HttpUnit进行集成测试使用HttpUnit进行集成测试使用HttpUnit进行集成测试
HttpUnit 是基于JUnit构建的一个开源测试框架,专门针对Web应用的测试,解决使用JUnit框架无法对远程Web内容进行测试,支持JS,cookies。。。。
可以利用httpunit做网站接口测试和网站自动化测试
内部含有httpunit单元测试所必需的jar包 httpunit.jar, js.jar, nekohtml.jar, xercesImpl.jar, xercesSamples.jar, servlet-api.jar, resolver.jar
项目实现了JAVA底层自动打开页面,模拟事件操作,获取源文件整体功能。 继承了httpunit selenium两组插件包。 包含完全源代码和JAVA包。 自己花了20多个积分,东拼西凑,用了一个星期,总算把程序调通。希望后来者...
使用HttpUnit提供的类完成集成测试源码
如何使用HttpUnit进行集成测试软件测试1HttpUnit简介HttpUnit是SourceForge下面的一个开源项目,它是基于JUnit的一个测试框架,主要关注于测试Web应用,解决使用JUnit框架无法对远程Web内容进行测试的弊端。...
HttpUnit是SourceForge下面的一个开源项目,它是基于JUnit的一个测试框架,主要关注于测试Web应用,解决使用JUnit框架无法对远程Web内容进行测试的弊端。 HttpUnit让测试者可以通过Java类和服务器进行交互,并且将...
java爬取工具httpunit全部jar包(包含httpunit使用需要的全部jar包),经过测试,可以使用
NULL 博文链接:https://jisonami.iteye.com/blog/2202505
httpunit-1.7.jar下载
HttpUnit所有依赖打包下载,HttpUnit是一个集成测试工具,主要关注Web应用的测试,提供的帮助类让测试者可以通过Java类和服务器进行交互,并且将服务器端的响应当作文本或者DOM对象进行处理。HttpUnit还提供了一个...
httpunit-1.7相关所有jar文件,说明文档,示例及httpunit程序的源码
httpunit.jar
httpunit-1.7.rar 包含所需的jar包
httpunit源代码,便于学习httpunit的原理
httpUnit1.7_API,英文版,非常有用的东西,分享给大家。
httpUnit的应用模拟登录一个网站 程序比较简单,用了jxl和httpUnit二个开源的包,从execl表格中读取数据,然后进行登录,并进行了一些操作
附件是一个完整的web工程(带源码),用jdk1.8及以上编译后可运行, HttpUtilTest类中有两个测试实例,所涉及的数据都有来自ajax异步的