單元測試的重要性

單元測試努释,或者更大一些的自動化測試拷泽,對提高軟件質(zhì)量是有很大幫助的疫鹊。通過一系列預先設計的規(guī)則,就可以覆蓋大量的測試點司致。尤其是對重構(gòu)一類的任務拆吆,確保修改前后系統(tǒng)行為不變很重要,而修改后的回歸測試工作量又極其繁重脂矫,此時單元測試枣耀,或者自動化測試就能體現(xiàn)出無以倫比的效率。

我在2005年學Python不久庭再,就郁悶于自己那點代碼手工測試很麻煩捞奕,恰好那時得知了很多Python工程師有做單元測試的習慣,于是就學習了一下拄轻,果然效果卓群颅围。后來又經(jīng)過數(shù)年整理出自己的一套單元測試的規(guī)范。

我做過的各類Python項目恨搓,代碼總量的50%左右是單元測試院促。經(jīng)過這個級別的單元測試覆蓋,確保了底層函數(shù)基本不會出錯斧抱,這樣高層功能的調(diào)試才更方便常拓。同時也是這個覆蓋程度確保了,被測試工程師發(fā)現(xiàn)bug的可能性已經(jīng)很低了辉浦。

我給自己的單元測試設置了5個級別:

1. Level1:正常流程可用弄抬,即一個函數(shù)在輸入正確的參數(shù)時,會有正確的輸出

2. Level2:異常流程可拋出邏輯異常宪郊,即輸入?yún)?shù)有誤時眉睹,不能拋出系統(tǒng)異常,而是用自己定義的邏輯異常通知上層調(diào)用代碼其錯誤之處

3. Level3:極端情況和邊界數(shù)據(jù)可用废膘,對輸入?yún)?shù)的邊界情況也要單獨測試,確保輸出是正確有效的

4. Level4:所有分支慕蔚、循環(huán)的邏輯走通丐黄,不能有任何流程是測試不到的

5. Level5:輸出數(shù)據(jù)的所有字段驗證,對有復雜數(shù)據(jù)結(jié)構(gòu)的輸出孔飒,確保每個字段都是正確的

如上的單元測試分級是我2007年整理出來的灌闺,后來在我做的各種項目中艰争,一般只做到Level2,重要系統(tǒng)或者底層服務桂对,要做到Level3或Level4甩卓。而很少做到Level5。即便如此蕉斜,就已經(jīng)實現(xiàn)了如上所說的逾柿,很難被測試工程師發(fā)現(xiàn)bug。

除了級別外宅此,測試方法也要區(qū)分不同系統(tǒng)的玩法机错。比如基于WEB的系統(tǒng),就需要確保單元測試里可以模擬發(fā)送請求父腕,這個一般是WEB框架提供支持的弱匪。比如我常用的web.py、Flask璧亮、Django都有支持萧诫。不僅僅可以模擬簡單的請求,還可以模擬POST枝嘶、cookie等帘饶。另外一般建議單獨寫個函數(shù)來模擬登錄過程,這樣系統(tǒng)登錄后行為的測試就不必反復模擬登錄了躬络。

單元測試一大痛苦是構(gòu)造測試數(shù)據(jù)尖奔。我的看法是測試數(shù)據(jù)應該是人造的,而不是隨便從產(chǎn)品環(huán)境dump出來一份穷当。只有人造的數(shù)據(jù)能確保環(huán)境可控提茁,每次運行不會因為環(huán)境改變而頻繁修改testcase。我的常用玩法是測試數(shù)據(jù)分為基礎數(shù)據(jù)和附加數(shù)據(jù)兩部分馁菜≤畋猓基礎數(shù)據(jù)是所有testcase共享的,比如建立幾個常用角色的用戶等等汪疮。附加數(shù)據(jù)是testcase內(nèi)部自己建立的幢泼。這樣每次testcase運行時,先清空數(shù)據(jù)庫歼指,導入基礎數(shù)據(jù)糠悯,導入附加數(shù)據(jù),然后執(zhí)行測試盏道,驗證結(jié)果稍浆。

各類程序的函數(shù)可以分為純函數(shù)和副作用函數(shù)。純函數(shù)對應的是數(shù)學里函數(shù)的概念,輸出和輸入是一一對應的衅枫。對一個輸入有確定的輸出嫁艇。比如1+1=2。而副作用函數(shù)則相反弦撩,同樣的輸入步咪,在不同時間和環(huán)境里,可能有不同的輸出益楼。比如任何涉及IO猾漫、網(wǎng)絡、數(shù)據(jù)庫的偏形。副作用函數(shù)的測試比純函數(shù)麻煩的多静袖,因為你必須要完整的構(gòu)造其所依賴的所有環(huán)境,才能夠復現(xiàn)一個副作用函數(shù)的行為俊扭。也正因為如此队橙,副作用函數(shù)出bug的概率比純函數(shù)高的多。理解這個概念以后萨惑,應該盡可能的把程序里的純函數(shù)和副作用函數(shù)進行拆解捐康,降低副作用函數(shù)的比例和邏輯復雜度。還有庸蔼,副作用函數(shù)是會傳染的解总,一個函數(shù)如果調(diào)用了副作用函數(shù),那么它也會變成副作用函數(shù)姐仅。

