如何開展單元測(cè)試
1、是什么
單元測(cè)試(Unit Testing)又稱為模塊測(cè)試,是針對(duì)程序模塊來進(jìn)行正確性檢驗(yàn)的測(cè)試工作。
- 程序模塊是軟件設(shè)計(jì)的最小單位,程序單元是應(yīng)用的最小可測(cè)試部件
? 在面向過程編程中,一個(gè)單元就是單個(gè)程序、函數(shù)、過程等
? 在面向?qū)ο缶幊讨校钚卧褪欠椒ǎɑ悾ǔ悾⒊橄箢悺⒒蛘吲缮悾ㄗ宇悾┲械姆椒?/span>
2、測(cè)什么
1、并不是所有的項(xiàng)目都需要單元測(cè)試,一次性的項(xiàng)目不需要單元測(cè)試,持續(xù)迭代的產(chǎn)品需要單元測(cè)試,
通常只有底層模塊或者核心模塊的測(cè)試中才會(huì)采用單元測(cè)試
2、并不是所有的"單元"都需要單元測(cè)試,服務(wù)代碼、管理者代碼、存儲(chǔ)代碼都應(yīng)該是簡(jiǎn)單的順序執(zhí)行、沒有邏輯的代碼,
不需要單元測(cè)試。同理,單元測(cè)試的代碼不需要單元測(cè)試——單元測(cè)試的代碼應(yīng)該只包含簡(jiǎn)單的順序執(zhí)行、沒有邏輯的代碼
2.1 單元測(cè)試規(guī)則
1、必須進(jìn)行測(cè)試的是通用、公共的Utils函數(shù) 2、復(fù)雜交互操作需要進(jìn)行一定的測(cè)試 3、網(wǎng)絡(luò)請(qǐng)求可以交給系統(tǒng)測(cè)試,或者不進(jìn)行測(cè)試
2.2 可測(cè)試的代碼
對(duì)于一個(gè)邏輯單元(方法),依賴于兩個(gè)方面:一個(gè)是輸入的參數(shù),另一個(gè)是對(duì)外部的方法調(diào)用
只要確保輸入?yún)?shù)不包含外部環(huán)境的上下文,同時(shí)內(nèi)部代碼對(duì)外部的調(diào)用也不包含環(huán)境上下文的訪問,這個(gè)方法就是可單元測(cè)試的
2.3 判斷可測(cè)試的代碼
1、方法的運(yùn)行是否需要mock
2、方法是否可以直接運(yùn)行
3、方法的參數(shù)是否可以自由模擬,不依賴外部環(huán)境
2.4 改造代碼
如果代碼里有邏輯,但是不可單元測(cè)試的話,就需要改造代碼
首先隔離邏輯代碼和外部環(huán)境代碼,再對(duì)邏輯代碼進(jìn)行單元測(cè)試
3、怎么測(cè)
3.1 單元測(cè)試的寫法
1、通過提供預(yù)期的輸入和預(yù)期的結(jié)果,與單元的實(shí)際運(yùn)行結(jié)果進(jìn)行對(duì)比,就可以知道單元的工作是否和預(yù)期的一致
2、各種輸入?yún)?shù)的邊界條件都需要測(cè)試到
3、單元測(cè)試的覆蓋率可以幫助識(shí)別單元測(cè)試是否存在沒有運(yùn)行到的代碼
3.2 命名方法
1、測(cè)試代碼和業(yè)務(wù)代碼的組織架構(gòu)要保持一致,一一對(duì)應(yīng)
2、單元測(cè)試的類名后加Test
3、單元測(cè)試的方法前加test
4、處于同一包名下,方便訪問protected類型的方法
3.3 單元測(cè)試執(zhí)行
1、構(gòu)建輸入?yún)?shù),并預(yù)測(cè)該輸入所產(chǎn)生的輸出
2、調(diào)用要測(cè)試的目標(biāo)方法,獲取輸出
3、Assert目標(biāo)方法的輸出是否和預(yù)期的輸出一致
3.3.1 輸入數(shù)據(jù)
1、被測(cè)試函數(shù)的輸入?yún)?shù)
2、被測(cè)試函數(shù)內(nèi)部需要讀取的全局靜態(tài)變量
3、被測(cè)試函數(shù)內(nèi)部需要讀取的成員變量
4、函數(shù)內(nèi)部調(diào)用子函數(shù)獲得的數(shù)據(jù)
5、函數(shù)內(nèi)部調(diào)用子函數(shù)改寫的數(shù)據(jù)
6、嵌入式系統(tǒng)中,在中斷調(diào)用時(shí)改寫的數(shù)據(jù)
3.3.2 預(yù)計(jì)輸出
1、被測(cè)試函數(shù)的返回值
2、被測(cè)試函數(shù)的輸出參數(shù)
3、被測(cè)試函數(shù)所改寫的成員變量
4、被測(cè)試函數(shù)所改寫的全局變量
5、被測(cè)試函數(shù)中進(jìn)行的文件更新
6、被測(cè)試函數(shù)中進(jìn)行的數(shù)據(jù)庫(kù)更新
7、被測(cè)試函數(shù)中進(jìn)行的消息隊(duì)列更新
3.4 原則
1、覆蓋分支和循環(huán)條件的所有路徑
2、每個(gè)理想的測(cè)試Case獨(dú)立于其它Case
4、誰來測(cè)
單元測(cè)試更偏技術(shù),它們通常關(guān)注代碼細(xì)節(jié),甚或是編程語言特有的概念,所以編寫單元測(cè)試主要應(yīng)該由研發(fā)負(fù)責(zé)
測(cè)試人員更了解如何制定測(cè)試計(jì)劃,根據(jù)特定分析,如等價(jià)類劃分和邊界值分析,定義有價(jià)值的值。
因此,程序員需要從測(cè)試人員那里“竊取”這類知識(shí),
或者,他們可以和測(cè)試人員結(jié)對(duì),一起討論需要編寫的測(cè)試,但是,之后應(yīng)該由程序員實(shí)現(xiàn)它們
條件允許,結(jié)對(duì)是最好的選擇
5、何時(shí)測(cè)
開發(fā)過程中,單元測(cè)試應(yīng)該來測(cè)試那些可能會(huì)出錯(cuò)的地方,或是那些邊界情況
維護(hù)過程中,單元測(cè)試應(yīng)該跟著QA的bug report來走,每一個(gè)bug都應(yīng)該有個(gè)單元測(cè)試。
于是研發(fā)就會(huì)對(duì)自己的代碼變更有兩個(gè)自信,一是bug被fixed,二是相同的bug不會(huì)再次出現(xiàn)
6、怎么測(cè)
團(tuán)隊(duì)制度,單元測(cè)試是團(tuán)隊(duì)成熟度的基本標(biāo)志
把單元測(cè)試執(zhí)行、代碼覆蓋率統(tǒng)計(jì)和持續(xù)集成流水線做集成,以確保每次代碼遞交,都會(huì)自動(dòng)觸發(fā)單元測(cè)試,
并在單元測(cè)試執(zhí)行過程中自動(dòng)統(tǒng)計(jì)代碼覆蓋率,最后以“單元測(cè)試通過率”和“代碼覆蓋率”為標(biāo)準(zhǔn)來決定本次代碼遞交是否能夠被接受。
7、局限
1、單元測(cè)試只測(cè)試程序單元自身的功能
2、單元測(cè)試只能表明測(cè)到的問題,不能表明不存在未測(cè)試到的錯(cuò)誤
3、單元測(cè)試不能發(fā)現(xiàn)集成錯(cuò)誤、性能問題、或者其他系統(tǒng)級(jí)別的問題,結(jié)合其他軟件測(cè)試活動(dòng)更為有效
研發(fā)可以向QA學(xué)習(xí)一些設(shè)計(jì)測(cè)試用例的方法。
不能忽視的是,單元測(cè)試還要考慮成本和收益。

浙公網(wǎng)安備 33010602011771號(hào)