在軟件測試領(lǐng)域,故障模型故能夠?qū)y試人員的經(jīng)驗和直覺盡量歸納和固化,使得可以重復(fù)使用。測試人員通過理解軟件在做什么,來猜測可能出錯的地方,并應(yīng)用故障模型有目的地使它暴露缺陷。
中培偉業(yè)《軟件自動化測試與持續(xù)集成》培訓(xùn)專家劉老師指出,故障模型是軟件測試的基礎(chǔ),也是一個判斷測試方法是否成熟的重要標志。在測試的過程中,要確保每一個目標狀態(tài)都被測試,那么測試必須是系統(tǒng)的;為了最終定位軟件缺陷,所以測試必須是集中的;測試需要使用大量的測試用例和重復(fù)性測試,因此測試必須是自動的。那么故障模型有哪幾種呢?劉老師在這里詳細介紹了以下5種常見的故障模型。
輸入型故障模型
主要是對用戶的各種輸入進行建模,因為用戶的輸入是無法預(yù)期的,可能的組合狀態(tài)也是千變?nèi)f化。軟件功能除了能讓正確的輸入得到正確的輸出之外,還必須對非法和不合邏輯的輸入進行處理,防止因數(shù)據(jù)異常造成不可挽回的錯誤。典型的建模方法有:
1)使用非法數(shù)據(jù):從輸入數(shù)據(jù)的類型、長度、邊界值等方面考慮,測試軟件是否允許不正確的輸入進入系統(tǒng)并進行處理,是否有錯誤處理代碼,代碼是否正確。
2)使用默認值輸入:檢測軟件中所使用的變量是否初始化,是否將非法數(shù)據(jù)默認為合法邊界內(nèi)的某個合理值。
3)使用特殊字:檢測軟件是否正確處理了特殊字符和數(shù)據(jù)類型。
4)使用使緩沖區(qū)溢出的合法輸入:輸入超過允許的最大長度的數(shù)據(jù),檢測軟件是否檢查字符串/緩沖區(qū)的邊界。
5)使用可能產(chǎn)生錯誤的合法輸入組合:測試多個輸入值的組合,確認這些值的組合是否會互相影響而引起軟件失效。
6)重復(fù)輸入相同的合法輸入序列:檢測軟件是否考慮了循環(huán)處理的邊界。
輸出型故障模型
軟件的輸出通常是最直觀也是用戶最關(guān)注的,輸出型故障模型就是從軟件輸出角度出發(fā),分析造成故障的可能原因。例如通過一個正確的輸入在不同情況下產(chǎn)生不同輸出的情況可以對輸入和輸出的關(guān)系進行進一步驗證;可采用列舉等方法,強制軟件產(chǎn)生不符合業(yè)務(wù)背景知識的無效的輸出,從而進行處理,規(guī)避不必要的錯誤;強制修改輸出的屬性、查看輸出結(jié)果,測試初始化代碼和修改代碼是否同步;檢查用戶界面刷新情況,在不同的操作下測試界面刷新時間是否正確、界面刷新區(qū)域計算是否正確。
在大多數(shù)的軟件中,功能輸出的正確與否直接決定了軟件實現(xiàn)的好壞,輸出型故障模型所覆蓋的故障也占有相當大的比例。因此,我們在測試過程中應(yīng)建立這種故障模型,從故障結(jié)果進行分析,判斷造成故障的影響因素。
計算型故障模型
對于部分軟件程序,常需要進行大量的計算,因此該模型應(yīng)該盡可能包括關(guān)于計算方面的各種錯誤。包括變量的定義與使用方面的錯誤;數(shù)據(jù)的冗余;數(shù)組變量的越界錯誤;數(shù)據(jù)類型不匹配的錯誤;還有數(shù)據(jù)操作方面錯誤,包括函數(shù)調(diào)用參數(shù)傳遞錯誤、賦值語句錯誤等。
在建立計算型故障模型的時候,要定義數(shù)據(jù)并且對這些數(shù)據(jù)執(zhí)行各種故障操作,盡可能使模型比較完善。體現(xiàn)在功能層面上,可以使用非法的操作數(shù)和操作符組合來驗證計算要求的合法性、強制使計算結(jié)果溢出考慮數(shù)據(jù)結(jié)構(gòu)存儲的正確性、同時對數(shù)據(jù)進行操作檢測數(shù)據(jù)共享性等方法來建立故障模型。
流程型故障模型
這是一種程序控制流的故障模型,是對在程序中同樣占很大比例的循環(huán)結(jié)構(gòu)和分支結(jié)構(gòu)建立的模型。循環(huán)故障主要包括永不循環(huán)故障和死循環(huán)故障,這主要是由循環(huán)條件錯誤引起的。循環(huán)條件的錯誤中包括變量錯誤和運算符錯誤,在未執(zhí)行循環(huán)之前,循環(huán)變量的初值設(shè)置出錯以致永不循環(huán);進入循環(huán)以后,循環(huán)變量的值不作修改以致發(fā)生死循環(huán)。
而分支故障則包括判定條件故障和謂詞結(jié)構(gòu)故障,由于判定條件的出錯或者變量初值設(shè)置錯誤而導(dǎo)致不執(zhí)行分支結(jié)構(gòu);對于進入了分支結(jié)構(gòu)的執(zhí)行,可能因為謂詞的錯誤而提前退出分支結(jié)構(gòu)。
由此可知,流程型故障模型很可能是由一串連續(xù)的故障所組成的。因此在軟件功能測試中,我們可以通過判斷軟件流程是否正確執(zhí)行、功能分支是否覆蓋全面、循環(huán)操作是否正常結(jié)束等方法來檢測軟件流程的正確性。
資源型故障模型
資源型故障模型是在文件系統(tǒng)超載、系統(tǒng)介質(zhì)忙或不可用、介質(zhì)損壞等情況下,運行被測程序進行測試。此類故障模型的建立通常需要輔助測試工具進行環(huán)境的模擬。當磁盤負荷到達一定程度或可用物理資源十分有限時,系統(tǒng)進程十分容易進入“死鎖”狀態(tài)或出現(xiàn)不可恢復(fù)的錯誤。產(chǎn)生死鎖的根本原因在于系統(tǒng)提供的資源個數(shù)少于并發(fā)進程所要求的該類資源數(shù)。顯然,由于資源有限,不可能為所有要求資源的進程無限制地提供資源。
但是,可以采用適當?shù)姆椒ǎ赃_到消除或規(guī)避“死鎖”的目的。因此判斷軟件在何種操作下會導(dǎo)致“死鎖”以及軟件對介質(zhì)損壞的糾錯能力也就變得極其重要。所以我們應(yīng)該建立這種故障模型,并給出相應(yīng)的測試用例。