單元測(cè)試的對(duì)象是軟件設(shè)計(jì)的最小單位——模塊。單元測(cè)試的依據(jù)是詳細(xì)設(shè)描述,單元測(cè)試應(yīng)對(duì)模塊內(nèi)所有重要的控制路徑設(shè)計(jì)測(cè)試用例,以便發(fā)現(xiàn)模塊內(nèi)部的錯(cuò)誤。單元測(cè)試多采用白盒測(cè)試技術(shù),系統(tǒng)內(nèi)多個(gè)模塊可以并行地進(jìn)行測(cè)試。 單元測(cè)試任務(wù) 單元測(cè)試任務(wù)包括:1 模塊接口測(cè)試;2 模塊局部數(shù)據(jù)結(jié)構(gòu)測(cè)試;3 模塊邊界條件測(cè)試;4 模塊中所有獨(dú)立執(zhí)行通路測(cè)試;5 模塊的各條錯(cuò)誤處理通路測(cè)試。 模塊接口測(cè)試是單元測(cè)試的基礎(chǔ)。只有在數(shù)據(jù)能正確流入、流出模塊的前提下,其他測(cè)試才有意義。測(cè)試接口正確與否應(yīng)該考慮下列因素: 1、輸入的實(shí)際參數(shù)與形式參數(shù)的個(gè)數(shù)是否相同; 2、輸入的實(shí)際參數(shù)與形式參數(shù)的屬性是否匹配; 3、輸入的實(shí)際參數(shù)與形式參數(shù)的量綱是否一致; 4、調(diào)用其他模塊時(shí)所給實(shí)際參數(shù)的個(gè)數(shù)是否與被調(diào)模塊的形參個(gè)數(shù)相同; 5、調(diào)用其他模塊時(shí)所給實(shí)際參數(shù)的屬性是否與被調(diào)模塊的形參屬性匹配; 6、調(diào)用其他模塊時(shí)所給實(shí)際參數(shù)的量綱是否與被調(diào)模塊的形參量綱一致; 7、調(diào)用預(yù)定義函數(shù)時(shí)所用參數(shù)的個(gè)數(shù)、屬性和次序是否正確; 8、是否存在與當(dāng)前入口點(diǎn)無關(guān)的參數(shù)引用; 9、是否修改了只讀型參數(shù); 10、對(duì)全程變量的定義各模塊是否一致; 11、是否把某些約束作為參數(shù)傳遞。 如果模塊內(nèi)包括外部輸入輸出,還應(yīng)該考慮下列因素: 1、文件屬性是否正確; 2、OPEN/CLOSE語句是否正確; 3、格式說明與輸入輸出語句是否匹配; 4、緩沖區(qū)大小與記錄長(zhǎng)度是否匹配; 5、文件使用前是否已經(jīng)打開; 6、是否處理了文件尾; 7、是否處理了輸入/輸出錯(cuò)誤; 8、輸出信息中是否有文字性錯(cuò)誤; 檢查局部數(shù)據(jù)結(jié)構(gòu)是為了保證臨時(shí)存儲(chǔ)在模塊內(nèi)的數(shù)據(jù)在程序執(zhí)行過程中完整、正確。局部數(shù)據(jù)結(jié)構(gòu)往往是錯(cuò)誤的根源,應(yīng)仔細(xì)設(shè)計(jì)測(cè)試用例,力求發(fā)現(xiàn)下面幾類錯(cuò)誤: 1、不合適或不相容的類型說明; 2、變量無初值; 3、變量初始化或省缺值有錯(cuò); 4、不正確的變量名(拼錯(cuò)或不正確地截?cái)啵? 5、出現(xiàn)上溢、下溢和地址異常。 除了局部數(shù)據(jù)結(jié)構(gòu)外,如果可能,單元測(cè)試時(shí)還應(yīng)該查清全局?jǐn)?shù)據(jù)(例如FORTRAN的公用區(qū))對(duì)模塊的影響。 在模塊中應(yīng)對(duì)每一條獨(dú)立執(zhí)行路徑進(jìn)行測(cè)試,單元測(cè)試的基本任務(wù)是保證模塊中每條語句至少執(zhí)行一次。此時(shí)設(shè)計(jì)測(cè)試用例是為了發(fā)現(xiàn)因錯(cuò)誤計(jì)算、不正確的比較和不適當(dāng)?shù)目刂屏髟斐傻腻e(cuò)誤。此時(shí)基本路徑測(cè)試和循環(huán)測(cè)試是最常用且最有效的測(cè)試技術(shù)。計(jì)算中常見的錯(cuò)誤包括: 1、誤解或用錯(cuò)了算符優(yōu)先級(jí); 2、混合類型運(yùn)算; 3、變量初值錯(cuò); 4、精度不夠; 5、表達(dá)式符號(hào)錯(cuò)。 比較判斷與控制流常常緊密相關(guān),測(cè)試用例還應(yīng)致力于發(fā)現(xiàn)下列錯(cuò)誤: 1、不同數(shù)據(jù)類型的對(duì)象之間進(jìn)行比較; 2、錯(cuò)誤地使用邏輯運(yùn)算符或優(yōu)先級(jí); 3、因計(jì)算機(jī)表示的局限性,期望理論上相等而實(shí)際上不相等的兩個(gè)量相等; 4、比較運(yùn)算或變量出錯(cuò); 5、循環(huán)終止條件或不可能出現(xiàn); 6、迭代發(fā)散時(shí)不能退出; 7、錯(cuò)誤地修改了循環(huán)變量。 一個(gè)好的設(shè)計(jì)應(yīng)能預(yù)見各種出錯(cuò)條件,并預(yù)設(shè)各種出錯(cuò)處理通路,出錯(cuò)處理通路同樣需要認(rèn)真測(cè)試,測(cè)試應(yīng)著重檢查下列問題: 1、輸出的出錯(cuò)信息難以理解; 2、記錄的錯(cuò)誤與實(shí)際遇到的錯(cuò)誤不相符; 3、在程序自定義的出錯(cuò)處理段運(yùn)行之前,系統(tǒng)已介入; 4、異常處理不當(dāng); 5、錯(cuò)誤陳述中未能提供足夠的定位出錯(cuò)信息。 邊界條件測(cè)試是單元測(cè)試中最后,也是最重要的一項(xiàng)任務(wù)。眾的周知,軟件經(jīng)常在邊界上失效,采用邊界值分析技術(shù),針對(duì)邊界值及其左、右設(shè)計(jì)測(cè)試用例,很有可能發(fā)現(xiàn)新的錯(cuò)誤。 單元測(cè)試過程 一般認(rèn)為單元測(cè)試應(yīng)緊接在編碼之后,當(dāng)源程序編制完成并通過復(fù)審和編譯檢查,便可開始單元測(cè)試。測(cè)試用例的設(shè)計(jì)應(yīng)與復(fù)審工作相結(jié)合,根據(jù)設(shè)計(jì)信息選取測(cè)試數(shù)據(jù),將增大發(fā)現(xiàn)上述各類錯(cuò)誤的可能性。在確定測(cè)試用例的同時(shí),應(yīng)給出期望結(jié)果。 應(yīng)為測(cè)試模塊開發(fā)一個(gè)驅(qū)動(dòng)模塊(driver)和(或)若干個(gè)樁模塊(stub),下圖顯示了一般單元測(cè)試的環(huán)境。驅(qū)動(dòng)模塊在大多數(shù)場(chǎng)合稱為“主程序”,它接收測(cè)試數(shù)據(jù)并將這些數(shù)據(jù)傳遞到被測(cè)試模塊,被測(cè)試模塊被調(diào)用后,“主程序”打印“進(jìn)入-退出”消息。 驅(qū)動(dòng)模塊和樁模塊是測(cè)試使用的軟件,而不是軟件產(chǎn)品的組成部分,但它需要一定的開發(fā)費(fèi)用。若驅(qū)動(dòng)和樁模塊比較簡(jiǎn)單,實(shí)際開銷相對(duì)低些。遺憾的是,僅用簡(jiǎn)單的驅(qū)動(dòng)模塊和樁模塊不能完成某些模塊的測(cè)試任務(wù),這些模塊的單元測(cè)試只能采用下面討論的綜合測(cè)試方法。 提高模塊的內(nèi)聚度可簡(jiǎn)化單元測(cè)試,如果每個(gè)模塊只能完成一個(gè),所需測(cè)試用例數(shù)目將顯著減少,模塊中的錯(cuò)誤也更容易發(fā)現(xiàn)。