posts - 5, comments - 24, trackbacks - 0, articles - 20
            BlogJava :: 首頁 :: 新隨筆 :: 聯系 :: 聚合  :: 管理

          AppFuse學習筆記-單元測試 7

          Posted on 2007-04-27 17:35 kook 閱讀(359) 評論(0)  編輯  收藏 所屬分類: J2EE
          AppFuse為幾乎每一個類都提供了單元測試, 它使用JUnit框架進行測試。我們還是以User為例仔細分析一下,閱讀本篇的內容之前,你至少應該已經對單元測試有一個概念。

          1. DAO測試
              UserDAOTest用于測試UserDAO這個接口和它的實現UserDAOHibernate,它在test/dao/**/dao/中。
              所有的DAOTest都繼承自BaseDAOTestCase,BaseDAOTestCase繼承自TestCase。這個父類已經為我們寫好了從Spring加載ApplicationContext的方法。
              setUp()里做了在測試之前的初始化工作,創建了UserDAO和RoleDAO的實例,tearDown()里做銷毀工作,這是每個Junit測試類都要做的事。
              以testUpdateUser()方法為例,該方法主要用于測試UserDAO的saveUser()方法是否正確。首先調用getUser()獲得用戶“tomcat”的信息,并修改其地址,然后調用saveUser()方法保存修改的記錄。重新獲得“tomcat”的信息,校驗其地址是否為新地址,如果地址為新地址,測試成功。接下來把“tomcat”的version屬性的值置空(version為驗證當前記錄是否為新記錄的標志,null表示新紀錄),重新保存“tomcat”,此時hibernate會認為該記錄為新記錄,進行insert操作,但username字段為主鍵不能重復,因此應該拋出異常。如果捕獲到異常,測試成功。
              在控制臺進入項目根目錄,鍵入ant test-dao -Dtestcase=UserDAO,如果出現BUILD SUCCESSFUL,說明測試成功。這樣,我們不需要寫Manager、Action、JSP,不需要運行容器也可以確保我們的類正確了。

          2. Manager測試
              接下來繼續看測試UserManager的類UserManagerTest。它在test/service/**/service/中,繼承自BaseManagerTestCase,這個父類起著與BaseDAOTestCase類似的作用。
              與UserDAOTest不同的是UserManagerTest使用了jMock幫助其測試。jMock用于解決UserManager的依賴,因為UserManager中需要調用UserDAO的方法,而單元測試的基本規則是一次只測試一個對象,jMock幫助你把UserManager孤立起來,使它不會受到UserDAO的影響,我們來看它到底怎么做。
              在setUp()里,我們把UserDAO和RoleDAO放到Mock中,讓Mock來做UserDAO和RoleDAO的代理,并將這兩個“假冒的”DAO注入到UserManager中。
              還是以testSaveUser()為例來看這個test類怎么工作。首先創建User對象,設置用戶名為“tomcat”,權限為“user”。然后我們告訴Mock當UserManager調用UserDAO的getUser()方法并參數是“tomcat”時,我們期待UserDAO返回我們剛剛創建的那個對象。接下來調用UserManager的getUser()方法以獲得“tomcat”的信息。修改電話號碼的內容。然后重置我們對Mock的要求。這次我們要求當UserManager調用UserDAO的saveUser方法時,不返回任何值。然后調用UserManager的saveUser()方法,校驗user是否為新的電話號碼和權限是否還是一個,若是,測試成功。verify()用于檢查所有應該調用的方法是否都被調用了。通常來說,每對Mock對象調用了一次expects(),使用完后都要執行一次verify()。
              在控制臺執行ant test-service -Dtestcase=UserManager,看看結果。

          3. Action測試
              我們繼續看test/web/**/action下的UserActionTest。它繼承自BaseStrutsTestCase,BaseStrutsTestCase繼承MockStrutsTestCase,這個父類也做了類似BaseManagerTestCase的工作。
              Action是一個控制器,主要用于接收視圖層的請求,調用模型層的方法,然后返回視圖層。在這里我們不關心模型層或視圖層,我們只要關心Action是否能夠正確的得到請求和響應請求,以及能夠正確的根據請求轉向。MockStrutsTestCase給了我們測試這方面很好的支持。
              以testSave()為例,首先創建一個UserForm,在里面放入部分數據,將UserForm放入該Action所對應的范圍內。使用setRequestPathInfo()設置請求路徑為“/saveUser”,使用addRequestParameter()添加好請求參數,actionPerform()方法將模擬請求的全過程。然后使用verifyForward()方法驗證請求轉發路徑是否正確。并驗證能不能在Action范圍內得到UserForm。
              運行ant test-web -Dtestcase=UserAction,OK。
              要注意一點,這里的單元測試雖然繼承自MockStrutsTestCase,但沒有使用Mock,也就是說,它會真正執行到所有相關的方法,包括修改數據庫。

          4. JSP測試
              我們同樣可以對JSP進行測試。這里有一個工具叫做Canoo WebTest,它使用xml配置的方式來測試JSP。
              進入test/web/,有一個web-tests.xml文件,里面有所有struts-config.xml中存在的path的測試。
              以SaveUser這個target為例,我們做一個簡單的說明。測試步驟包含在steps中,invoke中給這個step定一個ID號,設置請求的url:editProfile.html。接下來驗證JSP頁面的title是否與預期的一致。其中{webapp.prefix}和{userProfile.title}的內容在WEB-INF\classes中的ApplicationResources中定義。接下來給表單中的文本域填寫內容,使用clickbutton點擊保存按鈕,驗證保存后的頁面標題是否為預期的標題。
              這一測試需要運行容器,因此首先運行Tomcat,再在控制臺鍵入ant test-canoo -Dtestcase=UserTests或ant test-jsp -Dtestcase=PersonTests。使用ant run-all-tests無需運行Tomcat,Ant為你做這件事。

          主站蜘蛛池模板: 耒阳市| 明水县| 庆城县| 前郭尔| 南宁市| 阳朔县| 新昌县| 奉节县| 新闻| 顺义区| 车险| 哈尔滨市| 开原市| 厦门市| 长春市| 盐山县| 增城市| 梧州市| 济南市| 天台县| 沁水县| 安溪县| 正宁县| 阳谷县| 连城县| 会泽县| 玉龙| 鹤峰县| 山阳县| 互助| 云林县| 凌海市| 灵丘县| 灯塔市| 九龙城区| 巫山县| 文昌市| 衢州市| 清水河县| 曲靖市| 永兴县|