- 軟件測試:實踐者方法
- 孫志安等編著
- 14字
- 2024-09-19 17:31:52
2.5 軟件錯誤、缺陷、故障及失效
2.5.1 軟件錯誤、缺陷及故障
2.5.1.1 軟件錯誤
軟件錯誤(Software Error)是指軟件生命周期過程中不希望或不可接受的人為差錯,是一種內(nèi)部屬性,相對于軟件本身而言,是一種外部行為。軟件錯誤可能導致軟件缺陷,同軟件失效具有直接的因果關(guān)系。常用初始錯誤數(shù)、剩余錯誤數(shù)、千(百)行代碼錯誤數(shù)等指標進行度量。
初始錯誤數(shù)是指錯誤排除之前,軟件中錯誤數(shù)的估計值;剩余錯誤數(shù)是指經(jīng)過測試及糾錯之后,仍然殘留在軟件中錯誤數(shù)的估計值;千(百)行代碼錯誤數(shù)是每千(百)行有效代碼中所包含的錯誤數(shù),既可以用來度量初始錯誤數(shù),也可以用來度量殘留錯誤數(shù)。
錯誤計數(shù)依據(jù)導致軟件失效的因果關(guān)系確定,而非簡單的錯誤個數(shù)累加。假若軟件失效是由一條錯誤語句所致,那么該語句對應(yīng)于一個錯誤;如果軟件失效是若干條錯誤語句共同作用的結(jié)果,則這若干條錯誤語句對應(yīng)于一個錯誤;如果軟件失效是因為需求規(guī)格錯誤所致,則該錯誤所涉及的語句數(shù)可能不止一條,且不一定順序相連,可能涉及軟件架構(gòu)及相關(guān)文檔。
錯誤排除之前,可能導致一次或多次軟件失效,相同失效可能因為不同錯誤被觸發(fā)所致,必須進行具體分析,不能一概而論,更不能以偏概全。軟件運行過程中,以失效形式反映出來的軟件錯誤,可能只是全部錯誤的一部分,另一部分隱含錯誤同樣具有導致軟件失效的可能,僅僅只是未被觸發(fā)而已。
文檔錯誤尤其是需求規(guī)格、設(shè)計文檔錯誤是軟件錯誤的根源,用戶手冊等應(yīng)用文檔錯誤可能導致用戶接受錯誤的操作信息而導致操作失誤,是軟件錯誤的重要組成部分。一般地,操作失誤不作為質(zhì)量與可靠性研究范疇。一些勘誤性錯誤可能并不直接對軟件造成影響,如果將這類文檔錯誤一并計入軟件錯誤,將對軟件質(zhì)量評價的客觀性、真實性帶來偏差。文檔錯誤是否計入軟件錯誤或者是否以單獨的形式加以標記和統(tǒng)計,需要通過甄別后區(qū)別對待。
軟件生命周期過程中,可以使用直接查錯法、間接查錯法以及這兩種方法的組合,檢出錯誤。桌面檢查、需求評審、設(shè)計評審、代碼審查、編譯診斷等能夠直接發(fā)現(xiàn)錯誤,通過糾正評審、編譯等過程中所發(fā)現(xiàn)的錯誤,能有效規(guī)避錯誤向下傳遞。間接查錯法是軟件調(diào)試、測試及運行過程中,有目的、有針對性地觸發(fā)錯誤,判斷和檢出軟件錯誤的有效方法。
1.錯誤分類
基于軟件定義,軟硬件之間的界限正變得越來越模糊,尤其是嵌入式系統(tǒng)構(gòu)建,越來越多地采用軟件硬化和硬件軟化設(shè)計模式。例如,在特定情況下,只讀存儲器中的微程序、通用陣列邏輯器件中燒錄的方程及時序,其錯誤可能引起硬件指令錯誤執(zhí)行,故障表象為硬件特征或運行環(huán)境特征。微程序錯誤通常是在程序設(shè)計過程中引入的,似乎應(yīng)該歸類為軟件錯誤,但它引起的卻是硬件指令的錯誤執(zhí)行,是否應(yīng)將其劃歸到硬件錯誤的范疇呢?都是亟待研究解決的問題。
1)根據(jù)錯誤征兆分類
當將軟件錯誤分類與其輸入空間進行關(guān)聯(lián)考慮時,可以根據(jù)軟件錯誤直接表現(xiàn)出來的征兆進行分類。根據(jù)錯誤征兆的軟件錯誤分類如表2-1所示。
表2-1 根據(jù)錯誤征兆的軟件錯誤分類

