转自:
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。
接著撰写测试案例:
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。接下来依测试案例来完成程式:
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.htmlhttp://www.51testing.com/html/6/23.html