zoukankan      html  css  js  c++  java
  • Cactus入门

    这是一个WebProject,有关Cactus用法详见本文测试用例


    首先是web.xml

    <?xml version="1.0" encoding="UTF-8"?>
    <web-app version="2.5" xmlns="http://java.sun.com/xml/ns/javaee"
    	xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    	xsi:schemaLocation="http://java.sun.com/xml/ns/javaee 
    	http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd">
    	<!-- 本文中的Cactus是依托于Tomcat启动后来进行测试的 -->
    	<!-- 如果是依托于Jetty则不需要web.xml和cactus.properties -->
    	<!-- 关于Jetty的简单用法,可参考我的博文http://blog.csdn.net/jadyer/article/details/9299485 -->
    	<servlet>
    		<servlet-name>ServletTestRedirector</servlet-name>
    		<servlet-class>org.apache.cactus.server.ServletTestRedirector</servlet-class>
    	</servlet>
    	<servlet-mapping>
    		<servlet-name>ServletTestRedirector</servlet-name>
    		<!-- 这里要求是固定的"/ServletRedirector" -->
    		<url-pattern>/ServletRedirector</url-pattern>
    	</servlet-mapping>
    </web-app>


    下面是待测试的LoginServlet.java

    package com.jadyer.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 LoginServlet extends HttpServlet {
    	private static final long serialVersionUID = 6655227641354075528L;
    
    	@Override
    	protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
    		PrintWriter out = response.getWriter();
    		out.println("<table><tr><td>username</td><td>password</td></tr></table>");
    		out.flush();
    		out.close();
    	}
    	
    	public boolean login(HttpServletRequest request){
    		String loginUser = (String)request.getSession().getAttribute("loginUser");
    		if(null==loginUser || !"http://blog.csdn.net/jadyer".equals(loginUser)){
    			System.out.println("用户[" + loginUser + "]登录失败");
    			return false;
    		}
    		System.out.println("用户[" + loginUser + "]登录成功");
    		return true;
    	}
    }


    下面是Cactus运行时要用到的,位于test SourceFolder下面的cactus.properties

    #键名固定,键值模式为http://localhost:port/contextRoot/(是否以斜线结尾均可,但这里的端口要与Web服务器的启动端口一致)
    cactus.contextURL=http://127.0.0.1:8088/Cactus_demo/


    最后是使用Cactus编写的位于test SourceFolder下的测试用例LoginServletTest.java

    package com.jadyer.servlet;
    
    import java.io.IOException;
    
    import javax.servlet.ServletException;
    
    import junit.framework.Assert;
    
    import org.apache.cactus.ServletTestCase;
    import org.apache.cactus.WebRequest;
    import org.xml.sax.SAXException;
    
    import com.meterware.httpunit.WebResponse;
    
    /**
     * @see ----------------------------------------------------------------------------------------------------
     * @see Cactus简介
     * @see Cactus可以模拟JavaEE容器进行测试JSP、Servlet、Filter和EJB等
     * @see Cactus不支持JUnit4中的annotation,它主要是基于JUnit3.8进行操作的
     * @see Cactus下载地址为http://archive.apache.org/dist/jakarta/cactus/
     * @see ----------------------------------------------------------------------------------------------------
     * @see Cactus工作流程(分为ClientSide和ServerSide)
     * @see ClientSide中包括beginXxx()和endXxx()方法,ServerSide中包括setUp()和testXxx()和tearDown()等方法
     * @see 执行顺序为beginXxx->setUp->testXxx->tearDown->endXxx->beginYyy->setUp->testYyy->tearDown->endYyy
     * @see 可以粗略的将beginXxx和endXxx方法理解为JUnit4中的@BeforeClass和@AfterClass,尽管它们俩之间并没有什么联系
     * @see 注意:这里beginXxx和testXxx方法中的Xxx要是一样的,如beginLogin()和testLogin(),如此这俩方法才能对应上
     * @see ----------------------------------------------------------------------------------------------------
     * @see Cactus编写方法
     * @see 1)引入它所依赖的基础jar
     * @see   aspectjrt-1.5.3.jar
     * @see   cactus.core.framework.uberjar.javaEE.14-1.8.1.jar
     * @see   cactus.integration.ant-1.8.1.jar
     * @see   cactus.integration.shared.api-1.8.1.jar
     * @see   commons-codec-1.6.jar(需单独下载)
     * @see   commons-discovery-0.4.jar
     * @see   commons-httpclient-3.1.jar
     * @see   commons-logging-1.1.jar
     * @see   geronimo-j2ee-management_1.0_spec-1.1.jar
     * @see   httpunit-1.6.jar
     * @see   Tidy.jar或者nekoHTML.jar和xercesMinimal.jar(本例中的endDoGet()方法要用到)
     * @see   (nekoHTML的下载地址为http://sourceforge.net/projects/nekohtml/files/)
     * @see   (其中nekoHTML.jar和xercesMinimal.jar均可从下载到的nekohtml-1.9.18.zip找到,Tidy.jar想用的话也要单独下载)
     * @see 2)classpath下编写一个名为cactus.properties的文件,文件内容如下
     * @see   #键名固定,键值模式为http://localhost:port/contextRoot/(是否以斜线结尾均可,但这里的端口要与Web服务器的启动端口一致)
     * @see   cactus.contextURL=http://127.0.0.1:8088/Cactus_demo/
     * @see 3)在web.xml中配置org.apache.cactus.server.ServletTestRedirector映射,固定为"/ServletRedirector"
     * @see 4)编写一个继承了org.apache.cactus.ServletTestCase的类(它内部间接继承了junit.framework.TestCase)
     * @see   这样此类便自动拥有了ServletAPI引用,比如要使用HttpSession就可以直接session.setAttribute()
     * @see ----------------------------------------------------------------------------------------------------
     * @see 就本例而言,它的缺点是每一次测试Servlet时都要启动Tomcat
     * @see 如果不想每次都启动Web服务器,那么可以考虑使用嵌入式服务器,目前最好用的嵌入式服务器也是最火的就是Jetty
     * @see 关于Jetty的简单用法,可参考我的博文http://blog.csdn.net/jadyer/article/details/9299485
     * @see ----------------------------------------------------------------------------------------------------
     * @create Jul 4, 2013 7:21:09 PM
     * @author 玄玉<http://blog.csdn.net/jadyer>
     */
    public class LoginServletTest extends ServletTestCase {
    	private LoginServlet loginServlet;
    	
    	//它是在ServerSide执行的
    	public void setUp(){
    		loginServlet = new LoginServlet();
    	}
    	
    	//beginXxx()方法是在ClientSide执行的
    	//如果想在testLogin()中获取到这里request添加的username参数,那么这个方法就应该命名为beginLogin()
    	public void beginLogin(WebRequest request){
    		request.addParameter("username", "Jadyer");
    	}
    	
    	//它是在ServerSide执行的
    	public void testLogin(){
    		//获取GET参数
    		Assert.assertEquals(request.getParameter("username"), "Jadyer");
    		//登录失败
    		//session.setAttribute("loginUser", "玄玉<http://blog.csdn.net/jadyer>");
    		Assert.assertFalse(loginServlet.login(request));
    		//登录成功
    		session.setAttribute("loginUser", "http://blog.csdn.net/jadyer");
    		Assert.assertTrue(loginServlet.login(request));
    	}
    	
    	//它是在ServerSide执行的
    	public void testDoGet() throws ServletException, IOException {
    		loginServlet.doGet(request, response);
    	}
    	
    	//endXxx()方法是在ClientSide执行的,该方法对应testDoGet()
    	public void endDoGet(WebResponse resp) throws SAXException {
    		//这里使用com.meterware.httpunit.WebResponse,而非org.apache.cactus.WebResponse,前者提供了很多增强功能
    		//但在使用httpunit中的WebResponse时,要额外借助Tidy.jar或者nekoHTML.jar和xercesMinimal.jar作为辅助包
    		Assert.assertEquals(resp.getTables()[0].getCellAsText(0,0), "username");
    		Assert.assertEquals(resp.getTables()[0].getCellAsText(0,1), "password");
    	}
    }
  • 相关阅读:
    javascript framework js常用框架
    快速排序Quick sort
    归并排序
    Linux中 设置apache,mysql 开机启动
    Linux下设置mysql和tomcat开机启动
    linux命令之ifconfig详细解释
    CentOS网络接口配置文件ifcfg-eth详解
    条件测试操作与流程控制语句
    从键盘或文件中获取标准输入:read命令
    linux yum命令详解
  • 原文地址:https://www.cnblogs.com/snake-hand/p/3184492.html
Copyright © 2011-2022 走看看