對于該分類方法,某種類型錯誤引起的實際后果依賴于應(yīng)用要求,與特定應(yīng)用場景密切相關(guān)。第Ⅰ種類型錯誤即因系統(tǒng)本身辨識出不能處理正常的但超出預先規(guī)定范圍的輸入,拒絕該輸入,不像第Ⅱ~Ⅴ種類型錯誤那么嚴重。在一個預先規(guī)定的時間范圍內(nèi),系統(tǒng)必須對任一輸入做出反應(yīng),尤其是對于實時嵌入式系統(tǒng),對某個輸入的拒絕可能導致災(zāi)難性的后果。
2)根據(jù)錯誤誘因分類
對于一個應(yīng)用系統(tǒng),尤其是實時嵌入式系統(tǒng),錯誤誘因不外乎硬件或軟件設(shè)計錯誤、環(huán)境改變等引起硬件劣化、輸入錯誤等。設(shè)計錯誤、硬件劣化、輸入錯誤構(gòu)成系統(tǒng)的錯誤空間。該分類方法是以錯誤起因為基點,而非錯誤產(chǎn)生的影響,其先決條件是構(gòu)建一個完全的錯誤診斷框架集。當一個設(shè)計錯誤發(fā)生時,即便所有輸入和操作均正確無誤,但也不可能產(chǎn)生期望的結(jié)果,且不正確的操作往往可能導致輸入錯誤。而由于硬件劣化或環(huán)境條件改變等因素導致錯誤時,系統(tǒng)狀態(tài)往往是確定且可以復現(xiàn)的。表2-2給出了基于誘因的軟件錯誤發(fā)生情況及特征。
表2-2 基于誘因的軟件錯誤發(fā)生情況及特征

