## 缺陷的內容
缺陷:軟件缺陷(Defect),常常又被叫做Bug。所謂軟件缺陷,即為計算機軟件或程序中存在的某種破壞正常運行能力的問題、錯誤,或者隱藏的功能缺陷。缺陷的存在會導致[軟件]產品在某種程度上不能滿足用戶的需要。IEEE729-1983對[缺陷]有一個標準的定義:從產品內部看,缺陷是[軟件]產品開發或維護過程中存在的錯誤、毛病等各種問題;從產品外部看,缺陷是系統所需要實現的某種功能的失效或違背。
缺陷類別:
缺陷的表現形式不僅體現在功能的失效方面,還體現在其他方面。主要類型有:
1軟件沒有實現產品規格說明所要求的功能模塊;
2軟件中出現了產品規格說明指明不應該出現的錯誤;
3軟件實現了產品規格說明沒有提到的功能模塊;
4軟件沒有實現雖然產品規格說明沒有明確提及但應該實現的目標;
5軟件難以理解,不容易使用,運行緩慢,或從測試員的角度看,最終用戶會認為不好。
以計算器開發為例。計算器的產品規格說明

定應能準確無誤地進行加、減、乘、除運算。如果按下加法鍵,沒什么反應,就是第一種類型的缺陷;若計算結果出錯,也是第一種類型的缺陷。
產品規格說明書還可能規定計算器不會死機,或者停止反應。如果隨意敲鍵盤導致計算器停止接受輸入,這就是第二種類型的缺陷。
如果使用計算器進行測試,發現除了加、減、乘、除之外還可以求平方根,但是產品規格說明沒有提及這一功能模塊。這是第三種類型的缺陷——軟件實現了產品規格說明書中未提及到的功能模塊。
在測試計算器時若發現電池沒電會導致計算不正確,而產品說明書是假定電池一直都有電的,從而發現第四種類型的錯誤。
軟件測試員如果發現某些地方不對,比如測試員覺得按鍵太小、“=”鍵布置的位置不好按、在亮光下看不清顯示屏等,無論什么原因,都要認定為缺陷。而這正是第五種類型的缺陷。
根據以上五種缺陷類型,在軟件測試中可以區分不同類型的問題。
## 分類標準
### 缺陷屬性
1.缺陷標識(Identifier): 缺陷標識是標記某個缺陷的一組符號。每個缺陷必須有一個唯一的標識。
2.缺陷類型 (Type): 缺陷類型是根據缺陷的自然屬性劃分的缺陷種類。
3.缺陷嚴重程度 :缺陷嚴重程度是指因缺陷引起的故障對軟件產品的影響程度。
4.缺陷優先級(Priority): 缺陷的優先級指缺陷必須被修復的緊急程度。
5.缺陷狀態(Status) :缺陷狀態指缺陷通過一個跟蹤修復過程的進展情況。
6.缺陷起源(Origin) :缺陷來源指缺陷引起的故障或事件第一次被檢測到的階段。
7.缺陷來源(Source): 缺陷來源指引起缺陷的起因。
8.缺陷根源(Root Cause): 缺陷根源指發生錯誤的根本因素。

