第二,單元測(cè)試用例詳解
在實(shí)際工作中,想做好單元測(cè)試,就必須對(duì)單元測(cè)試的用例設(shè)計(jì)有深入的理解。
通常來(lái)講,單元測(cè)試的用例是一個(gè)“輸入數(shù)據(jù)”和“預(yù)計(jì)輸出”的集合。 你需要針對(duì)確定的輸入,根據(jù)邏輯功能推算出預(yù)期正確的輸出,并且以執(zhí)行被測(cè)試代碼的方式進(jìn)行驗(yàn)證,用一句話概括就是“在明確了代碼需要實(shí)現(xiàn)的邏輯功能的基礎(chǔ)上,什么輸入,應(yīng)該產(chǎn)生什么輸出”。
但是,對(duì)于單元測(cè)試來(lái)講,測(cè)試用例的“輸入數(shù)據(jù)”和“預(yù)計(jì)輸出”可能遠(yuǎn)比你想得要復(fù)雜得多。
首先,來(lái)解釋一下單元測(cè)試用例“輸入數(shù)據(jù)”都有哪些種類,如果你想當(dāng)然的認(rèn)為只有被測(cè)試函數(shù)的輸入?yún)?shù)是“輸入數(shù)據(jù)”的話,那就大錯(cuò)特錯(cuò)了。 這里總結(jié)了幾種“輸入數(shù)據(jù)”,希望可以幫助理解什么才是完整的單元測(cè)試“輸入數(shù)據(jù)”:
被測(cè)試函數(shù)的輸入?yún)?shù);
被測(cè)試函數(shù)內(nèi)部需要讀取的全局靜態(tài)變量;
被測(cè)試函數(shù)內(nèi)部需要讀取的成員變量;
函數(shù)內(nèi)部調(diào)用子函數(shù)獲得的數(shù)據(jù);
函數(shù)內(nèi)部調(diào)用子函數(shù)改寫(xiě)的數(shù)據(jù);
嵌入式系統(tǒng)中,在中斷調(diào)用時(shí)改寫(xiě)的數(shù)據(jù);
然后,讓我們?cè)賮?lái)看看“預(yù)計(jì)輸出”,如果沒(méi)有明確的預(yù)計(jì)輸出,那么測(cè)試本身就失去了意義。同樣地,“預(yù)計(jì)輸出” 絕對(duì)不是只有函數(shù)返回值這么簡(jiǎn)單,還應(yīng)該包括函數(shù)執(zhí)行完成后所改寫(xiě)的所有數(shù)據(jù)。 具體來(lái)看有以下幾大類:
被測(cè)試函數(shù)的返回值;
被測(cè)試函數(shù)的輸出參數(shù);
被測(cè)試函數(shù)所改寫(xiě)的成員變量;
被測(cè)試函數(shù)所改寫(xiě)的全局變量;
被測(cè)試函數(shù)中進(jìn)行的文件更新;
被測(cè)試函數(shù)中進(jìn)行的數(shù)據(jù)庫(kù)更新;
被測(cè)試函數(shù)中進(jìn)行的消息隊(duì)列更新;
另外,對(duì)于預(yù)計(jì)輸出值,你必須嚴(yán)格根據(jù)代碼的功能邏輯來(lái)設(shè)定,而不能通過(guò)閱讀代碼來(lái)推算預(yù)期輸出,否則就是“掩耳盜鈴”了。
你不要覺(jué)得好笑,這種情況經(jīng)常出現(xiàn)。主要原因是,開(kāi)發(fā)工程師自己測(cè)試自己寫(xiě)的代碼時(shí)會(huì)有嚴(yán)重的思維慣性,以至于會(huì)根據(jù)自己的代碼實(shí)現(xiàn)來(lái)推算預(yù)計(jì)輸出。
最后,我還要再提一個(gè)點(diǎn),如果某些等價(jià)類或者邊界值,開(kāi)發(fā)工程師在開(kāi)發(fā)的時(shí)候都沒(méi)有考慮到,測(cè)試的時(shí)候就更不會(huì)去設(shè)計(jì)對(duì)應(yīng)的測(cè)試用例了,這樣也就會(huì)造成測(cè)試盲區(qū)。
軟件測(cè)試52講---筆記整理