`
darxin
  • 浏览: 8011 次
  • 性别: Icon_minigender_1
  • 来自: 大连
文章分类
社区版块
存档分类
最新评论

利用HttpUnit测试Servlet类

阅读更多

Creative Commons License

传统的Java WEB应用中,核心技术莫过于Servlet类与JSP网页,两者均可以通过HttpUnit程序包完成单元测试。对JSP网页的测试主要集中在判断HTTP服务器返回的内容是否符合要求,并且这种测试只能在WEB容器内进行。对于Servlet类的测试,HttpUnit程序包给出了一个非容器内的测试方案,那就是ServletRunner类的使用。

简单测试

为了测试Servlet类,首先要在ServletRunner中注册Servlet类,例如:

// 模拟WEB服务器
ServletRunner sr = new ServletRunner();
sr.registerServlet( "hello.html", HelloServlet.class.getName() );

 

上文注册了一个HelloServlet,当程序发出“hello.html”的HTTP请求时,ServletRunner就会调用HelloServlet类予以响应,如:

// 模拟HTTP客户端
ServletUnitClient sc = sr.newClient();

// 创建请求
WebRequest request   =
    new GetMethodWebRequest( "http://localhost/hello.html" );

// 返回响应
WebResponse response = sc.getResponse( request );

// 校验结果
assertEquals("text/plain", response.getContentType());
assertEquals("UTF-8", response.getCharacterSet());
assertEquals("中国", response.getText());

 

根据上述测试过程,我们的HelloServlet类实现如下:

import java.io.IOException;
import java.io.PrintWriter;

import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

public class HelloServlet extends HttpServlet {

    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp)
            throws ServletException, IOException {

        resp.setContentType("text/plain");
        resp.setCharacterEncoding("UTF-8");

        PrintWriter pw = resp.getWriter();
        pw.write("中国");
    }
}

 

当然,我们也可以判断Servlet类操作session的过程是否正确,如:

import junit.framework.TestCase;

import com.meterware.httpunit.GetMethodWebRequest;
import com.meterware.httpunit.WebRequest;
import com.meterware.httpunit.WebResponse;
import com.meterware.servletunit.ServletRunner;
import com.meterware.servletunit.ServletUnitClient;

public class HelloTest extends TestCase {

    public void testHelloServlet() throws Exception {
       
        ServletRunner sr = new ServletRunner();
        sr.registerServlet("hello.html", HelloServlet.class.getName());
       
        ServletUnitClient sc = sr.newClient();
       
        WebRequest request   =
            new GetMethodWebRequest( "http://localhost/hello.html" );
        WebResponse response = sc.getResponse( request );
       
        // 判断session中的值
        assertEquals("darxin", sc.getSession(false).getAttribute("userId"));
       
        assertEquals("text/plain", response.getContentType());
        assertEquals("UTF-8", response.getCharacterSet());
        assertEquals("中国", response.getText());       
    }
}

 

相应的,我们的Servlet类会做如下改动:

import java.io.IOException;
import java.io.PrintWriter;

import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

public class HelloServlet extends HttpServlet {

    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp)
            throws ServletException, IOException {

        // 向session中设置属性
        req.getSession().setAttribute("userId", "darxin");
       
        resp.setContentType("text/plain");
        resp.setCharacterEncoding("UTF-8");

        PrintWriter pw = resp.getWriter();
        pw.write("中国");
    }
}

 

高级应用

上述两例均属于在Servlet类中直接打印响应信息的情况,在实际应用中这种调用已经很少见了。通常我们会利用MVC架构实现Servlet类与JSP网页的功能分离。例如使用Servlet类完成Controller的任务;使用JSP网页完成View的任务。
下图展示了一个典型的利用MVC架构实现HTTP响应的过程:




根据这个图可以看出,第五步会在Servlet类用到转向操作,转向操作的方法如下例:

// 转向到新的servlet
request.getRequestDispatcher("main.html").forward(request, response);    
 

如何测试具有转向功能的Servlet类呢?首先要明确对于这一类Servlet,我们要测试它们的什么功能:
第一, Servlet类在转向前都保存了哪些数据?保存这些数据的位置在哪儿?
第二, Servlet类是否转向到正确的位置上了?

需要注意的是,通常情况下作为Controller的Servlet类是要转向到作为View的JSP网页的,但是HttpUnit程序包不提供解析JSP网页的方法。为此,我们可以利用stub技术,利用另一个Servlet类为其模拟一个转向目标。
模拟转向目标的任务有两个:
第一, 从数据保存区提取相关的数据;
第二, 将相关的数据以响应的方式向用户端发送。
作为stub的Servlet类不需要进行数据的有效性判断。样例代码如下:

import java.io.IOException;
import java.io.PrintWriter;

import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

public class MainStub extends HttpServlet {

    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp)
            throws ServletException, IOException {
       
    // 从数据保存区提取相关的数据
        String userId = (String)req.getAttribute("userId");
       
        resp.setContentType("text/plain");
        resp.setCharacterEncoding("UTF-8");

        // 将相关的数据以响应的方式向用户端发送
        PrintWriter pw = resp.getWriter();
        pw.write(userId);
    }
}
 

相应的,用户端测试代码的任务是:
第一, 注册需要测试的Servlet类与用作stub的Servlet类;
第二, 模拟调用需要测试的Servlet类并为其提供参数;
第三, 检查从用作stub的Servlet类中返回的响应数据是否符合要求。
样例代码如下:

import junit.framework.TestCase;

import com.meterware.httpunit.GetMethodWebRequest;
import com.meterware.httpunit.WebRequest;
import com.meterware.httpunit.WebResponse;
import com.meterware.servletunit.ServletRunner;
import com.meterware.servletunit.ServletUnitClient;

public class HelloTest extends TestCase {

    public void testHelloServlet() throws Exception {

        ServletRunner sr = new ServletRunner();
        // 注册测试用Servlet       
        sr.registerServlet("hello.html", HelloServlet.class.getName());
        // 注册stub用Servlet       
        sr.registerServlet("main.html", MainStub.class.getName());
       
        ServletUnitClient sc = sr.newClient();
       
        // 调用测试用Servlet并为其提供参数
        WebRequest request   =
            new GetMethodWebRequest( "http://localhost/hello.html?userId=darxin" );
        WebResponse response = sc.getResponse( request );

        // 检查最终的返回结果       
        assertEquals("darxin", response.getText());       
    }
}
 

根据测试代码及stub代码,我们最终需要完成的Servlet类代码如下:

import java.io.IOException;
import javax.servlet.ServletException;

import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

public class HelloServlet extends HttpServlet {

    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp)
            throws ServletException, IOException {

        // 从请求中取出参数
        String userId = req.getParameter("userId");

        // 向request中设置属性
        req.setAttribute("userId", userId);

        // 转向到新的servlet
        req.getRequestDispatcher("main.html").forward(req, resp);       
    }
}
 

以上简要说明了如何利用HttpUnit程序包测试Servlet的方法,此方法适用于基本的Servlet实现。
对于容器内测试,建议使用Cactus技术。

 

© 丑小鸭技术专栏 | 查看原文

 

 

分享到:
评论

相关推荐

    httpunit测试包

    7. **servlet.jar**:虽然HttpUnit主要关注客户端的测试,但这个库可能包含对Servlet API的支持,使得HttpUnit可以更好地模拟服务器端的行为,尤其是在处理Web应用的请求和响应时。 8. **nekohtml.jar**:NekoHTML...

    使用HttpUnit进行集成测试

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

    基于Junit的HttpUnit测试

    2. **创建测试类**:接下来,创建一个 `JUnit` 测试类,如 `HttpUnitDemoTest`,并在其中定义测试方法。 3. **初始化HttpUnit**:在测试方法前,可以使用 `WebConversation` 类来初始化会话,并设置必要的请求头、...

    selenium httpunit测试程序

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

    httpunit单元测试所需jar包

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

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

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

    servlettest

    在本主题"Servlettest"中,我们将深入探讨如何利用测试工具Junit和httpunit来测试Servlet应用程序。这两个工具在软件开发过程中扮演着关键角色,确保代码的质量和功能正确性。 首先,Junit是一个流行的单元测试框架...

    httpunit所有需要的包

    在集成HTTPUnit到你的项目时,你需要将"httpunit.jar"添加到你的类路径(classpath)中,这样编译器和运行时环境就能找到并使用这个库。如果你使用的是Maven或Gradle等构建工具,可以在相应的配置文件中添加依赖。...

    httpunit-1.6.2.zip_Httpunit_httpun_httpunit-1.5.41.zip_httpunit-

    7. **兼容性**:HttpUnit与Servlet和JSP标准兼容,因此对基于这些技术构建的Web应用特别有用。 8. **易于集成**:它能很好地与JUnit或其他测试框架结合,方便构建自动化测试套件。 通过"www.pudn.com.txt"文件,...

    内含httpunit、js、nekohtml、resolver、servlet等多个jar包

    1. **httpunit.jar**: HTTPUnit 是一个Java库,用于自动化Web应用程序的测试。它允许开发者模拟浏览器行为,如发送HTTP请求、接收HTTP响应,并能处理JavaScript和HTML内容。这对于单元测试和集成测试非常有用,可以...

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

    本篇文章将详细介绍如何利用HttpUnit来模拟登录一个网站,以及与之相关的`jxl`库的使用。 首先,让我们了解`HttpUnit`。HttpUnit是一个轻量级的测试框架,它可以模拟浏览器发送HTTP请求并接收响应。它的核心功能...

    httpunit(web必备)全部依赖打包

    HttpUnit所有依赖打包下载,HttpUnit是一个集成测试工具,主要关注Web应用的测试,提供的帮助类让测试者可以通过Java类和服务器进行交互,并且将服务器端的响应当作文本或者DOM对象进行处理。HttpUnit还提供了一个...

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

    使用HttpUnit时,你需要将压缩包中的所有jar文件添加到你的项目类路径(ClassPath)中。这些jar包可能包括HttpUnit的核心库、依赖的HTTP客户端库、解析库以及其他必要的支持库。例如,可能有`httpunit.jar`、`...

    httpunit-1.7

    1. **创建测试用例**:在Java类中,创建HttpUnit测试用例,定义测试方法,如`@Test`注解的方法。 2. **构建HTTP请求**:使用`WebConversation`或`WebClient`对象,创建`WebRequest`,设置URL、请求方法和参数。 3. *...

    httpunit2.21jar及关联jar包

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

    HttpUnit基础教程

    HttpUnit是SourceForge下面的一个开源项目,它是基于JUnit的一个测试框架,主要关注于测试Web应用,解决使用...HttpUnit还提供了一个模拟Servlet容器,让你可以不需要发布Servlet,就可以对Servlet的内部代码进行测试。

    httpunit jar包以及关于它文档

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

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

    在`HttpUtilTest`类中,我们可以找到对HTTPUnit的调用,以及对异步数据处理的测试逻辑。开发者可以通过阅读和调试这个类来理解异步请求的处理过程。 - `WebRoot`目录:这是典型的Web应用的根目录,包含了HTML、CSS...

    httpunit-1.7相关所有jar文件

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

Global site tag (gtag.js) - Google Analytics