<rt id="bn8ez"></rt>
<label id="bn8ez"></label>

  • <span id="bn8ez"></span>

    <label id="bn8ez"><meter id="bn8ez"></meter></label>

    隨筆-26  評論-13  文章-46  trackbacks-0
    利用StrutsTestCase測試Struts應用程序




    作者:葉楓(http://blog.matrix.org.cn/page/葉楓)
    原文:[http://www.matrix.org.cn/resource/article/44/44008_StrutsTestCase.html]http://www.matrix.org.cn/resource/article/44/44008_StrutsTestCase.html[/url]
    關鍵字:Struts StrutsTestCase


    一、Struts測試概述
    ??
    ??一個具有良好系統架構的J2EE應用程序至少有三層組成,即表現層,商業層和系統
    集成層(包括數據存取以及和其他系統集成),目前,Struts是應用比較廣泛,實現MVC2模式應用于表現層的一種技術. 在這里面,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是一個開源工具,可以到http://strutstestcase.sourceforge.net下載. 目前最新版本是2.1.3,
    如果你使用Servlet2.3就下載StrutsTestCase213-2.3.jar,使用Servlet2.4的就下載StrutsTestCase213-2.4.jar.
    另外StrutsTestCase本身就是從JUnit繼承的,所以你還需要下載JUnit3.8.1.

    ??在本文中,我們用一個簡單的例子來做測試. 假設我們有一張表Hotline(country varchar2(50),pno varchar2(50)),
    我們要做的是根據輸入條件從這張表檢索相應的記錄.檢索條件是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) {
    ????????????????this.country = country;
    ????????}

    ????????public void setPno(String pno) {
    ????????????????this.pno = pno;
    ????????}

    ????????public String getCountry() {
    ????????????????return (this.country);
    ????????}

    ????????public String getPno() {
    ????????????????return (this.pno);
    ????????}????????
    ??????}


    ActionForm:
    ??????
    package sample;
    ??????import org.apache.struts.action.ActionForm;
    ??????public class HotlineActionForm extends ActionForm{
    ????????private String country = "";
    ????????private String pno = "";????????
    ????????/**
    ???????? * Method HotlineActionForm
    ???????? *
    ???????? *
    ???????? */
    ????????public HotlineActionForm() {
    ????????????????super();
    ????????}

    ????????
    ????????public void setCountry(String country) {
    ????????????????this.country = country;
    ????????}

    ????????public void setPno(String pno) {
    ????????????????this.pno = pno;
    ????????}

    ????????public String getCountry() {
    ????????????????return (this.country);
    ????????}

    ????????public String getPno() {
    ????????????????return (this.pno);
    ????????}????????
    ??????}
    ??


    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 = HotlineDAO.getHotlineList(country);
    ???????? if(hotlineList!=null && hotlineList.size()>0){
    ????????????request.setAttribute("hotlineList",hotlineList);
    ????????????target = "hotlineList";
    ???????? }else{
    ????????????target = "notfound";
    ???????? }
    ????????}catch(Exception ex){
    ?????????? ....
    ????????}
    ????????????????
    ????????
    ???? }


    Struts Config:
    ??
    <struts-config>
    ??
    ?? <form-beans>
    ???? <form-bean name="hotlineActionForm" type="sample.HotlineActionForm" />
    ?????? .......
    ?? </form-beans>
    ??<action-mappings>
    ???? <action path="/SearchHotline"
    ?????????? name="hotlineActionForm"
    ?????????? type="sample.SearchHotlineAction "
    ???????????????????? scope="request"??????????????????????????????????
    ?????????????????? validate="false">
    ??????<forward name="hotlineList" path="/hotlineList.jsp"/>????????
    ??????<forward name="notfound" path="/searchHotline.jsp"/>
    ?? </action>
    ????.....
    ??<action-mappings>
    ?? ........
    <struts-config>


    四、初試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("/SearchHotline.do");
    ????addRequestParameter("country", "CN");
    ????actionPerform();
    ????}
    ????}


    ?? 上面的Class相信用過JUnit的朋友都很熟悉.
    ????好了,一個簡單的測試例子就完成了,如果你用的是Eclipse就選擇Run-Run...-JUnit-New就可以直接運行.不需要發布你的程序,不需要任何的Web服務器支持,就可以測試Struts Action,這就是StrutsTestCase帶來的好處.下面簡單地介紹一下它是怎么工作的.

    ????在上面的例子中,我們調用setRequestPathInfo()告訴StrutsTestCase我們要模擬JSP調用SearchHotline.do這個Action,并且調用addRequestParameter()增加了一個參數country.最后調用actionPerform()運行.

    看到這里,大家發現一個問題沒有? 在上面Action的源代碼里我們是通過

    String country=((HotlineActionForm)form).getCountry();


    也就是ActionForm來取得輸入的參數值,可我們在testSearchHotline()方法里并沒有設置ActionForm?

    那么它是怎么出來的呢? 其實大家如果熟悉Struts的運行流程的話就知道,JSP接受用戶的輸入并發請求時
    都是類似這樣的http://hostname/servletName?param1=value1&param2=value2. 只是Struts接受到這些
    參數后再根據Struts Config里的Action和ActionForm的映射把他們轉為ActionForm后傳給Action的.

    ?? 在上面的例子,我們只是簡單地運行了Action,那么Action是否正確執行以及返回的結果是不是我們想要的呢?

    我們繼續完善一下testSearchHotline()這個Method.

    public void testSearchHotline() throws Exception{
    ????setRequestPathInfo("/SearchHotline.do");
    ????addRequestParameter("country", "CN");
    ????actionPerform();
    ????verifyNoActionErrors();
    ????verifyForward("hotlineList");
    ????assertNotNull(request.getAttribute("hotlineList"));
    ????List hotlineList = (List) request.getAttribute("hotlineList");
    ????for (Iterator it = hotlineList.iterator();it.hasNext();){
    ???? ....
    ????}
    ????}


    我們在actionPerform()后增加了幾行語句來斷定Struts Action是否正確執行.
    ?? verifyNoActionErrors() -- 判斷Action里沒有任何的Action;
    ?? verifyForward("hotlineList") -- 判斷Action確實轉發到hotlineList;??????
    ?? assertNotNull(request.getAttribute("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時用的

    六、關于Web.xml和Struts-Config.xml

    ??缺省情況下,StrutsTestCase認為你的Web.xml和struts-config.xml的路徑分別是:
    ??/WEB-INF/web.xml和/WEB-INF/struts-config.xml

    ??1. 假如你的web.xml/struts-config.xml的路徑是
    ??d:/app/web/WEB-INF/web.xml(struts-config.xml)的話,就需要把d:/app/web加到classpath.
    ??
    ??2. 假如你的struts config是strust-config-module.xml,
    ??那么必須調用setConfigFile()設置你的struts config文件
    ??

    七、結束語
    ??J2EE應用程序的測試在開發過程中占有相當重要的位置,利用StrutsTestCase能極大方便你測試基于Struts的應用程序.
    posted on 2006-04-26 13:47 似水流年 閱讀(208) 評論(0)  編輯  收藏 所屬分類: Struts

    只有注冊用戶登錄后才能發表評論。


    網站導航:
     
    主站蜘蛛池模板: 免费精品一区二区三区第35| 国产亚洲人成在线影院| 久久久精品免费国产四虎| 亚洲国模精品一区| 国产AV无码专区亚洲AV麻豆丫| 在线播放高清国语自产拍免费| 亚洲人成电影网站| 最新欧洲大片免费在线| 亚洲免费福利视频| 啦啦啦高清视频在线观看免费| 亚洲а∨天堂久久精品9966| 久久电影网午夜鲁丝片免费| 亚洲avav天堂av在线网毛片| 全部免费毛片在线| 日批视频网址免费观看| 亚洲国产精品久久久久网站| 114一级毛片免费| 亚洲成在人线aⅴ免费毛片| 免费大学生国产在线观看p| 国产裸体美女永久免费无遮挡| 亚洲精品乱码久久久久久按摩| 国产精品免费高清在线观看| 亚洲丝袜中文字幕| 国产精品免费看久久久久| 一级毛片成人免费看a| 久久亚洲精品成人| 国拍在线精品视频免费观看| 麻豆亚洲AV成人无码久久精品 | 成年男女免费视频网站| 理论亚洲区美一区二区三区| 亚洲中文字幕日产乱码高清app| 免费看搞黄视频网站| 亚洲中文字幕无码中文字| 亚洲综合图色40p| 成人黄色免费网址| 人妻无码中文字幕免费视频蜜桃 | 最近中文字幕mv免费高清电影| 精品视频免费在线| 亚洲一区二区三区夜色 | 成人免费无码大片a毛片软件 | 青青草免费在线视频|