>>戳戳花枫,免費下載零編碼自動化測試工具TestWriter~

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市掏膏,隨后出現(xiàn)的幾起案子劳翰,更是在濱河造成了極大的恐慌,老刑警劉巖馒疹,帶你破解...
    沈念sama閱讀 211,743評論 6 492
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件佳簸,死亡現(xiàn)場離奇詭異,居然都是意外死亡颖变,警方通過查閱死者的電腦和手機生均,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,296評論 3 385
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來腥刹,“玉大人马胧,你說我怎么就攤上這事∠畏澹” “怎么了漓雅?”我有些...
    開封第一講書人閱讀 157,285評論 0 348
  • 文/不壞的土叔 我叫張陵录别,是天一觀的道長。 經(jīng)常有香客問我邻吞,道長,這世上最難降的妖魔是什么葫男? 我笑而不...
    開封第一講書人閱讀 56,485評論 1 283
  • 正文 為了忘掉前任抱冷,我火速辦了婚禮,結(jié)果婚禮上梢褐,老公的妹妹穿的比我還像新娘旺遮。我一直安慰自己,他們只是感情好盈咳,可當我...
    茶點故事閱讀 65,581評論 6 386
  • 文/花漫 我一把揭開白布耿眉。 她就那樣靜靜地躺著,像睡著了一般鱼响。 火紅的嫁衣襯著肌膚如雪鸣剪。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 49,821評論 1 290
  • 那天丈积,我揣著相機與錄音筐骇,去河邊找鬼。 笑死江滨,一個胖子當著我的面吹牛铛纬,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播唬滑,決...
    沈念sama閱讀 38,960評論 3 408
  • 文/蒼蘭香墨 我猛地睜開眼告唆,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了晶密?” 一聲冷哼從身側(cè)響起擒悬,我...
    開封第一講書人閱讀 37,719評論 0 266
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎惹挟,沒想到半個月后茄螃,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 44,186評論 1 303
  • 正文 獨居荒郊野嶺守林人離奇死亡连锯,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 36,516評論 2 327
  • 正文 我和宋清朗相戀三年归苍,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片运怖。...
    茶點故事閱讀 38,650評論 1 340
  • 序言:一個原本活蹦亂跳的男人離奇死亡拼弃,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出摇展,到底是詐尸還是另有隱情吻氧,我是刑警寧澤,帶...
    沈念sama閱讀 34,329評論 4 330
  • 正文 年R本政府宣布,位于F島的核電站盯孙,受9級特大地震影響鲁森,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜振惰,卻給世界環(huán)境...
    茶點故事閱讀 39,936評論 3 313
  • 文/蒙蒙 一歌溉、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧骑晶,春花似錦痛垛、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,757評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至仔雷,卻和暖如春蹂析,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背朽寞。 一陣腳步聲響...
    開封第一講書人閱讀 31,991評論 1 266
  • 我被黑心中介騙來泰國打工识窿, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人脑融。 一個月前我還...
    沈念sama閱讀 46,370評論 2 360
  • 正文 我出身青樓喻频,卻偏偏與公主長得像,于是被迫代替她去往敵國和親肘迎。 傳聞我的和親對象是個殘疾皇子甥温,可洞房花燭夜當晚...
    茶點故事閱讀 43,527評論 2 349

推薦閱讀更多精彩內(nèi)容

  • 文章來自:http://blog.csdn.net/mj813/article/details/52451355 ...
    好大一只鵬閱讀 9,189評論 2 126
  • Spring Cloud為開發(fā)人員提供了快速構(gòu)建分布式系統(tǒng)中一些常見模式的工具(例如配置管理,服務發(fā)現(xiàn)妓布,斷路器姻蚓,智...
    卡卡羅2017閱讀 134,633評論 18 139
  • 1.測試與軟件模型 軟件開發(fā)生命周期模型指的是軟件開發(fā)全過程、活動和任務的結(jié)構(gòu)性框架匣沼。軟件項目的開發(fā)包括:需求狰挡、設...
    Mr希靈閱讀 21,949評論 7 278
  • 1.測試與軟件模型 軟件開發(fā)生命周期模型指的是軟件開發(fā)全過程、活動和任務的結(jié)構(gòu)性框架释涛。軟件項目的開發(fā)包括:需求加叁、設...
    宇文臭臭閱讀 6,718評論 5 100
  • 1.問:你在測試中發(fā)現(xiàn)了一個 bug ,但是開發(fā)經(jīng)理認為這不是一個 bug 唇撬,你應該怎樣解決它匕。 首先,將問題提...
    qianyewhy閱讀 9,236評論 4 123