`
baiweiyll
  • 浏览: 28494 次
  • 性别: Icon_minigender_1
  • 来自: 成都
社区版块
存档分类
最新评论

servlet的四种测试

阅读更多
servlet的测试一般来说需要容器的支持,不是像通常的java类的junit测试一样简单,

下面通过对HelloWorld代码的测试阐述了几种servlet测试方法。

被测试的HelloWorld类的代码如下:

/**
* 被测试的servlet
*/

import java.io.IOException;

import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import org.apache.cactus.WebRequest;
import org.apache.cactus.server.HttpServletRequestWrapper;

public class HelloWorld extends HttpServlet{

public void saveToSession(HttpServletRequest request) {

         request.getSession().setAttribute("testAttribute",request.getParameter("testparam"));

}

public void doGet(HttpServletRequest request,HttpServletResponse response) throws IOException{

         String username=request.getParameter("username");

         response.getWriter().write(username+":Hello World!");
       
}

public boolean authenticate(){
        
        return true;

}

}

以HelloWorld为例,我总结了Servlet的多种测试方法如下:

一.使用HttpUnit测试

import com.meterware.httpunit.GetMethodWebRequest;
import com.meterware.httpunit.WebRequest;
import com.meterware.httpunit.WebResponse;
import com.meterware.servletunit.InvocationContext;
import com.meterware.servletunit.ServletRunner;
import com.meterware.servletunit.ServletUnitClient;
import junit.framework.Assert;
import junit.framework.TestCase;

public class HttpUnitTestHelloWorld extends TestCase {

protected void setUp() throws Exception {
  super.setUp();
}

protected void tearDown() throws Exception {
  super.tearDown();
}

public void testHelloWorld() {
 
  try {

   // 创建Servlet的运行环境

   ServletRunner sr = new ServletRunner();

   // 向环境中注册Servlet

   sr.registerServlet("HelloWorld", HelloWorld.class.getName());

   // 创建访问Servlet的客户端

   ServletUnitClient sc = sr.newClient();

   // 发送请求

   WebRequest request = new GetMethodWebRequest("http://localhost/HelloWorld");
   request.setParameter("username", "testuser");

   InvocationContext ic = sc.newInvocation(request);

   HelloWorld is = (HelloWorld) ic.getServlet();

   // 测试servlet的某个方法

   Assert.assertTrue(is.authenticate());

   // 获得模拟服务器的信息

   WebResponse response = sc.getResponse(request);

   // 断言

   Assert.assertTrue(response.getText().equals("testuser:Hello World!"));

  } catch (Exception e) {

   e.printStackTrace();

  }

}

}

上述例子其实是junit的一个测试例子,在其中使用了httpunit模拟的servlet环境,使用上述方法测试

servlet可以脱离容器,容易把该测试写入ant或maven脚本,让测试进行。

httpunit网址:http://httpunit.sourceforge.net/

使用该种方法测试的弱点就是:如果要使用request(response)的setCharercterEncoding方法时,测试会出现一些问题,

而且httpunit在测试servlet行为时,采用的是完全模拟浏览器,有时测试比较难写。

二 使用cactus测试

/**
* cactus测试servlet的例子
* 必须要有tomcat的支持
*
*/

import junit.framework.Test;
import junit.framework.TestSuite;
import org.apache.cactus.ServletTestCase;
import org.apache.cactus.WebRequest;
import org.apache.cactus.WebResponse;
public class CactusHelloWorld extends ServletTestCase{
 
     HelloWorld servlet;
     public CactusHelloWorld(String theName) {
         super(theName);
     }

     protected void setUp() throws Exception {
         super.setUp();
         servlet = new HelloWorld();
     }

     protected void tearDown() throws Exception {
         super.tearDown();
     }

     /**
      * 测试方法测试参数在此设置
      *
      * @param webrequest
      */

     public void beginSaveToSessionOK(WebRequest request) {
         request.addParameter("testparam", "it works!");
     }
    
     /**
      * 测试方法测试参数在此设置
      *
      * @param webrequest
      */

     public void beginDoGet(WebRequest request) {
         request.addParameter("username", "testuser");
     }

     /**
      * 调用servlet的测试方法
      * 
      */

     public void testSaveToSessionOK() {
         servlet.saveToSession(request);
         assertEquals("it works!", session.getAttribute("testAttribute"));
     }

     public void testDoGet() {
         try {
             servlet.doGet(request, response);
         } catch (Exception e) {
             e.printStackTrace();
         }
     }

     /**
      * 此方法可以判断测试方法的输出,会传递测试方法的reponse给end***,并且格式化为cactus
      * 的WebResponse或者可以跟httpunit集成,格式化为httpunit的response
      *
      * @param response
      */

     public void endDoGet(WebResponse response) {
         String content;        
         content = response.getText();
         assertEquals("testuser:Hello World!", content);
     }
}

cactus具备丰富灵活的测试功能,如要测试doGet方法,分为beginDoGet(模拟测试参数设置)、DoGet(执行测试)、endDoGet(状态结果验证)

相比httpunit来说,写测试更为容易,测试servlet更为专业,流程更为清晰,但是cactus需要容器支持,使得测试不可以自动进行,但是

如果使用一个嵌入式的容器,测试就可以自动了。

cactus是一个servlet和jsp的测试框架:http://jakarta.apache.org/cactus/getting_started.html

三 使用Jetty作为嵌入式容器测试servlet.

/**
* 一个关于嵌入式jetty测试的例子,jetty作为stubs的一个例子
*
*/
package com.easyjf.testexample;

import org.mortbay.jetty.Connector;
import org.mortbay.jetty.Server;
import org.mortbay.jetty.bio.SocketConnector;
import org.mortbay.jetty.servlet.ServletHandler;

import com.meterware.httpunit.WebClient;
import com.meterware.httpunit.WebConversation;
import com.meterware.httpunit.WebResponse;

import junit.framework.Assert;
import junit.framework.TestCase;

public class JettySampleTest extends TestCase {

Server server;
protected void setUp() throws Exception {
      //通过代码设置并启动一个服务器,该服务器是servlet的测试容器
      super.setUp();
      server = new Server();
      Connector connector=new SocketConnector();
      connector.setPort(80);
      server.setConnectors(new Connector[]{connector});
      ServletHandler handler=new ServletHandler();
      server.setHandler(handler);
      handler.addServletWithMapping("HelloWorld", "/");
      server.start();
}

protected void tearDown() throws Exception {
  super.tearDown();
  server.stop();
}

public void testHellWorld() {
  try {
   WebConversation wc = new WebConversation();
   WebResponse web = wc.getResponse("http://127.0.0.1/HelloWorld");
   String result=web.getText();
   Assert.assertEquals(result,"it works!");
  } catch (Exception e) {
   e.printStackTrace();
  }
}
}

可以发现,jetty可以充当一个servlet的容器,方便的是,jetty支持嵌入式服务,即可以通过代码来启动,

所以要写自动测试的例子很方便,可以结合httpunit或者cactus进行servlet测试。

jetty主页:http://docs.codehaus.org/display/JETTY/Embedding+Jetty


四 使用mock对象,此处使用easymock

import java.io.PrintWriter;
import java.io.Writer;
import javax.servlet.ServletConfig;
import javax.servlet.ServletContext;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import junit.framework.Assert;
import junit.framework.TestCase;
import static org.easymock.EasyMock.*;
public class MockTestServlet extends TestCase {

    public void testService() throws Exception {

        System.out.println("service");

        HttpServletRequest request = createMock(HttpServletRequest.class);

        HttpServletResponse response = createMock(HttpServletResponse.class);

        //Creating the ServletConfig mock here

        ServletConfig servletConfig = createMock(ServletConfig.class);

        //Creating the ServletContext mock here

        ServletContext servletContext = createMock(ServletContext.class);
       
        //Create the target object 
     
        HelloWorld4 instance = new HelloWorld();

        //初始化servlet,一般由容器承担,一般调用servletConfig作为参数初始化,此处模拟容器行为

        instance.init(servletConfig);

        //在某些方法被调用时设置期望的返回值,如下这样就不会去实际调用servletConfig的getServletContext方法,而是直接返回

        //servletContext,由于servletConfig是mock出来的,所以可以完全控制。

        expect(servletConfig.getServletContext()).andReturn(servletContext).anyTimes();

        expect(request.getParameter("username")).andReturn("testuser");

        PrintWriter pw=new PrintWriter(System.out,true);

        expect(response.getWriter()).andReturn(pw).anyTimes();
       
        //以上均是录制,下面为重放,该种机制为easymock测试机制,要理解请看easymock测试的一些资http://www.ibm.com/developerworks/cn/opensource/os-cn-easymock/
        replay(request);
        replay(response);
        replay(servletConfig);
        replay(servletContext);

        instance.doGet(request, response);

        pw.flush();
       

        //验证结果是否预期,如果预期,则会在pw上写出testuser.
        verify(request);
        verify(response);
        verify(servletConfig);
        verify(servletContext);
   }
}

mock测试注重行为,mock对象其实都是模拟的对象,方法一般直接给出一个返回值,没有具体的对象逻辑,mock对象

是用来帮助测试要测试的类的。比如要测试servlet的内部行为,又不想要容器等环境,就可以采用mock测试。

easymock是mock测试的一个框架:http://www.easymock.org/

分享到:
评论

相关推荐

    Servlet Filter 的单元测试

    进行Servlet Filter的单元测试是确保Filter功能正确性和健壮性的重要步骤。 首先,理解Servlet Filter的工作原理至关重要。Filter通过实现`javax.servlet.Filter`接口,并重写`doFilter`方法来实现对HTTP请求的拦截...

    在线考试系统(jsp+servlet)_jap+servlet考试,jsp servlet 实现在线考试

    在线考试系统是一个基于Java技术,特别是使用JSP(JavaServer Pages)和Servlet的Web应用程序,它为用户提供了在线进行考试和自动评估成绩的功能。这样的系统通常由几个关键组件构成,包括用户界面、后端服务器处理...

    基于Servlet的学生考试成绩管理系统

    【标题】"基于Servlet的学生考试成绩管理系统"是一个利用Servlet技术构建的应用程序,旨在方便地管理和处理学生考试成绩。Servlet是Java编程语言中的一个组件,它主要用于扩展服务器的功能,尤其是在Web应用中,处理...

    jsp/servlet 在线考试系统

    【标题】"jsp/servlet 在线考试系统"是基于Java技术栈实现的一个初学者级别的项目,旨在帮助开发者熟悉和掌握JSP(JavaServer Pages)和Servlet这两种核心的Java Web技术。JSP是一种动态网页开发技术,它允许在HTML...

    jsp/servlet阶段测试

    jsp/servlet阶段测试 本资源总结了jsp和servlet的阶段性测试,涵盖了servlet和jsp的基础知识点,包括servlet的生命周期、jsp的隐含对象、Filter的用途、Listener的类型、Request、Session和Application的区别等。 ...

    基于JSP+Servlet的学生考试管理系统.zip

    基于JSP+Servlet的学生考试管理系统基于JSP+Servlet的学生考试管理系统 基于JSP+Servlet的学生考试管理系统基于JSP+Servlet的学生考试管理系统 基于JSP+Servlet的学生考试管理系统基于JSP+Servlet的学生考试管理系统...

    JSP Servlet基础知识测试题.pdf

    JSP Servlet基础知识测试题

    HTTP 通信测试或者JAVAServlet测试

    在IT行业中,HTTP通信测试和Java Servlet测试是Web应用程序开发中的关键环节,它们确保了客户端与服务器之间的数据传输准确无误。在这个场景中,我们关注的是如何通过HTTP协议进行通信,以及如何使用Java Servlet来...

    jsp+servlet在线考试系统

    jsp+servlet在线考试系统 考试流程 1. 管理员在后台添加当日考试试卷的题型(判断、单选、多选、简单、编程) .2.学生通过手机号码注册账户,密码MD5加密 登录系统进行考试(题目题库随机抽取) 3.教师后台登录系统...

    java的Servlet测试demo

    在这个"java的Servlet测试demo"中,我们将深入理解Servlet的工作原理以及如何在集成开发环境(IDE)IntelliJ IDEA中进行开发和测试。 首先,Servlet生命周期包括初始化、服务和销毁三个主要阶段。初始化阶段,...

    在线考试系统JSP+SERVLET+MYSQL

    在线考试系统是一个基于Web的应用程序,它允许用户通过互联网进行各种类型的考试,包括模拟测试、实战练习和评估。本项目采用JSP(JavaServer Pages)作为前端展示技术,Servlet作为后端处理逻辑的核心,以及MySQL...

    在线考试系统(jsp+servlet)_jap+servlet考试,jsp servlet 实现在线考试(txt为微云链接)

    非常完整的在线考试系统,可以自动计算成绩等功能,包括完整的数据库,一般作为毕业设计没有任何问题,里面有完整的代码,程序等。

    虚拟目录及servlet测试.txt

    ### 虚拟目录与Servlet测试详解 在深入解析虚拟目录及Servlet测试的过程之前,我们首先需要理解几个关键概念:虚拟目录、Servlet以及Tomcat服务器的配置方式。 #### 虚拟目录的理解 虚拟目录是Web服务器的一个...

    servlet 心的练习

    Servlet是一种Java类,它遵循Servlet API规范,用于扩展服务器的功能。在Web应用中,Servlet主要用于接收和响应来自客户端(如浏览器)的HTTP请求,处理数据,然后返回相应的HTTP响应。它们是服务器端的程序,不同于...

    通用在线考试系统 JSP+Servlet+MySQL

    通用在线考试系统是一种基于Web的教育技术应用,它利用了JSP(JavaServer Pages)、Servlet和MySQL等核心技术,为用户提供了一种便捷、高效的方式来进行在线测试和评估。本系统允许教师创建、管理试题库,学生则可以...

    基于JSP+Servlet的在线考试系统

    一个基于Java开发的源码,对于在校生有很好的学习效果!

    servlet实现身高体重比测试

    在这个“servlet实现身高体重比测试”的项目中,我们将深入理解Servlet的生命周期、EL(Expression Language)表达式的应用以及如何在实际场景中结合它们来构建Web应用程序。 1. **Servlet生命周期**: - **加载与...

    共创在线考试系统(JSP+SERVLET)

    这个系统可能包括创建试题库、组织考试、管理考生、自动评分等功能,为教育机构或企业进行远程测试提供便利。 JSP是Java平台上的一种动态网页技术,它允许开发人员在HTML代码中嵌入Java代码,以实现服务器端的业务...

    Servlet实验报告.pdf

    再进行部署测试,运行。 四、实验步骤 1. 创建一个 web 项目命名为 myproject。 2. 创建登陆页面 index.jsp 代码如下: index.jsp 代码主要实现了登陆页面的布局和样式,并使用 JavaScript 实现了表单的提交功能...

    Servlet3.1规范(最终版)

    Servlet3.1规范是Java服务器端编程的重要里程碑,它在原有的Servlet技术基础上进行了多项改进和扩展,极大地提升了Web应用的性能和开发效率。这个规范主要关注于Servlet、过滤器(Filter)和监听器(Listener)的...

Global site tag (gtag.js) - Google Analytics