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

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

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

    隨筆-55  評論-208  文章-0  trackbacks-0

    記得我以前寫過一個文章是有關于4層web結構單元測試的,今天打算對TDD的環境問題重新討論一下。

    我當時的4層結構的單元測試時間上是從DAO到Service到Action再到JSP一種漸進測試,但是的想法是,先測DAO,那么Service對DAO的調用就有保證了,測試了Service,那么action調用service就有保證了。。。這樣一層一層下來,我每層測試的目標也就達到了。這里其實我用了一個技巧,就是通過測試的順序,來逐漸的構建了每層測試所需的外部環境。當然從這個角度來看,我當時使用的方法更貼近于集成測試了。

    一般做TDD的時候最大的問題就是如何處理外部環境,這一般包括本身業務邏輯環境和技術框架環境。

    在當前這個新項目中,我首先嘗試對一個具體渲染器的測試方式就是用mock,這里用的是比較好用的easyMock。開始的時候覺得mock的方法很好用,但是當我發現我的待測方法中有多個需要mock的對象時(a.getX();b.getY();c.getZ())或者一個mock對象要通過多次級聯獲取時(如 a.getB().getC().getD().getE())就會發現mock的代價讓你高到很不原意mock的地步。

    而且當我們的框架卻制造了一個讓我無法逾越的障礙,就是我們對于manager(DAO)的調用都是用一個類的靜態方法封裝管理(比較奇怪為什么不用spring來進行管理呢)。這樣靜態方法就沒法mock了,于是乎,要想測試就要采用build的方法了,就是你可以在你的testCase中事先通過已經實現好的DAO方法把需要使用到的業務對象真實的build出來,這樣你就可以知道你的被測方法中通過dao調用到的數據究竟是什么了,于是就可以對你期望獲得的結果和經過實際方法得到的結果進行對比驗證了。
    看起來好像也是比較方便,但是實際上當你待測對象的業務模型,依賴于3-4級以上的相關模型時,你就會感覺到,這樣build是一個代價非常高的事情。這種代價通常會讓開發者喪失對TDD的興趣了。

    我發現其實在測試的時候我更加關注的是業務數據的build,而系統架構通常是服務于業務的。所以我就開始考慮,能否有個方法構建出最基本需要的業務模型數據呢。查閱了一些網上工具,發現沒有能夠滿足我當前需求(kodo做持久層,還有我們自己研發的知識引擎),于是就自己簡單做了一個InitialTestObject,想法很簡單就是通過一個xml文件然后根據已知的業務模型結構定義好數據,然后根據固定的規則初始化好業務數據,并且存放到一個map中去(方法比較簡單我就不列出源碼了),然后再使用時把初始化放到setUp中去,這樣在測試的時候就可以根據你的需要直接從map中獲取到一個實際的業務對象用于測試的時候使用了,最后記得要在測試完成后要在tearDown中清除初始化的數據。這樣處理后我發現在測試時就感覺到很方便了,用到什么直接從map中取就可以了。

    也許有人會說這樣做不還是是集成測試了嗎,你build的時候需要數據庫、持久層啊什么的,這里我不想來爭論究竟是屬于單元測試還是集成測試,因為它屬于什么對于我們的功能來說是沒有意義。無論什么測試的最終目標就是讓我們的功能可用。

    至于構建環境的實現我只是給出了一個對于我當前項目代價最小的方法,其實如果你的項目不是使用靜態方法的話,可以考慮構建一個完全mock的環境這樣就可以稱之為單元測試了。
    而且對于這個InitialTestObject我覺得可以做成一個開源的小工具,支持各種不同的持久層(jdo,hibernate),然后根據我們定義的持久層模型做為我們的業務規則,就不需要自己編寫具體的初始化規則代碼了,你只需要寫xml數據并指定好對應的持久層模型,希望大家可以對這個想法對提提建議,也許已經有人做了,那我就不做重復功了。

    下篇預告:think in refactor         時間:待定


    鏈客中國,寫文章也可以賺錢哦
    posted on 2007-09-13 00:35 rocket 閱讀(1010) 評論(1)  編輯  收藏

    評論:
    # re: TDD:mock還是build [未登錄] 2007-09-13 19:29 | jack
    呵呵,這個想法不錯.
    其實有時候我們是需要真實數據測試的.
    所以先要提供一套接口就象我們的 JDBC 接口一樣.
    XML 只是要創建對象的一個描述(當然支持 IOC)
    然后默認先實現 JDO,hibernate 的實現.
    如果有其他需求的可以擴展接口!
    rocket 為社區做點貢獻吧!  回復  更多評論
      

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


    網站導航:
     
    主站蜘蛛池模板: 亚洲深深色噜噜狠狠网站| 中国极品美軳免费观看| 免费夜色污私人影院在线观看| 丝袜足液精子免费视频| 亚洲人成激情在线播放| 亚洲综合精品网站在线观看| 2015日韩永久免费视频播放 | 国产美女亚洲精品久久久综合| 鲁大师在线影院免费观看| 亚洲欧美日韩一区二区三区在线| 亚洲国产精品人人做人人爱| 亚洲免费在线观看视频| 免费无遮挡无遮羞在线看| 67pao强力打造67194在线午夜亚洲| 免费看无码自慰一区二区| 在线人成免费视频69国产| 亚洲AV成人精品一区二区三区| 亚洲男人第一av网站| 日本特黄a级高清免费大片| 少妇性饥渴无码A区免费| 亚洲国产精品ⅴa在线观看| 666精品国产精品亚洲| 亚洲精品无码你懂的网站| 两个人的视频高清在线观看免费| A级毛片高清免费视频在线播放| 日韩国产精品亚洲а∨天堂免| 亚洲视频在线观看网站| 在线亚洲精品自拍| 国产jizzjizz视频全部免费| 7723日本高清完整版免费| 久久免费99精品国产自在现线 | 精品免费视在线观看| 久久精品亚洲日本波多野结衣| 久久亚洲AV无码精品色午夜麻豆| 亚洲人成网站观看在线播放| 韩国欧洲一级毛片免费| 91在线视频免费看| 97久久免费视频| 久久国产精品免费视频| 巨胸狂喷奶水视频www网站免费| 337P日本欧洲亚洲大胆精品|