posts - 14,  comments - 37,  trackbacks - 0
在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

 

 1package onlyfun.caterpillar.test;
 2
 3import junit.framework.Test;
 4import junit.framework.TestSuite;
 5import org.apache.cactus.ServletTestCase;
 6import org.apache.cactus.WebRequest;
 7import org.apache.cactus.extension.jetty.JettyTestSetup;
 8import onlyfun.caterpillar.LoginServlet;
 9
10public class LoginServletTest extends ServletTestCase
11{
12    public static Test suite()
13    {
14        System.setProperty("cactus.contextURL""http://localhost:8080/cactusDemo");
15        TestSuite suite = new TestSuite();
16        suite.addTestSuite(LoginServletTest.class);
17        return new JettyTestSetup(suite);
18    }

19
20    public void beginValidUser(WebRequest webRequest)
21    {
22        webRequest.addParameter("username""justin");
23        webRequest.addParameter("password""123456");
24    }

25
26    public void testValidUser()
27    {
28        LoginServlet loginServlet = new LoginServlet();
29        assertTrue(loginServlet.isValidUser(request));
30    }

31
32    public void beginInValidUser(WebRequest webRequest)
33    {
34        webRequest.addParameter("username""guest");
35        webRequest.addParameter("password""123456");
36    }

37
38    public void testInValidUser()
39    {
40        LoginServlet loginServlet = new LoginServlet();
41        assertFalse(loginServlet.isValidUser(request));
42    }

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

48}

49


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

 

 1package onlyfun.caterpillar;
 2
 3import javax.servlet.http.*;
 4
 5public class LoginServlet extends HttpServlet
 6{
 7    public boolean isValidUser(HttpServletRequest request)
 8    {
 9        String username = request.getParameter("username");
10        String password = request.getParameter("password");
11        if (username == null || password == null || !username.equals("justin")
12                || !password.equals("123456"))
13        {
14            return false;
15        }

16        else
17        {
18            return true;
19        }

20    }

21}

22
然後就可以运行测试了,以下是测试的结果:
 109:26:10.625 EVENT  Starting Jetty/4.2.17
 209:26:10.843 EVENT  Started ServletHttpContext[/cactusDemo]
 309:26:39.203 EVENT  Started SocketListener on 0.0.0.0:8080
 409:26:39.203 EVENT  Started org.mortbay.jetty.Server@758fc9
 5..09:26:40.296 EVENT  Stopping Acceptor  
 6ServerSocket[addr=0.0.0.0/0.0.0.0,port=0,localport=8080]
 709:26:40.296 EVENT  Stopped SocketListener on 0.0.0.0:8080
 809:26:40.296 EVENT  Stopped ServletHttpContext[/cactusDemo]
 909:26:40.296 EVENT  Stopped org.mortbay.jetty.Server@758fc9
10
11Time: 31.453
12
13OK (2 tests)

如您所看到的,整个测试过程相当的简易,Cactus+Jetty隐藏了更多的细节,您测试的行为几乎与只使用JUnit时是一致的。
posted on 2007-07-10 10:19 冰封的爱 阅读(298) 评论(0)  编辑  收藏 所属分类: J2EE

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


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

常用链接

留言簿(3)

随笔档案

文章分类

文章档案

相册

搜索

  •  

最新评论

阅读排行榜

评论排行榜