`

tomcat源码研究之测试用例研究

阅读更多

tomcat 作为应用型服务器,尤其是web服务器。我们一般部署应用程序都是将自己的项目工程打包放到服务器指定的目录下, 然后启动服务器带动应用应用程序的启动。我们是否可以像spring boot那样直接run 我们的自己工程启动tomcat呢,下面来说说本人是怎么嵌入到自己应用程序中的呢?

[b]
第一步,将tomcat框架下lib中的jar导入到自己应用程序中


第二步,编写自己web程序 代码如下

这是启动前的tomcat的初始化的一些类参数所用的父类
package org.apache.catalina.startup;

import static org.junit.Assert.fail;

import java.io.File;
import java.io.IOException;
import java.util.ArrayList;
import java.util.List;

import org.apache.juli.logging.Log;
import org.apache.juli.logging.LogFactory;
import org.junit.After;
import org.junit.Before;
import org.junit.Rule;
import org.junit.rules.TestName;

public abstract class LoggingBaseTest {
 protected  Log log;
 private File tempDir;
 private List<File> deleteOnTearDown=new ArrayList<File>();
 //提供当前执行方法的名字
 @Rule
 public final TestName testName=new TestName();
 
 public  File getBuildDirectory(){
	 try {
		return new File(System.getProperty("tomcat.test.tomcatbuild"),".").getCanonicalFile();
	} catch (IOException e) {
		return null;
	}
 }
 
 public File getTemporaryDirectory(){return tempDir;};
 
 public void addDeleteOnTearDown(File file){
	deleteOnTearDown.add(file); 
 }
 @Before
 public void setUp() throws Exception{
	 tempDir =new File( System.getProperty("tomcat.test.temp","tmp"));
	 if(!tempDir.mkdir()&&!tempDir.isDirectory()){
		 fail("Unable to create temporary directory for test");
	 }
	 //设置catalina.base
	 System.setProperty("catalina.base",tempDir.getAbsolutePath());
	    // Configure logging
     System.setProperty("java.util.logging.manager",
             "org.apache.juli.ClassLoaderLogManager");
     System.setProperty("java.util.logging.config.file", new File(
             getBuildDirectory(), "conf/logging.properties").toString());

     // Get log instance after logging has been configured
     log = LogFactory.getLog(getClass());
     log.info("Starting test case [" + testName.getMethodName() + "]");
 }
 @After
 public void tearDown() throws Exception {
     for (File file : deleteOnTearDown) {
         ExpandWar.delete(file);
     }
     deleteOnTearDown.clear();
 }
}


这是启动tomcat前配置的tomcat的
package org.apache.catalina.startup;

import static org.junit.Assert.fail;

import java.io.BufferedInputStream;
import java.io.File;
import java.io.IOException;
import java.io.InputStream;
import java.net.HttpURLConnection;
import java.net.InetAddress;
import java.net.URL;
import java.util.List;
import java.util.Map;

import org.apache.catalina.Container;
import org.apache.catalina.LifecycleException;
import org.apache.catalina.Manager;
import org.apache.catalina.Server;
import org.apache.catalina.Service;
import org.apache.catalina.connector.Connector;
import org.apache.catalina.core.AprLifecycleListener;
import org.apache.catalina.core.StandardServer;
import org.apache.catalina.session.ManagerBase;
import org.apache.catalina.session.StandardManager;
import org.apache.catalina.valves.AccessLogValve;
import org.apache.tomcat.util.buf.ByteChunk;
import org.junit.Before;

public abstract class TomcatBaseTest extends LoggingBaseTest{
 private Tomcat tomcat;
 private boolean accessLogEnabled=false;
 public static final String TEMP_DIR = System.getProperty("java.io.tmpdir");
 public Tomcat getTomcatIntance(){
	 return tomcat;
	 
 }
 public int getPort(){return tomcat.getConnector().getLocalPort();}
 public boolean isAccessLogEnabled(){return accessLogEnabled;}
   @Before
   @Override
	public void setUp() throws Exception {
		super.setUp();
		CatalinaProperties.getProperty("foo");
		File appBase=new File(getTemporaryDirectory(),"webapps");
		if(!appBase.exists()&&!appBase.mkdir()){
			fail("Unable to create appBase for test");
		}
		//到Tomcat
		tomcat=new TomcatWithFastSessionIDs();
		Connector connector=new Connector();
		String protocol=getProtocol();
		connector.setProtocol(protocol);
		connector.setAttribute("address", InetAddress.getByName("localhost").getHostAddress());
		connector.setAttribute("connectionTimeout", 60000);
		connector.setPort(0);
		tomcat.setConnector(connector);
		tomcat.getService().addConnector(connector);
		if(protocol.contains("Apr")){
			StandardServer server=(StandardServer) tomcat.getServer();
			AprLifecycleListener listener =new AprLifecycleListener();
			listener.setSSLRandomSeed("/dev/urandom");
			connector.setAttribute("pollerThreadCount", Integer.valueOf(1));
			
		}
		
		File catalinaBase=getTemporaryDirectory();
		tomcat.setBaseDir(catalinaBase.getAbsolutePath());
		tomcat.getHost().setAppBase(appBase.getAbsolutePath());
		
		accessLogEnabled=Boolean.parseBoolean(System.getProperty("tomcat.test.accesslog","false"));
		if(accessLogEnabled){
			String accessLogDirectory=System.getProperty("tomcat.test.reports");
			if(accessLogDirectory==null)
			{
				accessLogDirectory =new File(getBuildDirectory(),"logs").toString();
			}
			AccessLogValve alv=new AccessLogValve();
			alv.setDirectory(accessLogDirectory);
		    alv.setPattern("%h %l %u %t \"%r\" %s %b %I %D");
		   tomcat.getHost().getPipeline().addValve(alv);
		   addDeleteOnTearDown(new File(catalinaBase, "webapps"));
	       addDeleteOnTearDown(new File(catalinaBase, "work"));
		}
	}
   
   public  String  getProtocol(){
	   String protocol = System.getProperty("tomcat.test.protocol");
	   if(protocol==null){
		   protocol="org.apache.coyote.http11.Http11Protocol";
	   }
	   return protocol;
   }
   
     public  ByteChunk getUrl(String url,int readTimeout,String method) throws IOException{
    	 ByteChunk out =new ByteChunk();
    	 methodUrl(url, out, readTimeout, null, null, method);
    	 return out;
     }
     
     public ByteChunk getUrl(String url) throws IOException{
    	 return getUrl(url,3000,"GET");
     }
   
	 public static int methodUrl(String path, ByteChunk out, int readTimeout,
	            Map<String, List<String>> reqHead,
	            Map<String, List<String>> resHead,
	            String method) throws IOException{
		 URL url=new URL(path);
		 HttpURLConnection connection=(HttpURLConnection) url.openConnection();
		 connection.setUseCaches(false);
		 connection.setReadTimeout(readTimeout);
		 connection.setRequestMethod(method);
		 if(reqHead!=null){
			for(Map.Entry<String,List<String>> entry:reqHead.entrySet()){
			  StringBuilder valueList=new StringBuilder();
			   for(String value:entry.getValue()){
				   if(valueList.length()>0){
					   valueList.append(",");
				   }
				   valueList.append(value);
			   }
			   connection.setRequestProperty(entry.getKey(), valueList.toString());
			}
		 }
		 connection.connect();
		 int rc=connection.getResponseCode();
		 if(resHead!=null){
			 Map<String,List<String>> head =connection.getHeaderFields();
			 resHead.putAll(head);
		 }
		 InputStream is;
		 if(rc<400){
			 is=connection.getInputStream();
		 }else
		 {
			 is=connection.getErrorStream();
		 }
		 if(is!=null){
			 BufferedInputStream bis=null;
			 try{
				  bis =new BufferedInputStream(is);
				  byte[] buf =new byte[2048];
				  int rd =0;
				  while((rd =bis.read(buf))>0){
					 out.append(buf,0,rd); 
				  }
			 }finally{
				 if(bis!=null){
					 bis.close();
				 }
			 }
			
		 }
		 return rc;
		 
	 }
   
   private  class TomcatWithFastSessionIDs extends Tomcat{
	   @Override
	  public void start() throws LifecycleException {
		    Server server=   getServer();
		    for(Service service:server.findServices()){
		    	Container e=service.getContainer();
		    	for(Container h:e.findChildren()){
		    		  for(Container c:h.findChildren()){
		    			  Manager m =c.getManager();
		    			  if(m==null){
		    				  m=new StandardManager();
		    				  c.setManager(m);
		    			  }
		    			  if(m instanceof ManagerBase){
		    				 ((ManagerBase)m).setSecureRandomClass("org.apache.catalina.startup.FastNonSecureRandom");
		    			  }
		    		  }
		    	}
		    }
		    super.start();
	  }
	 
   }
}



这是真正设置一些war包  动态设置servlet,动态设置监听器等等运行tomcat
package org.apache.catalina.startup;

import java.io.BufferedInputStream;
import java.io.File;
import java.io.IOException;
import java.io.InputStream;
import java.net.HttpURLConnection;
import java.net.URL;
import java.util.List;
import java.util.Map;

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

import org.apache.catalina.Context;
import org.apache.catalina.LifecycleException;
import org.apache.tomcat.util.buf.ByteChunk;
import org.junit.Test;
/**
 * 测试tomcat
 * @author lxy
 *
 */
public class TestTomcat extends TomcatBaseTest{
	
	 private class  MyServletSesssion extends HttpServlet {
		@Override
		protected void service(HttpServletRequest request, HttpServletResponse response)
				throws ServletException, IOException {
			HttpSession session= request.getSession(true);
			response.getWriter().print("sessionId:"+session.getId());
		}
	}
	
	
	@Test
   public  void testSingleWar() throws IOException{
	 Tomcat tomcat=getTomcatIntance();
	 File appDir=new File(getBuildDirectory(),"webapps/testTomcat.war");
	 
	 try {
		tomcat.addWebapp("/", appDir.getAbsolutePath());
	    tomcat.start();
	} catch (Exception e) {
		// TODO Auto-generated catch block
		e.printStackTrace();
	}
	 ByteChunk out = new ByteChunk();
	 methodUrl("http://localhost:"+getPort()+"/servlet1.do", out,10000, null, null, "GET");
	 System.out.println(out.toString());
   }
	@Test
	public void testMethodUrl() throws IOException{
		 ByteChunk out = new ByteChunk();
		 methodUrl("http://www.baidu.com", out,10000, null, null, "GET");
		 System.out.println(out.toString());
		 
	}
     @Test
	public void testSession() throws Exception{
		Tomcat  tomcat =getTomcatIntance();
		Context context =tomcat.addContext("", System.getProperty("java.io.tmpdir"));
		tomcat.addServlet(context, "myServlet", new MyServletSesssion());
	    context.addServletMapping("/myServlet.do","myServlet");
	    tomcat.start();
	    ByteChunk out=new ByteChunk();
	    methodUrl("http://localhost:"+getPort()+"/myServlet.do", out,3000, null,null, "GET");
	    System.out.println(out.toString());
	}
	


}


[/b]
分享到:
评论

相关推荐

    Spring-boot 源码和用例源码

    总的来说,通过研究“spring-boot-master”中的源码和测试案例,我们可以深入了解Spring Boot的内部工作机制,学习如何编写高效的Spring Boot应用,以及如何进行高质量的测试。这不仅有助于提升我们的编程技能,还能...

    tomcat源码运行缺少jar

    在深入探讨Tomcat源码运行时可能遇到的缺失JAR问题之前,让我们先理解一下Tomcat和这些特定库的基本概念。 Tomcat是一个流行的开源Java Servlet容器,由Apache软件基金会维护。它实现了Java EE(现在称为Jakarta EE...

    Tomcat6 编译好的源码

    8. **国际化和本地化(i18n/l10n)**:Tomcat源码中包含了处理不同语言和区域设置的机制,以支持全球化的Web应用。 9. **错误处理和日志记录**:Tomcat有内置的错误页面和日志记录系统,方便开发者诊断问题。 10. ...

    Apache和Tomcat集群测试案例

    5. **源码与工具**:在标签中提到的“源码”可能指的是Apache和Tomcat的源代码,了解源码可以帮助我们深入理解其工作原理。而“工具”可能是指用于监控和管理集群状态的工具,如JMeter(压力测试)、Nagios(系统...

    tomcat 源码

    《深入剖析Tomcat源码:Apache Tomcat 6.0.33的探索之旅》 Apache Tomcat,作为一款开源的、轻量级的Java Servlet容器,被广泛应用于Web应用程序的部署与运行。Tomcat 6.0.33是其历史版本之一,虽然现在已更新至更...

    lemon-demo:Spring Lemon的演示应用程序以及测试用例

    **Spring Lemon 演示应用程序及测试用例详解** Spring Lemon 是一个基于 Spring Boot 的轻量级开发框架,旨在简化企业级应用的构建过程。它提供了丰富的功能,包括但不限于自动配置、安全控制、数据访问、任务调度...

    在eclipse当中运行tomcat源代码需要的jar包

    JUnit是Java单元测试的框架,它使得编写和运行测试用例变得简单。在开发Tomcat源代码时,进行单元测试是确保代码质量的重要步骤。通过JUnit,你可以为Tomcat的各个组件编写测试,以验证它们的功能正确性。 5. **...

    apache-tomcat-7 源代码

    - `test`:测试用例,帮助开发者验证和调试代码。 源代码阅读和学习可以帮助开发者理解Tomcat如何处理HTTP请求、如何管理Servlet和JSP生命周期、以及如何进行会话管理等。此外,对于性能优化、自定义配置或扩展...

    tomcat7源代码

    开发者可以通过查看测试用例来了解Tomcat各组件的正确用法和功能边界。 通过研究Tomcat7的源代码,开发者不仅可以提升对Java Web技术的理解,还能学习到服务器端设计模式、线程管理、内存优化等多方面技能。这对于...

    tomcat性能优化.pdf

    通过创建测试用例、启动测试,并在聚合报告中关注吞吐量,可以评估Tomcat的性能表现。 在实际应用中,还需要根据具体情况调整Tomcat参数。例如,禁用AJP服务,设置合理的线程池参数,以减少资源浪费和提高资源使用...

    毕业设计-基于SSM的mysql-框架的网上招聘系统的设计与实现lw7-设计与实现(源码 + 数据库 + LW + 演示视频)

    该酒店预订系统是基于适用性较强的SSM框架进行设计与实现的。主要包括用户搜索、预订房间,酒店人员管理订单和管理房间等功能。后台开发使用Java语言,连接的数据库是MySQL数据库。...6.3.3 添加房间测试用例 37

    apache-tomcat-8.5.2-src

    此外,源码中的测试用例可以帮助理解每个组件的工作原理,而这些对于软件开发、性能调优和问题排查都是至关重要的资源。 总之,Apache Tomcat 8.5.2的源代码是一个深入学习Java Web技术的宝贵资料,无论是初学者...

    连接池c3p0 ,Proxool ,Druid ,Tomcat Jdbc Pool对比测试

    在进行对比测试时,可以针对上述指标编写测试用例,例如使用JMeter等负载测试工具模拟高并发请求,观察各个连接池在不同压力下的表现。测试数据可以通过1000.xlsx、500.xlsx、100.xlsx、10.xlsx这些Excel文件进行...

    websocket实时通讯,附源码

    8. 测试与部署:源码可能包含测试用例或者运行指南,帮助开发者理解如何启动服务和进行测试。 通过这个压缩包,你可以深入理解WebSocket的工作机制,学习如何在实际项目中应用WebSocket进行实时通讯,并且通过提供...

    jakarta-tomcat-connectors-jk-1.2.6-src.zip

    【Jakarta Tomcat Connectors JK 1.2.6 源码压缩包】是一个用于配置Tomcat服务器实现负载均衡的重要组件。这个压缩包包含了Jakarta Tomcat Connectors的JK模块的源代码,该模块是Apache HTTP服务器与Tomcat应用...

    JAVA实战项目源码-计算机毕业设计java专业-(jsp+servlet+javabean-信息办公系统-学校教务管理系统

    运用JUnit工具进行编写测试用例,进行单元测试和集成测试。在界面上运用Ajax技术来实现XML文件存放数据,并以人性化的控件完成复杂的业务流程。考虑到排课任务的繁重,设计了自动排课算法,可以完成特定需求的排课。...

    基于springboot月度员工绩效考核管理系统的设计与实现(论文+源码)-kaic.zip

    VX:18341315438 目 录 第1章 引言 1.1课题研究现状 1.2课题研究意义及背景 1.3课题的目的及设计要求 1.4论文内容与组成部分 第2章 系统需求分析与系统开发分析 ...5.3测试用例 5.4测试总结 总 结 参考文献 致 谢

    毕业设计:基于SSM的mysql-环卫管理平台(源码 + 数据库 + 说明文档)

    毕业设计:基于SSM的mysql_环卫管理平台(源码 + 数据库 + 说明文档) 2 相关技术说明 4 2.1 基于B/S结构开发 4 2.2 Java简介 5 2.3 TomCat服务器 5 2.4 MySQL数据库 6 ...5.3 测试用例 17 5.4 测试结果 20

    Python项目之django-旅游网站设计(源码 + 说明文档)

    Python项目之django-旅游网站设计(源码 + 说明文档) 第二章 关键技术的研究 3 2.1 Django框架 3 2.2 B/S结构 3 2.3 ECLIPSE 开发环境 4 2.4 Tomcat服务器 4 2.5 MySQL数据库 4 第三章 系统分析 5 3.1 系统设计...

Global site tag (gtag.js) - Google Analytics