熱點推薦:
您现在的位置: 電腦知識網 >> 編程 >> Java編程 >> Java開源技術 >> 正文

用StrutsTestCase測試Struts應用程序

2013-11-23 20:42:22  來源: Java開源技術 

  Struts測試概述
  
  一個具有良好系統架構的JEE應用程序至少有三層組成即表現層商業層和系統
  
  集成層(包括數據存取以及和其他系統集成)目前Struts是應用比較廣泛實現MVC模式應用於表現層的一種技術 在這裡面Struts Action主要用來完成一些簡單的數據校驗轉換以及流程轉發控制(注意:這裡流程不是業務規則) 因此在對整個應用程序進行測試時我們同時也要測試Struts Action
  
  但是測試Struts Action相對測試簡單的JavaBean是比較困難因為Struts是運行在Web服務器中 因此要測試Struts Action就必須發布應用程序然後才能測試 我們想象一下對於一個擁有上千個JSP page和數百甚至數千Java Classes的大規模應用程序要把他們發布到諸如Weblogic之類的應用服務器再測試需要多少的時間和硬件資源? 所以這種模式的測試是非常費時費力的
  
  所以如果有一種辦法能夠不用發布應用程序不需要Web服務器就能象測試普通Java Class一樣測試Struts Action那就能極大地加強Struts的可測試性能使應用程序測試更為容易簡單快速 現在這個工具來了這就是StrutsTestCase
  
  StrutsTestCase 概述
  
  StrutsTestCase 是一個功能強大且容易使用的Struts Action開源測試工具它本身就是在大名鼎鼎的JUnit基礎上發展起來的因此通過和JUnit結合使用能極大加強應用程序的測試並加快應用程序的開發
  
  StrutsTestCase提供了兩者測試方式模仿方式和容器測試方式 所謂模仿方式就是有StrutsTestCase本身來模擬Web服務器 而容器測試方式則需要Web服務器 本文要討論的是前者原因很簡單不需要Web服務器就能象測試普通的Java Class一樣測試Struts Action
  
  准備StrutsTestCase和Struts Action/ActionForm/Config
  
  StrutsTestCase是一個開源工具可以到下載 目前最新版本是
  
  如果你使用Servlet就下載StrutsTestCasejar使用Servlet的就下載StrutsTestCasejar
  
  另外StrutsTestCase本身就是從JUnit繼承的所以你還需要下載JUnit
  
  在本文中我們用一個簡單的例子來做測試 假設我們有一張表Hotline(country varchar()pno varchar())
  
  我們要做的是根據輸入條件從這張表檢索相應的記錄檢索條件是country
  
  Value Object:
  package sample;
  public class HotlineDTO implements Serializable{
  private String country = ;
  private String pno = ;
  /**
  * Method HotlineActionForm
  *
  *
  */
  public HotlineDTO () {
  super();
  }
  public void setCountry(String country) {
  untry = country;
  }
  public void setPno(String pno) {
  thispno = pno;
  }
  public String getCountry() {
  return (untry);
  }
  public String getPno() {
  return (thispno);
  }
  }
  
  ActionForm:
  package sample;
  import orgapachestrutsactionActionForm;
  public class HotlineActionForm extends ActionForm{
  private String country = ;
  private String pno = ;
  /**
  * Method HotlineActionForm
  *
  *
  */
  public HotlineActionForm() {
  super();
  }
  public void setCountry(String country) {
  untry = country;
  }
  public void setPno(String pno) {
  thispno = pno;
  }
  public String getCountry() {
  return (untry);
  }
  public String getPno() {
  return (thispno);
  }
  }
  
  Action Class:
  public class SearchHotlineAction extends Action {
  public ActionForward execute(ActionMapping mapping ActionForm form HttpServletRequest request
  HttpServletResponse response) throws Exception {
  String target = ;
  try{
  //調用HotlineDAO檢索hotline
  String country=((HotlineActionForm)form)getCountry();
  List hotlineList = HotlineDAOgetHotlineList(country);
  if(hotlineList!=null && hotlineListsize()>){
  requestsetAttribute(hotlineListhotlineList);
  target = hotlineList;
  }else{
  target = notfound;
  }
  }catch(Exception ex){
  
  }
  }
  
  Struts Config:
  <strutsconfig>
  <formbeans>
  <formbean name=hotlineActionForm type=sampleHotlineActionForm />
    </formbeans> <actionmappings>
  <action path=/SearchHotline
  name=hotlineActionForm
  type=sampleSearchHotlineAction
  scope=request
  validate=false>
  <forward name=hotlineList path=/hotlineListjsp/>
  <forward name=notfound path=/searchHotlinejsp/>
  </action>
  
  <actionmappings>
   <strutsconfig>
  
  初試StrutsTestCase
  
  當采用模擬方式時所有的StrutsTestCase測試Class都是從MockStrutsTestCase繼承下來的
  
  下面我們就創建一個最簡單的測試Class
  public class SearchHotlineAction extends MockStrutsTestCase {
  public void setUp()throws Exception{
  }
  public void tearDown()throws Exception{
  }
  public void testSearchHotline() throws Exception{
  setRequestPathInfo(/SearchHotlinedo);
  addRequestParameter(country CN);
  actionPerform();
  }
  }
  
  上面的Class相信用過JUnit的朋友都很熟悉
  
  好了一個簡單的測試例子就完成了如果你用的是Eclipse就選擇RunRunJUnitNew就可以直接運行不需要發布你的程序不需要任何的Web服務器支持就可以測試Struts Action這就是StrutsTestCase帶來的好處下面簡單地介紹一下它是怎麼工作的
  
  在上面的例子中我們調用setRequestPathInfo()告訴StrutsTestCase我們要模擬JSP調用SearchHotlinedo這個Action並且調用addRequestParameter()增加了一個參數country最後調用actionPerform()運行
  
  看到這裡大家發現一個問題沒有? 在上面Action的源代碼裡我們是通過
  
  String country=((HotlineActionForm)form)getCountry();
  
  也就是ActionForm來取得輸入的參數值可我們在testSearchHotline()方法裡並沒有設置ActionForm?
  
  那麼它是怎麼出來的呢? 其實大家如果熟悉Struts的運行流程的話就知道JSP接受用戶的輸入並發請求時都是類似這樣//hostname/servletName?param=value¶m=value 只是Struts接受到這些參數後再根據Struts Config裡的Action和ActionForm的映射把他們轉為ActionForm後傳給Action的
  
  在上面的例子我們只是簡單地運行了Action那麼Action是否正確執行以及返回的結果是不是我們想要的呢?
  
  我們繼續完善一下testSearchHotline()這個Method
  
  public void testSearchHotline() throws Exception{
  setRequestPathInfo(/SearchHotlinedo);
  addRequestParameter(country CN);
  actionPerform();
  verifyNoActionErrors();
  verifyForward(hotlineList);
  assertNotNull(requestgetAttribute(hotlineList));
  List hotlineList = (List) requestgetAttribute(hotlineList);
  for (Iterator it = erator();ithasNext();){
  
  }
  }
  
  我們在actionPerform()後增加了幾行語句來斷定Struts Action是否正確執行
  
  verifyNoActionErrors() 判斷Action裡沒有任何的Action;
  verifyForward(hotlineList) 判斷Action確實轉發到hotlineList;
  assertNotNull(requestgetAttribute(hotlineList)) 判斷Action確實返回了hotlineList並且不為空
  
  到這裡我們已經基本上討論完了StrutsTestCase的核心部分 從頭到尾我們沒有發布應用程序也不需要Web服務器對我們來講Struts Action就象普通的Java Class一樣容易調試測試這就是StrutsTestCase給我們帶來的方便
  
  深入StrutsTestCase
  
  除了以上我們用到的幾個斷定和校驗方法外StrutsTestCase還提供了其他幾個方法便於我們測試Struts Action 下面我一一講述具體的大家可以參考文檔
  
  verifyActionErrors/Messages  校驗ActionActionServlet controller 是否發送了ActionError或ActionMessage  參數為ActionError/Message Key
  verifyNoActionErrors/Messages 校驗ActionActionServlet controller 沒有發送ActionError或ActionMessage
  VerifyForward 校驗Action是否正確轉發到指定的ActionForward
  VerifyForwardPath 校驗Action是否正確轉發到指定的URL
  verifyInputForward 校驗Action是否轉發到Action Mapping裡的input屬性
  verifyTilesForward/verifyInputTilesForward和以上類似應用程序使用到tiles時用的
  
  關於Webxml和StrutsConfigxml
  
  缺省情況下StrutsTestCase認為你的Webxml和strutsconfigxml的路徑分別是:
  /WEBINF/webxml和/WEBINF/strutsconfigxml
  
   假如你的webxml/strutsconfigxml的路徑是d:/app/web/WEBINF/webxml(strutsconfigxml)的話就需要把d:/app/web加到classpath
  
   假如你的struts config是strustconfigmodulexml那麼必須調用setConfigFile()設置你的struts config文件
  
  結束語
  
  JEE應用程序的測試在開發過程中占有相當重要的位置利用StrutsTestCase能極大方便你測試基於Struts的應用程序
From:http://tw.wingwit.com/Article/program/Java/ky/201311/28938.html
    推薦文章
    Copyright © 2005-2013 電腦知識網 Computer Knowledge   All rights reserved.