qileilove

          blog已經(jīng)轉(zhuǎn)移至github,大家請訪問 http://qaseven.github.io/

          不要為數(shù)據(jù)持久層編寫單元測試

          為增強(qiáng)自信心而寫代碼
            關(guān)于單元測試,其作用我認(rèn)為更多的是增強(qiáng)開發(fā)者的信心,以及作為代碼的執(zhí)行文檔(額外的效果)。也就是說,編寫單元測試首先是開發(fā)者的責(zé)任,其次單元測試的粒度由程序員的自信心決定。
            "老板為我的代碼付報酬,而不是測試,所以,我對此的價值觀是——測試越少越好,少到你對你的代碼質(zhì)量達(dá)到了某種自信(我覺得這種的自信標(biāo)準(zhǔn)應(yīng)該要高于業(yè)內(nèi)的標(biāo)準(zhǔn),當(dāng)然,這種自信也可能是種自大)。如果我的編碼生涯中不會犯這種典型的錯誤(如:在構(gòu)造函數(shù)中設(shè)了個錯誤的值),那我就不會測試它。我傾向于去對那些有意義的錯誤做測試,所以,我對一些比較復(fù)雜的條件邏輯會異常地小心。當(dāng)在一個團(tuán)隊中,我會非常小心的測試那些會讓團(tuán)隊容易出錯的代碼。"
            --XP和TDD的創(chuàng)造者Kent Beck如是說。
            由過去的經(jīng)驗(yàn),我認(rèn)同上述的觀點(diǎn),并且認(rèn)為不應(yīng)該將單元測試作為銀彈。甚至項目經(jīng)理應(yīng)該忘記有單元測試這回事,干脆把那當(dāng)做程序員的樂趣就好了,然后該有的測試流程和規(guī)范必須要求到。
            不要違反原則
            單元測試需遵守的關(guān)鍵原則是:
            1、單元測試應(yīng)該是可重復(fù)的
            2、單元測試應(yīng)該是獨(dú)立的
            3、單元測試是快速執(zhí)行的
            以下為一個壞的例子。
            部門的技術(shù)主管一直希望找到一種方法可以普遍提高開發(fā)人員的代碼水平,以及減少bug和改善設(shè)計,這恰恰是單元測試所擅長的。所以我們配合持續(xù)集成的實(shí)踐,在后來的項目中嚴(yán)格要求單元測試。
            不得不說,在經(jīng)過一段時間的抵觸后,大家還是非常喜歡的。因?yàn)槲覀兊漠a(chǎn)品清單上有專門的單元測試時間,并且大家也開始嘗到甜頭--容易犯的小錯少了。
            但是在我們還來不及歡呼的時候,問題出現(xiàn)了,而且很棘手。
            我們的項目大都是關(guān)于數(shù)據(jù)存儲的,比如簡單的新增、復(fù)雜的查詢、顯示報表等等。而我們的單元測試其實(shí)就是冒煙測試,并且還是不合格的單元測試。原因是我們使用數(shù)據(jù)庫的數(shù)據(jù)作為輸入,眾所周知,這些數(shù)據(jù)很容易被修改,故我們的單元測試是不可能具有可重復(fù)性。另外,我們的單元測試也不是獨(dú)立的,因?yàn)槲覀兎浅R蕾嚁?shù)據(jù)存儲層。
            從以上的描述,你可能猜到,沒錯,我們的開發(fā)人員大多都很初級,經(jīng)常犯得錯誤就是關(guān)于sql的編寫,ibatis的使用語法之類的錯誤。也就是說他們最不自信的地方就是語法或者工具的使用。
            讓單元測試變成可重復(fù)的相對簡單,使用dbunit之類的工具可以輕松的達(dá)到,即使這個工具有時也會出錯,比如oracle的Large Objec類型就會報錯。但是對數(shù)據(jù)存儲層的依賴就不能避免了,因?yàn)檫@恰恰是我們要測試的。而相比時間而言,前兩個因素又顯得不那么重要了。
            在項目中,我們對每個dao層的方法都寫了單元測試,有的單元測試花費(fèi)的時間甚至比寫代碼的時間要多。結(jié)果是我們的代碼確實(shí)是可用的,但是時間卻比想象的多得多。比如由A來編寫接口,然后由另外一個人B來編寫頁面,然后由B調(diào)用A的接口?;ㄙM(fèi)的時間=編寫接口+編寫頁面+2*調(diào)用接口時間(這個名稱不怎么好,但是在海沒有發(fā)現(xiàn)合適的名稱時,還是讓我們暫時使用它吧)。調(diào)用接口時間是指兩個人座到一起,A告訴B如何調(diào)用他的接口的時間,加上剛好出了問題,A為了方便直接在B的電腦上修改花費(fèi)的時間。這里的時間都是兩份的。
            而我們的項目執(zhí)行一次單元測試至少要10分鐘左右,而且還會報錯,因?yàn)椴豢芍貜?fù)性,有時它可以執(zhí)行成功,有時它并不能。現(xiàn)在我們要花費(fèi)的時間變成編寫接口+編寫頁面+2*調(diào)用接口的時間+n*10分鐘。
            之前說了,我們要求單元測試時為了保證接口是可用的,單元測試并不是唯一的方式。假設(shè)我們啟動項目(5分鐘),點(diǎn)擊頁面進(jìn)入頁面(每次0.5分鐘),然后出錯查看信息,解決問題(M分鐘)。相比之下,使用單元測試則是啟動10分鐘,出錯,設(shè)置打印信息,然后啟動(10分鐘),再設(shè)置打印信息。直至發(fā)飆。。。
            現(xiàn)在,你應(yīng)該知道我們的痛苦了。

          posted on 2014-08-05 09:29 順其自然EVO 閱讀(226) 評論(0)  編輯  收藏 所屬分類: 測試學(xué)習(xí)專欄

          <2014年8月>
          272829303112
          3456789
          10111213141516
          17181920212223
          24252627282930
          31123456

          導(dǎo)航

          統(tǒng)計

          常用鏈接

          留言簿(55)

          隨筆分類

          隨筆檔案

          文章分類

          文章檔案

          搜索

          最新評論

          閱讀排行榜

          評論排行榜

          主站蜘蛛池模板: 锡林浩特市| 天门市| 德化县| 龙岩市| 宝鸡市| 凤台县| 礼泉县| 深州市| 台山市| 灵石县| 和龙市| 姜堰市| 新余市| 旌德县| 达拉特旗| 青田县| 依兰县| 镇宁| 琼中| 资兴市| 蚌埠市| 嫩江县| 江都市| 荃湾区| 儋州市| 景德镇市| 栾城县| 南宁市| 穆棱市| 湘乡市| 且末县| 拜泉县| 台江县| 博客| 高淳县| 临朐县| 章丘市| 乐昌市| 西昌市| 宣威市| 衡阳市|