3)根據(jù)錯誤發(fā)生時的持續(xù)時間分類
對于硬件及輸入錯誤,可以根據(jù)錯誤發(fā)生時的持續(xù)時間進行分類。如果一個錯誤從某一特定時間開始,反復發(fā)生且能夠在特定的條件下復現(xiàn),稱這類錯誤為永久錯誤。當某個錯誤發(fā)生時,系統(tǒng)特性產(chǎn)生短暫變化之后即恢復正常狀態(tài),則稱這類錯誤為瞬時錯誤,這類錯誤持續(xù)時間短暫,引發(fā)的失效難以復現(xiàn)和定位,診斷和排除困難,可能導致嚴重后果。對于硬件中的瞬時錯誤,如某硬件瞬時錯誤將某位二進制數(shù)位取反,導致一個錯誤數(shù)據(jù)存儲或一條錯誤指令執(zhí)行,由此引起的錯誤往往難以同軟件錯誤區(qū)分開來。
4)根據(jù)錯誤的表現(xiàn)形式及可觀察性分類
根據(jù)錯誤的表現(xiàn)形式及可觀察性,可將軟件錯誤分為外部錯誤和內(nèi)部錯誤。一個錯誤可能無法被直接觀察到,除非只有諸如一個內(nèi)部錯誤的影響傳播到輸出時,該錯誤才能在外部被觀察到。如果系統(tǒng)采用冗余設(shè)計,并非每個內(nèi)部錯誤都必然導致一個外部錯誤。內(nèi)部錯誤和外部錯誤的劃分,在很大程度上依賴于查錯界面的選擇。例如,如果一個查錯界面具有分層結(jié)構(gòu),則同一個錯誤既可以被看成內(nèi)部錯誤,也可以被看成外部錯誤。
5)根據(jù)應(yīng)用結(jié)果分類
軟件設(shè)計過程中,根據(jù)應(yīng)用結(jié)果將軟件功能劃分為主要功能、基本功能、次要功能、輔助功能并加以區(qū)別對待,有利于突出重點。次要或輔助功能失效可能不會影響系統(tǒng)使命任務(wù)的遂行,如果一個錯誤只影響軟件系統(tǒng)的次要或輔助功能,該錯誤就是非關(guān)鍵性的。如果將軟件錯誤劃分為關(guān)鍵性錯誤和非關(guān)鍵性錯誤,同樣有利于關(guān)鍵問題的解決,這正是軟件測試的出發(fā)點。
6)根據(jù)軟件生命周期過程分類
基于軟件生命周期過程,將軟件錯誤劃分為分配需求錯誤、需求錯誤、設(shè)計錯誤、實現(xiàn)錯誤、測試錯誤、驗收與交付錯誤、運行與維護錯誤等類型。軟件生命周期過程中,如果能夠?qū)γ總€階段的錯誤形態(tài)進行定義并進行充分的測試驗證,對系統(tǒng)質(zhì)量保證及改進事半功倍。這正是軟件測試與開發(fā)過程分離、注重驗收測試、忽視測試左移與回看等廣受詬病的重要原因。
7)根據(jù)軟件構(gòu)成成分分類
根據(jù)軟件構(gòu)成成分,可將軟件錯誤分為程序錯誤、數(shù)據(jù)錯誤和文檔錯誤3類。
8)根據(jù)錯誤嚴重程度分類
所有錯誤均可能導致軟件失效,但其嚴重程度則具有顯著差別。依據(jù)相關(guān)標準規(guī)范,基于系統(tǒng)服務(wù)功能喪失、人員傷害、設(shè)備損壞、環(huán)境破壞的程度,將軟件錯誤劃分為致命錯誤、嚴重錯誤、一般錯誤等不同等級或類型。基于錯誤嚴重程度的軟件錯誤分類粒度,不同標準規(guī)范具有一定差異,但分類方法大同小異。
2.軟件生命周期過程錯誤表征
1)需求識別、需求獲取與需求分析錯誤
對問題進行準確定義、抽象處理及嚴格的數(shù)學描述,是我們面臨的重大挑戰(zhàn)。何況,軟件錯誤征兆、錯誤誘因、失效機理異常復雜,難以預先定義統(tǒng)一的標準。而基于軟件狀態(tài)與預先定義標準的比較,辨識軟件狀態(tài)并對其給定狀態(tài)進行評價,無異于無源之水。
需求識別、需求獲取及需求分析,是通過對實際問題的歸納和抽象,剔除不涉及問題本質(zhì)的次要因素,抽取與具體問題相關(guān)的要素,對問題進行定義和抽象描述,構(gòu)建需求規(guī)格。在此過程中,可能遺漏、曲解、錯誤定義用戶需求,甚至會掩蓋問題的本質(zhì)。統(tǒng)計表明,軟件錯誤大都是由于對系統(tǒng)需求識別不充分、描述不準確以及對問題理解偏差所致,并非軟件設(shè)計所致。
2)軟件設(shè)計錯誤
(1)設(shè)計文檔錯誤。
(2)架構(gòu)笨重。
(3)程序說明的錯誤中斷。
(4)不完全的邏輯。
(5)模塊之間解耦不夠。
(6)安全性設(shè)計不足。
(7)特殊情況被忽略。
(8)缺乏對錯誤處理能力的考慮。
(9)對時間、資源等疏忽。
3)編碼實現(xiàn)錯誤
(1)不符合編碼規(guī)范。
(2)語法錯誤。
(3)初始化錯誤。
(4)參數(shù)混淆。
(5)循環(huán)計數(shù)錯誤。
(6)對判定結(jié)果的不正確處理。
(7)變量重復或未定義便加以使用。
(8)變量名書寫錯誤。
(9)數(shù)組類型和維數(shù)說明不正確。
盡管開發(fā)技術(shù)對軟件設(shè)計與實現(xiàn)錯誤具有直接影響,而更加突出的問題是團隊笨重,難以實現(xiàn)有效的扁平化,導致溝通困難。與此同時,與軟件開發(fā)、編碼實現(xiàn)及軟件測試等人員的素質(zhì)和能力相關(guān),尤其是對復雜問題處理更是如此。統(tǒng)計表明,軟件設(shè)計與編碼實現(xiàn)階段所檢出的邏輯錯誤數(shù)與系統(tǒng)分析、系統(tǒng)設(shè)計階段的時間成正比。
4)軟件運行錯誤
通常,當討論軟件運行錯誤時,總是假定一個正確的軟件,加上正確的輸入,得到正確的結(jié)果。這不僅是應(yīng)該的,而且也是可能的,否則,我們將對所交付的軟件失去信心。但受制于軟件測試技術(shù)、能力、成本等因素,完備軟件測試還只是一個夢想。因此,在軟件系統(tǒng)運行過程中,仍然可能發(fā)現(xiàn)錯誤,如不正確的初始化、數(shù)組越界、數(shù)據(jù)溢出、內(nèi)存泄漏、防誤操作設(shè)計、硬件缺陷等導致的軟件失效。基于使用質(zhì)量視角,運行階段的錯誤表征,更多的是與運行環(huán)境、使用流程、功能完備、系統(tǒng)效能、操作使用、人機交互等與系統(tǒng)能力、用戶體驗相關(guān)的問題。而這些問題的定義往往超越了錯誤的范疇。基于缺陷驅(qū)動的測試與基于能力驅(qū)動的測試,存在著本質(zhì)的差別。這是軟件測試發(fā)展的重大跨越。
5)瞬時硬件故障
瞬時硬件故障可能產(chǎn)生不正確的數(shù)據(jù)或控制流,具有與軟件錯誤相似的征兆,可能因此被裁定為軟件錯誤。瞬時硬件故障是系統(tǒng)故障的誘因,特別是當通過診斷軟件檢查硬件且顯示硬件功能正常時,更是如此。例如,某嵌入式系統(tǒng)顯示界面同時進行背景填充和漢字輸出時,某些漢字出現(xiàn)多余筆畫,直接表象是軟件錯誤所致,而實際上是因為DRAM芯片TC5118160BJ-60的瞬時故障,使得進行OpenGL作圖時,16MB DRAM作為深度緩存(Z Buffer)與紋理映射存儲器,用于緩存用戶數(shù)據(jù)、存放字庫,導致該瞬時故障發(fā)生。
瞬時硬件故障大多是由于間歇性干擾、硬件漸變等原因所致,發(fā)生時間非常短暫,定位及排除困難,對于不具備硬件查錯功能的系統(tǒng),瞬時硬件故障可能引起更多問題,甚至可能演變?yōu)橄到y(tǒng)故障的主要誘因。工程上,通過老化試驗?zāi)軌蚬烙嫷玫剿矔r硬件故障的發(fā)生概率。Ball和Hardie對這類故障進行深入研究后指出:對于瞬時硬件故障,控制部件的反應(yīng)比算術(shù)部件更加敏感;在一條指令執(zhí)行期間,對于出現(xiàn)在控制部件中的故障,被立即查出的概率較算術(shù)部件小一個數(shù)量級;瞬時硬件故障僅僅只有在其持續(xù)時間大于一個周期時,才是至關(guān)重要的。
3.典型軟件錯誤
1)需求錯誤或變化
(1)要求全新的功能(包括要求新的硬件)或增加新的功能。
(2)對硬件環(huán)境及外設(shè)的要求。
(3)對處理器的要求。
(4)對輸入/輸出及接口的要求。
(5)對內(nèi)存、存儲資源及容量的要求。
(6)對操作系統(tǒng)功能的特殊要求。
(7)對數(shù)據(jù)庫管理及完整性的要求。
(8)對安全性的要求。
2)文檔錯誤
(1)程序限制。
(2)操作過程。
(3)流程圖或問題分析圖(Problem Analysis Diagram,PAD)與編碼之間的區(qū)別。
(4)錯誤信息。
(5)程序應(yīng)有功能說明。
(6)輸出形式的要求。
(7)文檔的完整性及正確性。
3)邏輯錯誤
(1)問題抽象錯誤。
(2)不正確或無效邏輯以及簡單邏輯復雜化和錯誤的邏輯分支。
(3)不完全的處理。
(4)死循環(huán)。
(5)邏輯或條件不完全的測試。
(6)對上、下限的判斷錯誤。
(7)下標未經(jīng)校驗。
(8)特征值或特殊數(shù)據(jù)未經(jīng)測試。
(9)重復步長的不正確判斷。
4)數(shù)據(jù)處理錯誤
(1)向故障存儲介質(zhì)或接口讀/寫數(shù)據(jù)。
(2)數(shù)據(jù)丟失、無法存儲或傳輸。
(3)數(shù)據(jù)、下標、特征值未加設(shè)置,或不正確設(shè)置,或不正確初始化,或錯誤更改。
(4)額外項(表、數(shù)組)的產(chǎn)生。
(5)二進位信息處理錯誤。
(6)錯誤變址。
(7)數(shù)組類型轉(zhuǎn)換錯誤。
(8)內(nèi)部變量定義錯誤、設(shè)置或使用。
(9)對不存在的記錄進行數(shù)據(jù)查找。
(10)越限。
(11)數(shù)據(jù)鏈接錯誤。
(12)溢出或?qū)σ绯龅腻e誤處理。
(13)讀出錯誤。
(14)錯誤分類。
(15)錯誤覆蓋。
5)操作覆蓋錯誤
(1)測試執(zhí)行錯誤。
(2)使用錯誤的主結(jié)構(gòu)。
(3)數(shù)據(jù)準備錯誤。
6)在要求滿足方面的問題
(1)要求的能力被忽略或?qū)ο鄳?yīng)要求考慮不周。
(2)未達到所要求的功能。
(3)超過規(guī)定的運行時間。
(4)規(guī)定的時間內(nèi)不釋放資源。
7)計算錯誤
(1)使用不正確的表達式與習慣表示法。
(2)數(shù)學模型錯誤。
(3)錯誤或不精確的運算結(jié)果。
(4)算法選擇問題。
(5)非期望的運算結(jié)果。
(6)下標計算錯誤。
(7)混合運算次序錯誤。
(8)向量運算錯誤。
(9)符號習慣表示法錯誤運用。
8)用戶接口錯誤
(1)通信協(xié)議不一致或不協(xié)調(diào)。
(2)對輸入數(shù)據(jù)的不正確解釋。
(3)拒絕接收或無法使用有效的輸入數(shù)據(jù)。
(4)本來已被拒絕的輸入數(shù)據(jù)又被程序所用。
(5)不使用讀出的輸入數(shù)據(jù)。
(6)接收并處理非法輸入數(shù)據(jù)。
(7)對合法輸入數(shù)據(jù)的不正確處理。
(8)接口設(shè)計不完善。
(9)不適當?shù)闹袛嗯c再啟動。
9)程序接口錯誤
(1)要求錯誤的參數(shù)。
(2)無法使用可用參數(shù)。
(3)調(diào)用次序紊亂。
(4)初始化錯誤。
(5)程序之間通過錯誤的數(shù)據(jù)區(qū)進行通信。
(6)程序不兼容。
10)程序/系統(tǒng)軟件接口錯誤
(1)操作系統(tǒng)接口錯誤。
(2)程序?qū)ο到y(tǒng)支持軟件的不正確使用。
(3)操作系統(tǒng)本身的問題限制程序功能的發(fā)揮。
11)輸入/輸出錯誤
(1)輸出與設(shè)計要求不一致。
(2)輸出信息丟失或丟失數(shù)據(jù)項;輸出形式不正確;重復輸出;輸出域大小不適當。
(3)設(shè)計中未定義必要的輸出形式。
(4)排錯時的輸出問題(與設(shè)計文檔有關(guān))。
(5)打印控制錯誤。
(6)行/頁計數(shù)錯誤。
(7)應(yīng)輸出的出錯信息被刪除。
(8)標題輸出問題。
2.5.1.2 軟件缺陷
軟件缺陷(Software Defect)是因人為差錯或其他客觀原因使得軟件隱含導致其在運行過程中出現(xiàn)不希望或不可接受偏差的需求定義、軟件設(shè)計、編碼實現(xiàn)等錯誤。軟件缺陷和錯誤有著相近的含義。當軟件運行于某一特定環(huán)境時出現(xiàn)故障,稱缺陷被激活。軟件缺陷存在于軟件內(nèi)部,是一種靜態(tài)形式。
軟件生命周期過程中,軟件開發(fā)組織及測評機構(gòu)應(yīng)建立軟件缺陷庫,將其作為重要資產(chǎn)進行跟蹤管理。一般地,軟件缺陷管理流程如圖2-14所示。

