- 浏览: 914657 次
- 性别:
- 来自: 北京
文章分类
- 全部博客 (537)
- Java SE (114)
- Struts (18)
- Hibernate (25)
- Spring (3)
- Page_Tech (41)
- Others (87)
- Database (29)
- Server (24)
- OpenSource_Tools (15)
- IDE_Tool (22)
- Algorithm (28)
- Interview (22)
- Test (28)
- Hardware (1)
- Mainframe (25)
- Web application (4)
- Linux (3)
- PHP (17)
- Android (1)
- Perl (6)
- ubuntu (1)
- Java EE (9)
- Web Analysis (5)
- Node.js (2)
- javascript (2)
最新评论
-
一键注册:
request.getRequestURL()和request.getRequestURI() -
SuperCustomer:
...
SED的暂存空间和模式空间 -
juyo_ch:
讲得挺好理解的,学习了
java 死锁及解决 -
chinaalex:
最后一题答案正确,但是分析有误.按照如下过程,上一行为瓶,下一 ...
zz智力题 -
liaowuxukong:
多谢博主啦,弱弱的了解了一点。
C++/Java 实现多态的方法(C++)
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/
发表评论
-
Bugzilla 中文手册
2012-08-21 10:22 18953Bugzilla 是一个开源的缺陷跟踪系统(Bug ... -
(zz) Web Service 测试方法
2012-07-12 17:29 17141.WebService简介 WebService ... -
Rational Functional 测试命令接口
2012-05-17 13:26 892Functional Test Command-Line ... -
【原】JUNIT 源码分析之TestSuite
2012-04-25 21:59 1525Junit是如何使用适配器模式的呢?概念上可以理解,但 ... -
分享selenium+testng+reprotng+ant配置
2012-04-19 16:12 3537一、Configure1. 安装testNG插件到eclips ... -
[YUAN] JUNIT 源码分析总结
2012-04-11 15:21 1009今天看了下Junit3的源码,记录下一些心得。 J ... -
【zz】Ant + Junit 实现自动化测试
2012-04-10 14:01 1989在软件开发过程中,我 ... -
关键字驱动测试的原理和概念
2012-04-09 13:45 1713原理及特点 1. ... -
LoadRunner安装及破解
2012-03-19 15:13 10901、去HP的官方网 ... -
Web测试的一些思路
2012-03-19 15:10 841WEB测试分为6个部分: ●功能测试 ● ... -
测中策 - Web自动化测试的策略
2012-03-13 17:01 933大不可量,深不可测&quo ... -
软件测试的思路
2012-02-26 21:08 871任何东西的测试与软 ... -
TC interview
2012-02-21 11:34 10021. 自我介绍 2. 工作内容,完成过的具体项目及职责 3 ... -
RFT中文操作指南(下)
2011-04-02 15:05 1327练习 1.6:回归测试 在 ... -
RFT中文操作指南(上)
2011-04-02 15:03 1038练习 1.1:设置 Functional Test IB ... -
理解自动化测试
2011-04-02 11:06 1684“自动化测试”有时也叫“测试自动化”,由两部分组成,“自动化” ... -
一个纸杯子的测试用例
2010-10-26 11:52 1208一个纸杯,我们能想出多少个测试用例呢?想必很多人 ... -
测试一个搜索框
2010-10-26 11:51 1622摸索中,还很不成熟,但愿能抛砖引玉吧,我做的搜索测试是来抓取百 ... -
测试用例编写的“侯式标准”
2010-10-26 11:51 1468作为软件测试人员 ... -
编写测试用例方法心得体会
2010-10-26 11:47 1367在我的个人邮箱和MSN上,通常同行都问我类似下面这样的问题: ...
相关推荐
在IT行业中,HTTP通信测试和Java Servlet测试是Web应用程序开发中的关键环节,它们确保了客户端与服务器之间的数据传输准确无误。在这个场景中,我们关注的是如何通过HTTP协议进行通信,以及如何使用Java Servlet来...
在单元测试Servlet Filter时,我们通常关注以下几个方面: 1. **Filter配置**:确保Filter能够正确地配置并注册到Servlet容器。这包括验证`web.xml`或Java配置类中的`@WebFilter`注解设置,如filter-name、url-...
为了测试Servlet,我们需要在IDEA中配置运行Tomcat服务器,并将Servlet部署到服务器上。在IDEA的Run/Debug Configurations中,添加一个新的Tomcat Server配置,指定Tomcat安装路径。然后,将项目添加到部署列表中。 ...
在描述中提到,`doGet()`方法常用于测试Servlet中的数据库查询功能。这通常涉及到以下步骤: 1. **连接数据库**:首先,你需要建立到数据库的连接。这可能通过JDBC(Java Database Connectivity)实现,使用`...
JSP Servlet基础知识测试题
jsp/servlet阶段测试 本资源总结了jsp和servlet的阶段性测试,涵盖了servlet和jsp的基础知识点,包括servlet的生命周期、jsp的隐含对象、Filter的用途、Listener的类型、Request、Session和Application的区别等。 ...
【XML OVER HTTP的测试servlet】是一个用于演示和测试如何通过HTTP协议传输XML数据的Java Servlet。在Web应用中,XML(eXtensible Markup Language)常被用于数据交换,因为它具有结构化、可扩展性以及平台和语言...
### 虚拟目录与Servlet测试详解 在深入解析虚拟目录及Servlet测试的过程之前,我们首先需要理解几个关键概念:虚拟目录、Servlet以及Tomcat服务器的配置方式。 #### 虚拟目录的理解 虚拟目录是Web服务器的一个...
在"easymock测试servlet"的场景中,我们看到`SampleServletTest`类正在使用Easymock来测试`SampleServlet`类的行为。以下是一些关键知识点: 1. **Easymock库**:Easymock是一个开源库,它提供了模拟Java对象的方法...
在这个“servlet实现身高体重比测试”的项目中,我们将深入理解Servlet的生命周期、EL(Expression Language)表达式的应用以及如何在实际场景中结合它们来构建Web应用程序。 1. **Servlet生命周期**: - **加载与...
`junit`和`easymock`是两个非常重要的Java测试工具,它们可以帮助我们有效地对Servlet进行单元测试和模拟测试。 `junit`是一个流行的开源单元测试框架,它为Java程序员提供了一种方便的方式来编写和运行可重复的...
在测试Servlet时,我们可以使用JUnit框架结合Mockito库来模拟HTTP请求。创建一个JUnit测试类,为Servlet的各个方法编写测试用例,确保在不同情况下都能得到正确的响应。例如,测试`doGet()`方法是否能正确处理GET...
- MVC框架:在大型项目中,推荐使用MVC框架(如Spring MVC、Struts)来管理和分发请求,这样可以更好地分离关注点,提高代码的可读性和可测试性。 6. **示例代码**: ```java protected void doGet...
【JSP&Servlet测试题解析】 1. JSP(JavaServer Pages)是由Sun Microsystems公司推出的一种动态网页技术,它将内容的生成和显示进行了分离,使得开发者能够专注于业务逻辑而不是页面展示。JSP强调可重用的组件,...
本项目中的"Servlet定时器功能完整版已测试过"是一个Java Web应用,利用Servlet实现了定时器功能。这通常涉及到计划执行的任务,例如数据备份、日志清理或者定期发送通知等。 首先,我们要理解Servlet容器如Tomcat...
Servlet测试应用.zip是一个包含完整Servlet测试项目的压缩包,旨在帮助开发者理解和实践Servlet的相关功能和工作流程。这个项目可能包含了从创建Servlet到部署运行的所有必要文件,是学习和调试Servlet的理想资源。 ...
#### 七、测试Servlet 完成所有步骤后,可以通过访问`http://localhost:8080/hspweb/ABC`来测试Servlet是否正确运行。如果一切顺利,页面上应该会显示“Hello World!”以及当前的时间。 #### 八、总结 通过以上步骤...
7. **测试Servlet**: - 启动Web服务器后,可以通过浏览器访问Servlet。在上述示例中,访问`http://localhost:8080/yourapp/myservlet`(根据你的服务器配置和端口号调整)来测试Servlet。 此外,`index.html`和`3...
4. 测试:启动服务器,通过浏览器访问配置的URL,查看Servlet是否正确处理请求和响应。 五、Servlet的优势与应用场景 Servlet具有平台无关性、可扩展性和高性能等特点,常用于实现动态网站、Web服务、数据处理等...
再进行部署测试,运行。 四、实验步骤 1. 创建一个 web 项目命名为 myproject。 2. 创建登陆页面 index.jsp 代码如下: index.jsp 代码主要实现了登陆页面的布局和样式,并使用 JavaScript 实现了表单的提交功能...