第一個(gè) Cactus + Jetty 測(cè)試[轉(zhuǎn)]

          轉(zhuǎn)自:http://www.cntesting.com/pic/study/JUnitGossip/FirstCactusWithJetty.htm
          在Tomcat或您的目標(biāo)Container上直接執(zhí)行測(cè)試的好處是,您即完成了單元測(cè)試,也測(cè)試了您的單元與 Container的交互,然而比較麻煩的是,您必須在每一次的修改之後,重新布署相關(guān)的資源、啟動(dòng)Container、運(yùn)行測(cè)試等等,測(cè)試時(shí)較為耗時(shí)耗力。

          對(duì)於簡(jiǎn)單的In-Container單元測(cè)試,您可以使用stub的方式,stub即將真實(shí)系統(tǒng)的一部份引入您的程式之中,讓您的程式可以與這一個(gè)部份進(jìn)行交互,而不一定要將整個(gè)程式置於系統(tǒng)之中。

          stub的好處是,有時(shí)您并不是要測(cè)試程式與整個(gè)系統(tǒng)的行為,并且您也不是每次都可以將程式丟到系統(tǒng)之上運(yùn)行,試想,您不能為了測(cè)試您的單元,而要求真正在服務(wù)客戶的系統(tǒng)不斷的重啟。

          對(duì)於In-Container測(cè)試采取stub的方式,自然就是實(shí)現(xiàn)Container的部份功能,并將測(cè)試置於其中,在這邊您可以使用 Jetty [http://jetty.mortbay.org/jetty/index.html],它是個(gè)Java撰寫的HTTP伺服器,本身也是個(gè) Container,Cactus集成了Jetty,并提供與測(cè)試相關(guān)的簡(jiǎn)便類別。

          使用Cactus+Jetty執(zhí)行測(cè)試,在更大的程度上隱藏了測(cè)試運(yùn)行過(guò)程的細(xì)節(jié),您不必關(guān)心Redirector Proxy,更不一定要關(guān)心TestCase在客戶端與伺服端的行為,運(yùn)行起來(lái)就如同在運(yùn)作一個(gè)JUnit測(cè)試。

          使用Cactus+Jetty進(jìn)行測(cè)試時(shí),Jetty會(huì)在測(cè)試開(kāi)始前完成啟動(dòng),接著進(jìn)行相關(guān)測(cè)試,然後Jetty會(huì)自動(dòng)關(guān)閉,這很方便,另一方面,啟動(dòng) Jetty會(huì)快的多了。

          要使用Cactus+Jetty,請(qǐng)將Cactus下載後的lib目錄中的commons-logging-xxx.jar、 aspectjrt-xxx.jar、cactus-xxx.jar、commons-httpclient-xxx.jar、junit- xxx.jar以及org.mortbay.jetty-xxx.jar設(shè)定至CLASSPATH。

          接著撰寫測(cè)試案例:


          • 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()方法,傳回了一個(gè)JettyTestSetup實(shí)例,如您所想的,這個(gè)實(shí)例除了運(yùn)行TestSuite之外,它還會(huì)啟動(dòng)Jetty。接下來(lái)依測(cè)試案例來(lái)完成程式:
          • 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;
          }
          }
          }

          然後就可以運(yùn)行測(cè)試了,以下是測(cè)試的結(jié)果:
          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 扭轉(zhuǎn)乾坤 閱讀(390) 評(píng)論(0)  編輯  收藏 所屬分類: JAVA使用技巧

          <2025年8月>
          272829303112
          3456789
          10111213141516
          17181920212223
          24252627282930
          31123456

          導(dǎo)航

          統(tǒng)計(jì)

          常用鏈接

          留言簿(2)

          隨筆分類(31)

          隨筆檔案(30)

          文章分類(32)

          文章檔案(33)

          相冊(cè)

          PHP小站-首頁(yè)

          搜索

          積分與排名

          最新評(píng)論

          閱讀排行榜

          評(píng)論排行榜

          主站蜘蛛池模板: 鲜城| 行唐县| 板桥市| 康乐县| 开化县| 金秀| 隆回县| 安达市| 曲靖市| 赣州市| 布拖县| 隆尧县| 商都县| 双鸭山市| 赤水市| 射洪县| 民勤县| 阿拉善右旗| 咸阳市| 兴安县| 当雄县| 靖州| 东源县| 延长县| 蒙阴县| 柳林县| 玉门市| 滨州市| 闻喜县| 云浮市| 奉贤区| 尉犁县| 湖北省| 阿尔山市| 丰台区| 浦东新区| 龙川县| 南部县| 青海省| 商南县| 沙雅县|