第一个 Cactus + Jetty 测试[转]

转自:http://www.cntesting.com/pic/study/JUnitGossip/FirstCactusWithJetty.htm
在Tomcat或您的目标Container上直接执行测试的好处是,您即完成了单元测试,也测试了您的单元与 Container的交互,然而比较麻烦的是,您必须在每一次的修改之後,重新布署相关的资源、启动Container、运行测试等等,测试时较为耗时耗力。

对於简单的In-Container单元测试,您可以使用stub的方式,stub即将真实系统的一部份引入您的程式之中,让您的程式可以与这一个部份进行交互,而不一定要将整个程式置於系统之中。

stub的好处是,有时您并不是要测试程式与整个系统的行为,并且您也不是每次都可以将程式丢到系统之上运行,试想,您不能为了测试您的单元,而要求真正在服务客户的系统不断的重启。

对於In-Container测试采取stub的方式,自然就是实现Container的部份功能,并将测试置於其中,在这边您可以使用 Jetty [http://jetty.mortbay.org/jetty/index.html],它是个Java撰写的HTTP伺服器,本身也是个 Container,Cactus集成了Jetty,并提供与测试相关的简便类别。

使用Cactus+Jetty执行测试,在更大的程度上隐藏了测试运行过程的细节,您不必关心Redirector Proxy,更不一定要关心TestCase在客户端与伺服端的行为,运行起来就如同在运作一个JUnit测试。

使用Cactus+Jetty进行测试时,Jetty会在测试开始前完成启动,接著进行相关测试,然後Jetty会自动关闭,这很方便,另一方面,启动 Jetty会快的多了。

要使用Cactus+Jetty,请将Cactus下载後的lib目录中的commons-logging-xxx.jar、 aspectjrt-xxx.jar、cactus-xxx.jar、commons-httpclient-xxx.jar、junit- xxx.jar以及org.mortbay.jetty-xxx.jar设定至CLASSPATH。

接著撰写测试案例:


  • LoginServletTest.java
package onlyfun.caterpillar.test;

import junit.framework.Test;
import junit.framework.TestSuite;

import org.apache.cactus.ServletTestCase;
import org.apache.cactus.WebRequest;
import org.apache.cactus.extension.jetty.JettyTestSetup;

import onlyfun.caterpillar.LoginServlet;

public class LoginServletTest extends ServletTestCase {
public static Test suite() {
System.setProperty("cactus.contextURL",
"http://localhost:8080/cactusDemo");
TestSuite suite = new TestSuite();
suite.addTestSuite(LoginServletTest.class);
return new JettyTestSetup(suite);
}

public void beginValidUser(WebRequest webRequest) {
webRequest.addParameter("username", "justin");
webRequest.addParameter("password", "123456");
}

public void testValidUser() {
LoginServlet loginServlet = new LoginServlet();
assertTrue(loginServlet.isValidUser(request));
}

public void beginInValidUser(WebRequest webRequest) {
webRequest.addParameter("username", "guest");
webRequest.addParameter("password", "123456");
}

public void testInValidUser() {
LoginServlet loginServlet = new LoginServlet();
assertFalse(loginServlet.isValidUser(request));
}

public static void main(String[] args) {
junit.textui.TestRunner.run(
LoginServletTest.suite());
}
}

在这边要特别注意的是suite()方法,传回了一个JettyTestSetup实例,如您所想的,这个实例除了运行TestSuite之外,它还会启动Jetty。接下来依测试案例来完成程式:
  • LoginServlet.java
package onlyfun.caterpillar;

import javax.servlet.http.*;

public class LoginServlet extends HttpServlet {
public boolean isValidUser(HttpServletRequest request) {
String username = request.getParameter("username");
String password = request.getParameter("password");

if(username == null ||
password == null ||
!username.equals("justin") ||
!password.equals("123456")) {
return false;
}
else {
return true;
}
}
}

然後就可以运行测试了,以下是测试的结果:
09:26:10.625 EVENT  Starting Jetty/4.2.17
09:26:10.843 EVENT  Started ServletHttpContext[/cactusDemo]
09:26:39.203 EVENT  Started SocketListener on 0.0.0.0:8080
09:26:39.203 EVENT  Started org.mortbay.jetty.Server@758fc9
..09:26:40.296 EVENT  Stopping Acceptor 
ServerSocket[addr=0.0.0.0/0.0.0.0,port=0,localport=8080]
09:26:40.296 EVENT  Stopped SocketListener on 0.0.0.0:8080
09:26:40.296 EVENT  Stopped ServletHttpContext[/cactusDemo]
09:26:40.296 EVENT  Stopped org.mortbay.jetty.Server@758fc9

Time: 31.453

OK (2 tests)



还可以参考http://kb.csdn.net/java/Articles/200312/2a86aa04-cbf1-4eda-98a4-902b1c974cc7.html
http://www.51testing.com/html/6/23.html

posted on 2006-03-02 09:09 扭转乾坤 阅读(380) 评论(0)  编辑  收藏 所属分类: JAVA使用技巧


只有注册用户登录后才能发表评论。


网站导航:
 
<2024年11月>
272829303112
3456789
10111213141516
17181920212223
24252627282930
1234567

导航

统计

常用链接

留言簿(2)

随笔分类(31)

随笔档案(30)

文章分类(32)

文章档案(33)

相册

PHP小站-首页

搜索

积分与排名

最新评论

阅读排行榜

评论排行榜