### 缺陷嚴重程度(Severity)
[**軟件測試**]**錯誤嚴重程度**
1.Critical:不能執行正常工作功能或重要功能。或者危及人身安全。
2.Major:嚴重地影響系統要求或基本功能的實現,且沒有辦法更正。(重新安裝或重新啟動該軟件不屬于更正辦法)
3.Minor:嚴重地影響系統要求或基本功能的實現,但存在合理的更正辦法。(重新安裝或重新啟動該軟件不屬于更正辦法)
4.Cosmetic:使操作者不方便或遇到麻煩,但它不影響執行工作功能或重要功能。
5.Other:其它錯誤。
**評審錯誤嚴重程度**
1.Major:主要的,較大的缺陷
2.Minor:次要的,小的缺陷
### 缺陷優先級(Priority)
1.Resolve Immediately:缺陷必須被立即解決。
2.Normal Queue:缺陷需要正常排隊等待修復或列入軟件發布清單。
3.Not Urgent:缺陷可以在方便時被糾正。
### 缺陷狀態(Status)
1.Submitted: 已提交的缺陷
2.Open :確認“提交的缺陷”,等待處理
3.Rejected: 拒絕“提交的缺陷”,不需要修復或不是缺陷
4.Resolved :缺陷被修復
5.Closed :確認被修復的缺陷,將其關閉
### 缺陷起源(Origin)
1.Requirement:在需求階段發現的缺陷
2.Architecture:在構架階段發現的缺陷
3.Design:在設計階段發現的缺陷
4.Code:在編碼階段發現的缺陷
5.Test:在測試階段發現的缺陷
### 缺陷來源(Source)
1.Requirement: 由于需求的問題引起的缺陷
2.Architecture: 由于構架的問題引起的缺陷
3.Design: 由于設計的問題引起的缺陷
4.Code: 由于編碼的問題引起的缺陷
5.Test: 由于測試的問題引起的缺陷
6.Integration: 由于集成的問題引起的缺陷
## 級別
一旦發現軟件缺陷,就要設法找到引起這個缺陷的原因,分析對產品質量的影響,然后確定軟件缺陷的嚴重性和處理這個缺陷的優先級。各種缺陷所造成的后果是不一樣的,有的僅僅是不方便,有的可能是災難性的。一般問題越嚴重,其處理優先級就越高,可以概括為以下四種級別:
(1)微小的(Minor)。一些小問題如有個別錯別字、文字排版不整齊等,對功能幾乎沒有影響,軟件產品仍可使用。
(2)一般的(Major)。不太嚴重的錯誤,如次要功能模塊喪失、提示信息不夠準確、用戶界面差和操作時間長等。
(3)嚴重的(Critical)。嚴重錯誤,指功能模塊或特性沒有實現,主要功能部分喪失,次要功能全部喪失,或致命的錯誤聲明。
(4)致命的(Fatal)。致命的錯誤,造成系統崩潰、死機,或造成數據丟失、主要功能完全喪失等。
除了嚴重性之外,還存在反映軟件缺陷處于一種什么樣的狀態,以便于及時跟蹤和管理,下面是不同的缺陷狀態。
·激活狀態(Open):問題沒有解決,測試人員新報告的缺陷或者驗證后缺陷仍舊存在。
·已修正狀態(Fixed):開發人員針對缺陷,修正軟件后已解決問題或通過單元測試。
·關閉狀態(Close):測試人員經過驗證后,確認缺陷不存在之后的狀態。
以上是三種基本的狀態,還有一些是需要相應的狀態描述,如“保留”,“不一致”狀態等。
## 產生原因
在軟件開發的過程中,軟件缺陷的產生是不可避免的。那么造成軟件缺陷的主要原因有哪些?從軟件本身、團隊工作和技術問題等角度分析,就可以了解造成軟件缺陷的主要因素。
軟件缺陷的產生主要是由軟件產品的特點和開發過程決定的。
### 軟件本身
1.需求不清晰,導致設計目標偏離客戶的需求,從而引起功能或產品特征上的缺陷。
2.系統結構非常復雜,而又無法設計成一個很好的層次結構或組件結構,結果導致意想不到的問題或系統維護、擴充上的困難;即使設計成良好的面向對象的系統,由于對象、類太多,很難完成對各種對象、類相互作用的組合測試,而隱藏著一些參數傳遞、方法調用、對象狀態變化等方面問題。
3.對程序邏輯路徑或數據范圍的邊界考慮不夠周全,漏掉某些邊界條件,造成容量或邊界錯誤。
4.對一些實時應用,要進行精心設計和技術處理,保證精確的時間同步,否則容易引起時間上不協調,不一致性帶來的問題。
5.沒有考慮系統崩潰后的自我恢復或數據的異地備份、災難性恢復等問題,從而存在系統安全性、可靠性的隱患。
6.系統運行環境的復雜,不僅用戶使用的計算機環境千變萬化,包括用戶的各種操作方式或各種不同的輸入數據,容易引起一些特定用戶環境下的問題;在系統實際應用中,數據量很大。從而會引起強度或負載問題。
7.由于通信端口多、存取和加密手段的矛盾性等,會造成系統的安全性或適用性等問題。
8.新技術的采用,可能涉及技術或系統兼容的問題,事先沒有考慮到。
### 團隊工作
1.系統需求分析時對客戶的需求理解不清楚,或者和用戶的溝通存在一些困難。
2.不同階段的開發人員相互理解不一致。例如,軟件設計人員對需求分析的理解有偏差,編程人員對系統設計規格說明書某些內容重視不夠,或存在誤解。
3.對于設計或編程上的一些假定或依賴性,相關人員沒有充分溝通。
4.項目組成員技術水平參差不齊,新員工較多,或培訓不夠等原因也容易引起問題。
### 技術問題
1.算法錯誤:在給定條件下沒能給出正確或準確的結果。
2.語法錯誤:對于編譯性語言程序,編譯器可以發現這類問題;但對于解釋性語言程序,只能在測試運行時發現。
3.計算和精度問題:計算的結果沒有滿足所需要的精度。
4.系統結構不合理、算法選擇不科學,造成系統性能低下
5.接口參數傳遞不匹配,導致模塊集成出現問題。
### 項目管理的問題
1.缺乏質量文化,不重視質量計劃,對質量、資源、任務、成本等的平衡性把握不好,容易擠掉需求分析、評審、測試、等時間,遺留的缺陷會比較多。
2.系統分析時對客戶的需求不是十分清楚,或者和用戶的溝通存在一些困難。
3.開發周期短,需求分析、設計、編程、測試等各項工作不能完全按照定義好的流程來進行,工作不夠充分,結果也就不完整、不準確,錯誤較多;周期短,還給各類開發人員造成太大的壓力,引起一些人為的錯誤。
4.開發流程不夠完善,存在太多的隨機性和缺乏嚴謹的內審或評審機制,容易產生問題。
5.文檔不完善,風險估計不足等。
## 構成
從軟件測試觀點出發,軟件缺陷有以下五大類:
### 功能缺陷
(1)規格說明書缺陷:規格說明書可能不完全,有二義性或自身矛盾。另外,在設計過程中可能修改功能,如果不能緊跟這種變化并及時修改規格說明書,則產生規格說明書錯誤。