圖2-14 軟件缺陷管理流程
1.軟件缺陷及行為
軟件缺陷是軟件測試關(guān)注的焦點。不僅要關(guān)注程序、文檔、數(shù)據(jù)等缺陷,還要面向應(yīng)用系統(tǒng),關(guān)注軟件修改、升級維護引入及僵尸代碼喚醒、開源代碼應(yīng)用、操作使用等缺陷。軟件缺陷的內(nèi)涵及演變?nèi)鐖D2-15所示。

圖2-15 軟件缺陷的內(nèi)涵及演變
2.軟件缺陷分類
鑒于軟件缺陷同錯誤的相關(guān)性和相似性,可以按錯誤分類方法對軟件缺陷進行分類。面向軟件缺陷的不同表現(xiàn)形式,基于總體視角,將軟件缺陷分為語法缺陷和語義缺陷兩類。語法缺陷是指軟件不符合程序設(shè)計語言的語法要求以及應(yīng)遵循的標準、規(guī)則和約定,語義缺陷則是指軟件未正確地表達應(yīng)表達的含義,包括初始化缺陷、接口缺陷等形式。基于軟件成分,可以將軟件缺陷劃分為程序缺陷、數(shù)據(jù)缺陷、文檔缺陷三種類型。基于軟件測試視角,給出如表2-3所示的軟件缺陷的工程化分類,同時對不同缺陷類型的表象進行描述。
表2-3 軟件缺陷的工程化分類

