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

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

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

    隨筆-55  評(píng)論-208  文章-0  trackbacks-0

    記得我以前寫(xiě)過(guò)一個(gè)文章是有關(guān)于4層web結(jié)構(gòu)單元測(cè)試的,今天打算對(duì)TDD的環(huán)境問(wèn)題重新討論一下。

    我當(dāng)時(shí)的4層結(jié)構(gòu)的單元測(cè)試時(shí)間上是從DAO到Service到Action再到JSP一種漸進(jìn)測(cè)試,但是的想法是,先測(cè)DAO,那么Service對(duì)DAO的調(diào)用就有保證了,測(cè)試了Service,那么action調(diào)用service就有保證了。。。這樣一層一層下來(lái),我每層測(cè)試的目標(biāo)也就達(dá)到了。這里其實(shí)我用了一個(gè)技巧,就是通過(guò)測(cè)試的順序,來(lái)逐漸的構(gòu)建了每層測(cè)試所需的外部環(huán)境。當(dāng)然從這個(gè)角度來(lái)看,我當(dāng)時(shí)使用的方法更貼近于集成測(cè)試了。

    一般做TDD的時(shí)候最大的問(wèn)題就是如何處理外部環(huán)境,這一般包括本身業(yè)務(wù)邏輯環(huán)境和技術(shù)框架環(huán)境。

    在當(dāng)前這個(gè)新項(xiàng)目中,我首先嘗試對(duì)一個(gè)具體渲染器的測(cè)試方式就是用mock,這里用的是比較好用的easyMock。開(kāi)始的時(shí)候覺(jué)得mock的方法很好用,但是當(dāng)我發(fā)現(xiàn)我的待測(cè)方法中有多個(gè)需要mock的對(duì)象時(shí)(a.getX();b.getY();c.getZ())或者一個(gè)mock對(duì)象要通過(guò)多次級(jí)聯(lián)獲取時(shí)(如 a.getB().getC().getD().getE())就會(huì)發(fā)現(xiàn)mock的代價(jià)讓你高到很不原意mock的地步。

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

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

    也許有人會(huì)說(shuō)這樣做不還是是集成測(cè)試了嗎,你build的時(shí)候需要數(shù)據(jù)庫(kù)、持久層啊什么的,這里我不想來(lái)爭(zhēng)論究竟是屬于單元測(cè)試還是集成測(cè)試,因?yàn)樗鼘儆谑裁磳?duì)于我們的功能來(lái)說(shuō)是沒(méi)有意義。無(wú)論什么測(cè)試的最終目標(biāo)就是讓我們的功能可用。

    至于構(gòu)建環(huán)境的實(shí)現(xiàn)我只是給出了一個(gè)對(duì)于我當(dāng)前項(xiàng)目代價(jià)最小的方法,其實(shí)如果你的項(xiàng)目不是使用靜態(tài)方法的話(huà),可以考慮構(gòu)建一個(gè)完全mock的環(huán)境這樣就可以稱(chēng)之為單元測(cè)試了。
    而且對(duì)于這個(gè)InitialTestObject我覺(jué)得可以做成一個(gè)開(kāi)源的小工具,支持各種不同的持久層(jdo,hibernate),然后根據(jù)我們定義的持久層模型做為我們的業(yè)務(wù)規(guī)則,就不需要自己編寫(xiě)具體的初始化規(guī)則代碼了,你只需要寫(xiě)xml數(shù)據(jù)并指定好對(duì)應(yīng)的持久層模型,希望大家可以對(duì)這個(gè)想法對(duì)提提建議,也許已經(jīng)有人做了,那我就不做重復(fù)功了。

    下篇預(yù)告:think in refactor         時(shí)間:待定


    鏈客中國(guó),寫(xiě)文章也可以賺錢(qián)哦
    posted on 2007-09-13 00:35 rocket 閱讀(1010) 評(píng)論(1)  編輯  收藏

    評(píng)論:
    # re: TDD:mock還是build [未登錄](méi) 2007-09-13 19:29 | jack
    呵呵,這個(gè)想法不錯(cuò).
    其實(shí)有時(shí)候我們是需要真實(shí)數(shù)據(jù)測(cè)試的.
    所以先要提供一套接口就象我們的 JDBC 接口一樣.
    XML 只是要?jiǎng)?chuàng)建對(duì)象的一個(gè)描述(當(dāng)然支持 IOC)
    然后默認(rèn)先實(shí)現(xiàn) JDO,hibernate 的實(shí)現(xiàn).
    如果有其他需求的可以擴(kuò)展接口!
    rocket 為社區(qū)做點(diǎn)貢獻(xiàn)吧!  回復(fù)  更多評(píng)論
      

    只有注冊(cè)用戶(hù)登錄后才能發(fā)表評(píng)論。


    網(wǎng)站導(dǎo)航:
     
    主站蜘蛛池模板: 日本黄色动图免费在线观看| 一个人免费播放在线视频看片| 99热这里只有精品免费播放 | 免费黄色福利视频| 猫咪免费人成在线网站| 成年女人毛片免费观看97| 亚洲午夜国产精品| 一级看片免费视频囗交| 亚洲成a人片在线观看久| 国产亚洲人成A在线V网站| 亚洲综合一区二区精品导航| 国产无遮挡无码视频免费软件| 暖暖免费高清日本中文| 亚洲AV香蕉一区区二区三区| 麻豆国产精品入口免费观看| 国产成人+综合亚洲+天堂| 全免费毛片在线播放| 亚洲男人的天堂在线va拉文| 2019亚洲午夜无码天堂| 性xxxx视频免费播放直播| 亚洲av无码国产精品色在线看不卡| 粉色视频成年免费人15次| 亚洲综合区小说区激情区| 亚洲成AV人片在WWW| 成人免费午夜无码视频| 亚洲AV无码精品无码麻豆| 九九精品国产亚洲AV日韩| 亚洲不卡无码av中文字幕| 成人片黄网站色大片免费观看APP| 亚洲成a人片在线观看久| 免费一级毛片在线播放视频| 亚洲人成777在线播放| 国产又长又粗又爽免费视频| 亚洲 日韩 色 图网站| 亚洲电影日韩精品| 日韩精品内射视频免费观看| 亚洲色偷偷色噜噜狠狠99| 亚洲综合色婷婷七月丁香| 永久免费无码日韩视频| 亚洲AⅤ优女AV综合久久久| 亚洲一级特黄特黄的大片|