(2)功能缺陷:程序實現的功能與用戶要求的不一致。這常常是由于規格說明書包含錯誤的功能、多余的功能或遺漏的功能所致。在發現和改正這些[缺陷]的過程中又可能引入新的缺陷。
(3)測試缺陷:軟件測試的設計與實施發生錯誤。特別是系統級的功能測試,要求復雜的測試環境和數據庫支持,還需要對測試進行腳本編寫。因此軟件測試自身也可能發生錯誤。另外,如果測試人員對系統缺乏了解,或對規格說明書做了錯誤的解釋,也會發生許多錯誤。
(4)測試標準引起的缺陷:對軟件測試的標準要選擇適當,若測試標準太復雜,則導致測試過程出錯的可能就大。
### 系統缺陷
◆外部接口缺陷:外部接口是指如終端、打印機、通信線路等系統與外部環境通訊的手段。所有外部接口之間、人與機器之間的通訊都使用形式的或非形式的專門協議。如果協議有錯,或太復雜,難以理解,致使在使用中出錯。此外,還包括對輸入/輸出格式錯誤理解,對輸入數據不合理的容錯等。

◆內部接口缺陷:內部接口是指程序內部子系統或模塊之間的聯系。它所發生的缺陷與外部接口相同,只是與程序內實現的細節有關,如設計協議錯、輸入/輸出格式錯、數據保護不可靠、子程序訪問錯等。
◆硬件結構缺陷:與硬件結構有關的軟件缺陷在于不能正確的理解硬件如何工作。如忽視或錯誤地理解分頁機構、地址生成、通道容量、I/O指令、中斷處理、設備初始化和啟動等而導致的出錯。
◆操作系統缺陷:與操作系統有關的軟件缺陷在于不了解操作系統的工作機制而導致出錯。當然,操作系統本身也有缺陷,但是一般用戶很難發現這種缺陷。
◆軟件結構缺陷:由于軟件結構不合理而產生的缺陷。這種缺陷通常與系統的負載有關,而且往往在系統滿載時才出現。如錯誤地設置局部參數或全局參數;錯誤地假定寄存器與存儲器單元初始化了;錯誤地假定被調用子程序常駐內存或非常駐內存等,都將導致軟件出錯。
◆控制與順序缺陷:如忽視了時間因素而破壞了事件的順序;等待一個不可能發生的條件;漏掉先決條件;規定錯誤的優先級或程序狀態;漏掉處理步驟;存在不正確的處理步驟或多余的處理步驟等。
◆資源管理缺陷:由于不正確地使用資源而產生的缺陷。如使用未經獲準的資源;使用后未釋放資源;資源死鎖;把資源鏈接到錯誤的隊列中等
### 加工缺陷
◇算法與操作缺陷:是指在算術運算、函數求值和一般操作過程中發生的缺陷。如數據類型轉換錯;除法溢出;不正確地使用關系運算符;不正確地使用整數與浮點數做比較等。

◇初始化缺陷:如忘記初始化工作區,忘記初始化寄存器和數據區;錯誤地對循環控制變量賦初值;用不正確的格式、數據或類類型進行初始化等。
◇控制和次序缺陷:與系統級同名缺陷相比,它是局部缺陷。如遺漏路徑;不可達到的代碼;不符合語法的循環嵌套;循環返回和終止的條件不正確;漏掉處理步驟或處理步驟有錯等。
◇靜態邏輯缺陷:如不正確地使用switch語句;在表達式中使用不正確的否定(例如用“>”代替“<”的否定);對情況不適當地分解與組合;混淆“或”與“異或”等。
### 數據缺陷
△動態數據缺陷:動態數據是在程序執行過程中暫時存在的數據,它的生存期非常短。各種不同類型的動態數據在執行期間將共享一個共同的存儲區域,若程序啟動時對這個區域未初始化,救護導致數據出錯。

△靜態數據缺陷:靜態數據在內容和格式上都是固定的。它們直接或間接的出現在程序或數據庫中,有編譯程序或其他專門對他們做預處理,但預處理也會出錯。
△數據內容、結構和屬性缺陷:數據內容是指存儲于存儲單元或數據結構中的位串、字符串或數字。數據內容缺陷就是由于內容被破壞或被錯誤地解釋而造成的缺陷。數據結構是指數據元素的大小和組織形式。在同一存儲區域中可以定義不同的數據結構。數據結構缺陷包括結構說明錯誤及數據結構誤用的錯誤。數據屬性是指數據內容的含義或語義。數據屬性缺陷包括對數據屬性不正確地解釋,如錯把整數當實數,允許不同類型數據混合運算而導致的錯誤等。