同軟件錯誤一樣,基于缺陷的嚴重等級,可以將軟件缺陷分為致命缺陷、嚴重缺陷、一般缺陷三種類型。基于嚴重等級的軟件缺陷分類如表2-4所示。
表2-4 基于嚴重等級的軟件缺陷分類

2.5.1.3 軟件故障
軟件故障(Software Fault)是指在規(guī)定的條件下,軟件系統(tǒng)運行過程中,出現(xiàn)可感知的不正常、不正確或不按規(guī)范執(zhí)行的狀態(tài)。軟件故障僅與設(shè)計和編碼實現(xiàn)有關(guān)。在數(shù)據(jù)結(jié)構(gòu)或軟件輸出中的表現(xiàn)稱為軟件差錯。這里,可通過如下示例,展示軟件的故障及其形態(tài)。

基于故障持續(xù)時間,軟件故障可分為永久性故障和瞬時故障;基于運算特性,軟件故障通常由計算錯誤、邏輯錯誤、數(shù)據(jù)處理錯誤、接口錯誤、數(shù)據(jù)定義錯誤、數(shù)據(jù)庫錯誤、輸入/輸出錯誤以及文件資料錯誤等導致,可將軟件故障對應(yīng)地劃分為這八類。
- OpenNI體感應(yīng)用開發(fā)實戰(zhàn)
- 用戶體驗四維度
- 軟件開發(fā)生產(chǎn)率改進:軟件管理的有效領(lǐng)導力與量化方法
- 21天學通C++(第7版)
- 數(shù)據(jù)科學導論:Python語言實現(xiàn)
- 混沌工程:通過可控故障實驗提升軟件系統(tǒng)可靠性
- 移動終端應(yīng)用軟件開發(fā)實戰(zhàn)
- Visual Basic編程寶典(十年典藏版)
- 統(tǒng)信UOS應(yīng)用開發(fā)詳解
- Spring Boot+Vue 3大型前后端分離項目實戰(zhàn)
- 軟件安全開發(fā)
- Vue.js 3企業(yè)級項目開發(fā)實戰(zhàn)(微課視頻版)
- OpenGL ES 2.0游戲開發(fā)(上卷)
- Unity 4 3D開發(fā)實戰(zhàn)詳解
- 點云配準從入門到精通