第7章軟件的質量與測試_第1頁
第7章軟件的質量與測試_第2頁
第7章軟件的質量與測試_第3頁
第7章軟件的質量與測試_第4頁
第7章軟件的質量與測試_第5頁
已閱讀5頁,還剩203頁未讀 繼續免費閱讀

下載本文檔

版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領

文檔簡介

1第7章

軟件的質量與測試

軟件工程研究室SoftwareEngineering2

主要內容

7.1

軟件的質量

7.2軟件的測試

目的:測試是軟件質量保證中至關重要的一個環節3

主要內容

7.1

軟件的質量

7.1.1軟件的質量觀

7.1.2軟件質量的特征

7.1.3軟件質量因素

7.1.4軟件質量要素之間的關系

7.1.5質量保證的幾個問題47.1.1軟件的質量觀7.1軟件的質量高質量客戶:

在可接受的資金和資源成本下解決問題用戶:

易學習;

使用效率高;

對工作有幫助開發:

易設計;

易維護;

易重用管理人員:

銷售量大并使客戶滿意,同時開發和維護的費用少5

Juran

的質量觀:

產品在使用時,能適合用戶需要的目標程度。

ISO的質量觀:

“一個產品或服務是否能夠滿足其指定的或蘊含的需求有關的性質與特征總和”.

7.1.1軟件的質量觀

7.1.2軟件質量的特征(1)很難制定具體的、數量化的產品質量標準沒有相應的國際標準、國家標準或行業標淮(2)大部分軟件很難做到“零缺陷”對軟件的測試不可能窮盡所有情況,有缺陷的軟件仍然可以使用軟件產品的不完善可通過維護和升級解決問題(3)軟件的類型不同,軟件質量的衡量標準的側重點也不同。對實時系統,可靠、效率是衡量軟件質量的首要要素對一些需要用戶與軟件本身進行大量交互的系統,對可用性(usability)就提出了較高的要求。

7.1.2軟件質量的特征(6)如果軟件只滿足了己經定義的需求,而沒有滿足一些隱含的需求,軟件質量也不能保證。(4)軟件產品之間很難進行橫向的質量對比(5)軟件需求是度量軟件質量的基礎,滿足了用戶需求的軟件質量,就是好的軟件質量。即使軟件在技術上很先進,界面很漂亮,功能也很多,但不是用戶所需要的,仍不能算軟件質量好。功能性(Functionality)可靠性(Reliability)可用性(Usability)效率(Efficiency)可維護性(Maintainability)可移植性(Portability)7.1.3軟件質量因素

1)ISO質量特性國際標準(ISO/IEC9126)

1991年,ISO發布了ISO/IEC9126質量特性的國際標準,將質量特性降為6個,并定義了

21個子特性:

1)ISO質量特性國際標準(ISO/IEC9126)圖7-1ISO軟件質量模型

外部和內部質量適合性準確性互操作性保密安全性功能性可靠性易用性維護性可移植性效率成熟性容錯性易恢復性易理解性易學性易操作性吸引性時間特性資源利用性易分析性易改變性穩定性易測試性適應性易安裝性共存性易替換性102)McCall軟件質量模型(1977):產品修改產品改型

圖7-2McCall軟件質量模型

外部質量屬性(externalqualityattribute)易移植性易復用性互用性

易維護性靈活性易測試性產品操作易使用性正確性可靠性高效性完整性11每個要素包含系列衡量標準正確性易追溯性:從需求中找到實現能力完備性:實現了所有的功能一致性:一致的術語和技術高效性運行效率:使用最少的處理時間存儲效率:使用最小的內存空間可靠性容錯性:異常,仍能操作一致性準確性簡潔性易使用性易操作培訓易交流輸入輸出量和速度靈活性一致性模塊性易擴展性自我描述性互用性模塊性通訊共同性數據共同性13易測試性檢視:測量、識別錯誤能力簡潔性自我描述性模塊性模塊性易移植性軟件獨立性硬件獨立性自我描述性14易復用性軟件獨立性通用性模塊性硬件獨立性自我描述性易維護性簡明性:代碼少簡潔性:易理解模塊性一致性自我描述性:有解釋15總體效用易維護性現存效用易移植性易修改性易理解性易測試性效率人機界面可靠性易更改性

可認性

簡明性結構性自我描述性易交流性易存取性設備效率可依靠性一致性完整性準確性自我包含性硬件獨立性圖7-3Boehm模型3)Boehm模型

(1978)16McCall和Boehm模型從用戶出發的質量觀.都是層次結構的模型.根據具體情況決定質量要素的相對重要性.

7.1.4軟件質量要素之間的關系

質量由多種因素組成,但互不獨立,也不一定同等重要,可能是沖突的.

在一定前提下來衡量質量,不能脫離代價來衡量產品的質量.17軟件質量要素之間的關系正確性可靠性效率完整性易使用性易維護性易測試性靈活性易移植性易復用性互用性正確性可靠性效率完整性易使用性易維護性易測試性靈活性易移植性易復用性互用性直接相關反向相關無關圖7-4Perry的質量要素之間關系18提高效率可能會使設計不宜理解,會降低系統的可維護性。實現高可靠性通常要求反復地進行錯誤檢查并添加一些冗余計算。

提高效率可能要求刪除這些檢查和冗余。改善可用性可能需要添加額外的代碼為用戶提供反饋信息,這又可能降低整體效率。良好的工程實踐,項目開始就應設定質量目標,目標的實現應讓所有相關人員都滿意。為了在市場競爭中取得成功,在不超過預算和滿足其他質量目標要求的同時,使某個質量屬性達到最優化(optimize)。19

內部質量屬性:

代碼注釋量,影響可維護性,間接影響可靠性;

代碼的復朵性,影響可維護性、可靠性。

說明:

注重短期需要而忽視決策的長期影響是人類的天性.這可能引發嚴重后果。

只考慮短期效果,可能忽視系統的可維護性,

忽視客戶的長期需要,導致過高的后期成本。20

幾個思考題:下面的問題與哪些質量屬性有關.一段宇宙飛船程序,使宇宙飛船進入冥王星軌道.一個在購物中心運行的系統.使用該系統,購物者可以確定哪個商店出售他們需要的商品.

汽車自動變速器的控制程序.

打印票據的實用軟件包.計算所得稅的程序,公務員可以使用該程序檢查納稅人的賬目.

1)軟件質量應貫穿軟件開發的全過程軟件質量管理該貫穿軟件開發的全過程,而不僅僅是軟件本身。

7.1.5質量保證的幾個問題2)對開發文檔的評審

需求規格說明書設計規格說明書代碼文檔測試報告用戶手冊

3)運用技術手段保證質量使用多種軟件工具,保證軟件質量。例如:

用RationalRose軟件進行軟件開發等。采用先進的系統分析方法和軟件設計方法

4)以滿足客戶和用戶需要為目標的質量保證(3)缺陷預防,控制對缺陷的修改

(1)采用快速原型法(2)充分設計之后再編碼(4)充分進行軟件的系統測試

(5)恰當掌握軟件的放行標淮

237.2軟件測試

軟件測試

它既令人興奮,也令人煩腦;既令人羨慕不己,也令人望而卻步;要想在預算內按時交付高質量的軟件,測試是必不可少的。

7.2.1軟件測試概述

7.2.2程序錯誤分類

7.2.3軟件測試的V模型

7.2.4軟件測試的分類

7.2.5軟件測試的方法

7.2.6軟件測試的步驟

7.2.7軟件的調試

7.2.1軟件測試概述1)什么是軟件測試(Test)

?2)為什么要測試(Test)

?3)軟件測試的目的

4)軟件測試的準則5)軟件的可測試性

6)軟件測試與軟件開發階段7.2.1軟件測試概述1)什么是軟件測試(Test)

測試是采用測試用例,檢測出程序的錯誤、缺陷、故障、失效和事故等的一項軟件活動。對程序的副本提供一組有代表性的輸入數據,給定的環境下運行程序副本,并對程序的輸出進行檢查和分析。

錯誤(Error)稱bug不正確結果的全部。由開發人員引起的,如輸入錯誤、需求錯誤、設計錯誤等。

缺陷(Defect)錯誤的表現結果,會促成失敗的發生。由不恰當或錯誤的技術、算法、遺漏了某些功能或設計內容所導致。故障(Fault)故障是指系統的規格說明與其行為之間的偏差,通常由一個或多個缺陷引起。通過對比程序的實際輸出與預期輸出來檢測。失效(Failure)故障引起的結果。系統不可接受的行為。由于錯誤,導致系統的錯誤輸出─失效。發生過失效的軟件通常仍然是可用的。只有當軟件頻繁失效,或者公認已經“過時”了的時侯,軟件才被廢棄,意味著當前這一版本軟件使用壽命的終結。事故(Incident)呈現給用戶的嚴重錯誤的結果,造成一定的或嚴重的損失。“千年蟲”1970年代,一位程序員在開發公司的工資管理系統時,迫于計算機存儲空間的限制,將4位數日期縮減為2位數(197373),從而節省了可觀的存儲空間;然而,世界各地更換或升級2000年問題所花的費用超過數億美元…2)為什么要測試(Test)

?“愛國者導彈”愛國者導彈vs

飛毛腿導彈有一枚愛國者導彈擊斃28名美軍士兵…原因:導彈的軟件包含一個累加計時故障,系統時鐘錯誤積累起來就可能拖延14個小時,造成跟蹤系統失去準確度。“獅子王”1994年秋天,迪斯尼公司發行《LionKingAnimated》,雖然銷售量巨大,卻引來巨大的、意想不到的投訴…原因:

發布之前未能對該軟件在各種不同類型的PC機上進行測試,導致在某些系統上無法運行。

如,對一個整數組排序,應該用整數比較函數

icmp調用qsort:

int

arr[N];

qsort(arr,N,sizeof(arr[0],icmp);無意中把字符串比較函數傳進去:?int

arr[N];

?qsort(arr,N,sizeof(arr[0],scmp);

編譯無法發現這類錯誤,程序運行時會垮臺,

它訪問非法的存儲器地址,災難就發生了。323)軟件測試的目的

軟件測試是對軟件質量的度量,并代表了規約、設計和編碼的最終評審。

為找出錯誤而運行程序或系統的過程。(Myers,1979)軟件測試概述測試是證明錯誤的存在,而不是證明錯誤的不存在。

(Dijstra)確信程序做了它應該做的事。(Hetzel,1973)

確認程序正確地實現了所要求的功能。33

4)軟件測試的準則#

需求確定后,制定測試計劃,所有的測試應能

追溯到用戶需求上。

軟件測試概述#盡早地和不斷地進行軟件測試。

#

測試從小規模開始,逐漸擴到大規模。

#

獨立測試組或SoftwareTestEngineer

#

測試中發現8o%錯誤,可能由程序的20%的組件造成的(Pareto原理)。

#

使用或開發測試工具。

345)軟件的可測試性

程序被測試的難易程度軟件測試概述一個特定測試集覆蓋產品的充分程度

軟件可測試性的度量特征:

a.可操作性b.可觀察性c.可控制性

d可分解性e.簡單性f.穩定性

g.可理解性

35

6)軟件測試與軟件開發階段

軟件測試并不等于程序測試,應貫穿于軟件定義與開發的各個階段。

需求階段

用例情景測試原型走查模型走查需求評審制定測試計劃設計階段

模型走查原型走查設計評審

制定測試計劃測試設計實現階段代碼走查接口分析文檔評估

編寫測試用例制定測試過程

單元測試實現階段制定測試計劃集成設計系統測試

α測試

β測試驗收測試回歸測試,質量保證驗收階段表7-1軟件測試與軟件開發階段367.2.2軟件錯誤分類

Beizer

給出的軟件錯誤:

抽樣大小—6877000條語句(含注釋)總錯誤數—16209個錯每千條語句錯誤數—2.36個錯需求錯誤,功能和性能錯誤程序結構錯誤,數據錯誤編碼錯誤測試定義和執行錯誤軟件集成錯誤37錯誤分類錯誤數百分比(%)需求錯誤13178.1需求不正確6494.0需求邏輯錯1530.9需求不完備2241.4需求文檔描述錯130.1需求變更2781.7表7-2需求錯誤錯誤分類38錯誤分類錯誤數百分比(%)功能和性能錯誤262416.2功能和性能不正確4562.8性能不完整2311.4功能不完整1931.2適用范圍錯7784.8用戶信息和診斷信息錯8575.3異常處理錯790.5其他功能錯300.2表7-3功能和性能錯誤錯誤分類39錯誤分類錯誤數百分比(%)程序結構錯誤408225.2控制流和控制順序錯誤、變量、分支、循環等問題207812.8處理器錯200412.4表7-4程序結構錯誤錯誤分類40錯誤分類錯誤數百分比(%)數據錯誤363822.4數據類型定義,引用及結構錯180511.1數據存取及處理錯183111.3其他數據錯(比較、計算、精度、零為除數)2表7-5數據錯誤錯誤分類41錯誤分類錯誤數百分比(%)編碼與實現錯誤16019.9編碼與程序輸入錯誤3322.0違反編程標準或風格3182.0文檔錯9605.9其他實現錯10.0表7-6編碼與實現錯誤錯誤分類42錯誤分類錯誤數百分比(%)測試定義和執行錯誤4472.8測試設計錯110.1測試執行錯3552.2測試文檔錯110.1測試用例不充分640.4其他測試錯誤60.0其他錯誤

(定時和協調,性能,故障恢復,不付合標準)7634.7表7-7測試定義和執行錯誤錯誤分類43錯誤分類錯誤數百分比(%)軟件集成錯誤14559.0內部接口錯8595.3外部接口,時間吞吐量不匹配5183.2其他集成錯780.5系統及軟件結構錯2821.7表7-8軟件集成錯誤錯誤分類447.2.3軟件測試的V模型模塊規約系統結構與子系統規約用戶需求分析規約確定系統設計詳細設計模塊實現規約用戶需求用戶要求用戶接受測試系統測試系統集成子系統集成與測試模塊測試模塊代碼測試后的模塊測試后子系統集成的系統檢驗過的系統交付的系統圖7-5軟件測試的V模型457.2.4軟件測試的分類

1)按實施步驟分:單元測試組裝測試確認測試系統測試

3)按使用的測試方法分:靜態測試:動態測試:白盒測試、黑盒測試

2)按軟件組裝策略分:

#增量測試自頂向下自底向上三明治

#非增量測試46軟件測試的分類

功能測試

性能測試接口測試

強度測試

安全性測試

可靠性測試

恢復性測試

安裝性測試

協調性測試

人機界面測試4)按項目測試條目分:477.2.5軟件測試方法圖7-8軟件測試技術分類軟件測試方法靜態測試動態測試黑盒測試/功能測試白盒測試/結構測試48靜態測試(代碼會審/走查/辦公桌)對需求模型、設計模型的靜態檢查檢查:數據引用錯(使用未賦值的變量)數據計算錯(混合類型,零為除數)數據說明錯(類型不符錯)數據比較錯(運算符、邏輯符不符)控制流錯(循環初值、次數不對)接口錯輸入輸出錯文件錯49

任何程序都可以看作是將輸入定義域取值映射到輸出值域的函數。將系統看成“黑盒”。也稱黑盒測試1)功能測試(FunctionTesting)軟件InputOutput圖7-6黑盒測試目的:功能的正確性測試

證實每個實現了的功能是否符合需求規格說明書的要求。

黑盒測試要在軟件的接口處進行.50是否有不正確或遺漏的功能?黑盒測試可以發現如下錯誤:在接口上,輸入能否被正確地接受?能否輸出正確的結果?是否有數據結構錯誤或外部信息(例如數據文件)訪問錯誤?性能上是否能夠滿足要求?是否有初始化或終止性錯誤?51

功能測試的方法:

等價類分析邊界值分析錯誤推測法因果圖法

隨機測試基于決策樹的測試52(1)等價類(Equivalencepartitioning)

把輸入的數據按有效的和無效的劃分為若干個等價類。等價類,是指某個輸入域的子集合。在該子集合中,各個輸入數據對于揭露程序中的錯誤都是等效的。

有效等價類:

對于程序規格說明,是合理的,有意義的輸入數據構成的集合。

無效等價類:

是指對于程序規格說明,是不合理的,無意義的輸入數據構成的集合。53等價類劃分的原則:

按區間劃分按數值劃分按數值集合劃分按限制條件或規則劃分

功能測試按區間劃分例如:輸入值是學生成績,范圍是0~1000100有效等價類1≤成績≤100無效等價類2成績>100無效等價類1成績<054

測試用例

={測試數據十期望結果}

測試結果={測試用例十實際結果}

在確立了等價類之后,建立等價類表,列出所有劃分出的等價類數據十期望結果。

確立測試用例功能測試等價類劃分

………

………

……….

無效等價類

有效等價類

輸入條件表7-9劃分出的等價類不考慮程序的內部結構,只依據程序的規格說明來設計測試用例。55

輸入條件

有效等價類

無效等價類標識符個數1個(1)多個(2)0個(3)

標識符字符數1—8個(4)

0個(5)>8個(6)>80個(7)標識符組成

字母(8)

數字(9)非字母數字字符(10)

保留字(11)第一個標識符

字母(12)

非字母(13)標識符使用先說明后使用(14)

未說明已使用(15)表7-10標識符的等價類劃分例1為標識符劃分等價類56測試用例:

VARX,T1234567:REAL;(1),(2),(4),(8),(9),(12),(14)X=3.414;T1234567:=2.73VAR:REAL;(3)VARX,:REAL;(5)VART12345678:REAL;(6)VART123456789….:REAL>80(7)VART$:CHAR;(10)VARGOTO:INTEGER;(11)VAR2T:REAL;(13)VARPAR:REAL;(15)例2:日期檢查檔案管理系統,要求用戶輸入以年月表示的日期。假設日期限定在1990年1月--2049年12月,并規定日期由6位數字字符組成,前4位表示年,后2位表示月。[問題]用等價類劃分法設計測試用例,來測試程序的“日期檢查功能”。輸入等價類有效等價類無效等價類日期的類型及長度(1)6位數字字符(2)有非數字字符(3)少于6位數字字符(4)多于6位數字字符年份范圍(5)在1990-2049之間(6)小于1990(7)大于2049月份范圍(8)在01~12之間(9)等于00(10)大于12劃分等價類:表7-11日期的等價類劃分例2:日期檢查設計有效等價類的測試用例:測試用例編號測試用例內容覆蓋的等價類U1200711(1)(5)(8)表7-12日期的有效等價類測試用例例2:日期檢查設計無效等價類的測試用例:測試用例編號測試用例內容覆蓋的等價類U107June(2)U220076(3)U32007011(4)U4198912(6)U5205401(7)U6200700(8)U7200713(10)表7-13日期的無效等價類測試用例61確定等價類的原則小結(1)如果輸入條件規定了取值范圍,或者值的個數,則可以確定一個有效等價類和兩個無效等價類。(2)如果輸入條件規定了輸入值的集合,或者是規定了“必須如何”的條件,則可以確立一個有效等價類和一個無效等價類。(3)如果輸入條件是一個布爾量,則可以確立一個有效等價類和一個無效等價類。(4)如果規定了輸入數據必須遵守的規則,則可以確立一個有效等價類(遵守規則的數據)和若干無效等價類(從不同角度違反規則的數據)。62選擇測試用例的原則:設計盡可能少的測試用例,覆蓋所有的有效等價類。等價類劃分針對每一個無效等價類,設計一個測試用例來覆蓋它。(5)如果確知以劃分的等價類中的各元素在程序中的處理方式不同,則應進一步劃分成更小的等價類。63(2)邊界值法(BoundaryValueAnalysis)

把測試值選在等價類的邊界上。錯誤可能出現在輸入變量的極值附近。功能測試bacd圖7-7邊界值測試法例如,測試

的一段程序。憑直覺等價區間應是(0,

1)和(1,

+∞)。可取x=0.5以及x=2.0進行等價測試,再取

x=0以及x=1進行邊界值測試。

確定邊界通常輸入和輸出等價類的邊界,是重點測試的邊界情況。選取正好等于、剛剛大于、剛剛小于邊界的值作為測試數據,而不是選取等價類中的典型值或任意值作為測試數據。65邊界值的選取

5個元素情況:

最小值,略高于最小值正常值略低于最大值,最大值

n個變量,有4n+1個測試用例abcd圖7-8邊界值測試法abcd在5個元素基礎上增如:略高于最大值略低于最小值

常見的邊界值通常情況下,軟件測試所包含的邊界檢驗有幾種類型:數字、字符、位置、重量、大小、速度、方位、尺寸、空間等。相應地,以上類型的邊界值應該在:最大/最小、首位/末位、上/下、最快/最慢、最高/最低、

最短/最長、空/滿等情況下。對16-bit的整數而言,32767和-32768是邊界屏幕上光標在最左上、最右下位置數組元素的第一個和最后一個報表的第一行和最后一行循環的第0次、第1次和倒數第2次、最后1次邊界值分析的原則原則1:如果輸入條件規定了值的范圍,則應取剛達到這個范圍的邊界的值,以及剛剛超越這個范圍邊界的值作為測試輸入數據。例如:如果程序的規格說明中規定“重量在10公斤至50公斤范圍內的郵件,其郵費計算公式為……”。

作為測試用例,應取10、50、10.01、49.99、9.99及50.01等。原則2:如果輸入條件規定了值的個數,則用最大個數、最小個數、比最小個數少1,比最大個數多1的數據作為測試數據。比如,一個輸入文件應包括1-255個記錄,則測試用例可取1和255,還應取0及256等。原則3:如果程序的規格說明給出的輸入域或輸出域是有序集合,則應選取集合的第一個元素和最后一個元素作為測試用例。原則4:將原則1和原則2應用于輸出條件,即設計測試用例使輸出值達到邊界值及其左右的值。

例如,某程序的規格說明要求計算出“每月保險金扣除額為0至1165.25元”。其測試用例可取:0.00及1165.24、還可取:-0.01及1165.26等。再如,某程序要求每次”最少顯示1條、最多顯示4條查詢結果”。其測試用例包括1和4,還應包括0和5等。[例1]NextDate()序號MonthDayYear期望輸出121420002000-2-15221419961996-2-15321420022002-2-15422820002000-2-29522819961996-2-29622820022002-3-1722920002000-3-1822919961996-3-192292002無效的輸入日期102302000無效的輸入日期112301996無效的輸入日期122302002無效的輸入日期序號MonthDayYear期望輸出1361420002000-6-151461419961996-6-151561420022002-6-151662920002000-6-301762919961996-6-301862920022002-6-301963020002000-7-12063019961996-7-12163020022002-7-1226312000無效的輸入日期236311996無效的輸入日期246312002無效的輸入日期序號MonthDayYear期望輸出2581420002000-8-152681419961996-8-152781420022002-8-152882920002000-8-302982919961996-8-303082920022002-8-303183020002000-8-313283019961996-8-313383020022002-8-313483120002000-9-13583119961996-9-13683120022002-9-1序號MonthDayYear期望輸出37123120002001-1-138123119961997-1-139123120022003-1效的輸入日期4113301996無效的輸入日期4213312002無效的輸入日期43302000無效的輸入日期443321996無效的輸入日期459140無效的輸入日期46000無效的輸入日期47-1142000無效的輸入日期4811-12002無效的輸入日期在NextDate()函數中:1≤month≤121≤day≤311912≤year≤2050[例1]NextDate()另一種更詳盡的劃分方法D1={1≤date<lastdayofthemonth}D2={lastdayofthemonth}D3={Dec.31}M1={30-daymonths}M2={31-daymonths}M3={Feb.}Y1={2000}Y2={leapyear}Y3={notleapyear}72

檢查條件所導致的分支是否正確;

檢查循環實際執行的次數是否正確;

檢查不存在或空的輸入;

檢查單個輸入項;

檢查一個正好填滿了的數組等等。

觀點:大部分錯誤都出現在邊界上例2測試代碼的邊界情況73

模擬fgets(從文件中獲取字符串函數),讀入一些字符,直到迂到一個換行或緩沖區滿了。

inti;

chars[MAX];

for(i=0;(s[i]=getchar())!=‘\n’&&i<MAX-1;++i)

s[--i]=‘\0’;

第1個邊界測試:

讀入一個空行,一開始就是個換行符.結果如何?74循環在第1次重復時就結束了,這時i=0最后一行代碼i值減小到-1,并把一個空字節寫入s[-1]在數組開始之前,通過邊界測試發現錯誤重寫循環,用字符填充數組的方法:for(i=0;i<MAX-1;i++)if((s[i]=getchar())==‘\n’)break;

s[i]=‘\0’;

75

重復前面邊界測試,對只有一個換行字符的行,程序能正確處理。i=0,第1個輸入字符跳出循環,而‘\0’被存入s[0]中。對一個或兩個字符之后是換行符的輸入做類似檢查,在接近邊界處循環也能工作。

76

第2個邊界測試:

輸入中有一個很長的行或其中無換行符,

保證i總是小于MAX-1的檢測,能處理這個問題。

若輸入為空,對getchar的第1次調用就返回EOF,必須增加新條件:

inti;chars[MAX]for(i=0;i<MAX-1;i++)if((s[i]=getchar())==‘\n’||s[i]==EOF)break;

s[i]=‘\0’;

77第3個邊界測試:

檢查輸入即數組接近滿了,正好滿了,超過的情況。

若換行符正好在這個時候出現,若在‘\n’出現前緩沖區己滿,程序做些什么?

78基本思想:列舉出程序中所有可能有的錯誤和容易發生錯誤的特殊情況,根據它們選擇測試用例。利用經驗確定程序中容易出錯的地方。(3)錯誤推測法功能測試例對排序程序進行測試

邊界值法

#輸入表為空

#輸入表中僅有一個數據

#輸入表為滿表錯誤猜測法

#輸入表已排好序

#輸入表的排序與要求的順序相反

#輸入表中的所有數據全部相同79(4)因果圖(Cause-EffectGraphing)

借助圖形來設計測試用例的一種方法.功能測試因果圖方法最終生成的就是判定表。用于被測程序具有多種輸入條件,而輸出又依賴于輸入條件的各種組合情況.80因果圖中的基本符號Ci表示原因,Ei表示結果。各結點表示狀態,“0”---狀態不出現,

“1”---狀態出現.CiEi恒等CiEi非C1EiC2或C1EiC2與圖7-9因果圖基本符號81表示約束條件的因果圖符號EabE(互斥、排他)IabI(包含、或)cOabO(唯一)aRbR(要求)MabM(屏蔽)圖7-10表示約束條件的因果圖符號82例利用因果圖設計測試用例飲料自動售貨機軟件測試用例。

售1杯飲料單價5角.若投入5角錢或1元錢的硬幣,按下橙汁或啤酒的按鈕,則飲料流出.若有零錢找,則顯示零錢找完的紅燈滅,并在送出飲料的同時退還5角硬幣。若售貨機沒有零錢找,則顯示一個零錢找完的紅燈亮,這時若投入1元錢硬幣并按下按鈕,則不僅不送出飲料而且退出1元錢;83自動售貨機軟件測試用例

中間狀態11.投入1元硬幣且按下飲料按鈕12.按下橙汁或啤酒按鈕13.應當找5角錢且售貨機有零錢找14.錢已付清原因

結果1.售貨機有零錢找21.售貨機零錢找完紅燈亮2.投入1元硬幣22.退還1元硬幣3.投入5角硬幣23.退還5角硬幣4.按下橙汁按鈕24.送出橙汁飲料5.按下啤酒按鈕25.送出啤酒飲料84按下橙汁按鈕12345售貨機有零錢找投入1元硬幣投入5角硬幣按下啤酒按鈕2122232425售貨機零錢找完紅燈亮退還1元硬幣找回5角硬幣送出橙汁飲料送出啤酒飲料E11131412E該找5角可找5角按下按鈕錢已付清圖7-11自動售貨機的因果圖85

因果圖方法生成測試用例的步驟:a.找出軟件規格說明中的原因(輸入條件或輸入條件的等價類),及由原因引起的結果(即輸出條件動作).b.分析軟件規格說明描述中的語義,找出原因與結果之間,原因與原因之間對應的是什么關系?根據這些關系畫出因果圖.86因果圖方法生成測試用例的步驟:c.由于語法或環境限制,有些原因與原因之間,

原因與結果之間的組合情況不可能出現。為表明這些特殊情況,在因果圖上用一些記號標明約束或限制條件.d.把因果圖轉換成判定表.e.

把判定表的每一列拿出來作為依據,設計測試用例.自動售貨機轉換成判定表:表7-14自動售貨機判定表88(5)綜合策略的測試方法Myers提出了使用各種測試方法的綜合策略:

任何情況下都必須使用邊界值分析方法。必要時用等價類劃分法補充一些測試用例.

用錯誤推測法再追加一些測試用例.

如果程序的功能說明中含有輸入條件的組合情況,則一開始就可選用因果圖法.

測試用例的邏輯覆蓋程度要達到要求的覆蓋標準.

89(6)窮舉測試

對于黑盒測試來講,最簡單程序,設A、B、C都是整形變量,在字長為32位的計算機上運行,則輸入數據的可能性有232x232=264種,如果這個程序執行一次需1ms,一年工作365×24小時,則所有的組合完全測試一次將需要5億年。是不可能的ProgramABCc因此,測試人員只能在大量可能的數據中,選取其中一部分作為測試用例。90

檢查軟件在異常條件下的行為。容錯性好的軟件能確保系統不發生無法意料的事故。

(7)非功能測試--容錯性測試比較溫柔的容錯性測試通常構造一些不合理的輸入來引誘軟件出錯,例如:

(1)輸入錯誤的數據類型。

(2)輸入定義域之外的數值。粗暴一些的容錯性測試俗稱“大猩猩”測試,可使出任何招術。91

性能與效率測試:測試軟件的運行速度和對資源的利用率。有時關心測試的“絕對值”,如數據輸送速率是每秒多少比特。有時關心測試的“相對值”,如某個軟件比另一個軟件快多少倍。(7)非功能測試--性能與效率測試

在獲取測試的“絕對值”時,要充分考慮并記錄運行環境對測試的影響.例如計算機主頻,總線結構和外部設備都可能影響軟件的運行速度;若與多個計算機共享資源,軟件運行可能慢得像蝸牛爬行。92

在獲取測試的“相對值”時,要確保被測試的幾個軟件運行于完全一致的環境中。硬件環境的一致性比較容易做到(用同一臺計算機即可)。軟件環境的因素較多:操作系統,程序設計語言,編譯系統等,對軟件的性能都會產生較大的影響。如果是比較幾個算法的性能,就要求編程語言和編譯器也完全一致。93

性能與效率測試中很重要的一項是

極限測試

因為很多軟件系統會在極限測試中崩潰。例如,連續不停地向服務器發請求,測試服務器是否會陷入死鎖狀態不能自拔;給程序輸入特別大的數據,看看它是否吃得消。

94

易用性測試沒有一個量化的指標,主觀性較強。[Cusumano

1995]一般認為,如果用戶不翻閱手冊就能使用軟件,那么表明這個軟件具有較好的易用性。(7)非功能測試--易用性測試95

文檔測試主要檢查文檔的正確性、完備性和可理解性。

文檔測試軟件=程序十文檔十數據

正確性是指不要把軟件的功能和操作寫錯,也不允許文檔內容前后矛盾。

完備性是指文檔不可以“虎頭蛇尾”,更不許漏掉關鍵內容。文檔中很多內容對開發者可能是“顯然”的,但對用戶不見得都是“顯然”的。

文檔不可以寫成散文、詩歌或者偵探等小說,要讓用戶看得懂,能理解。96小結

功能測試的方法:

等價類分析邊界值分析錯誤推測法因果圖法97

功能性測試方法優點:與軟件如何實現無關,如果實現發生變化,測試用例仍然有用;測試用例開發可以與程序的實現并行進行.缺點:測試用例之間可能存在嚴重的冗余;存在測試的不徹底性.小結功能測試只能觀察軟件的外部表現,滿足用戶的功能需求。小結即使軟件的輸入輸出都是正確的,卻并不能說明軟件就是正確的。因為程序有可能用錯誤的運算方式得出正確的結果,例如“負負得正,錯錯得對”,只有白盒測試才能發現真正的原因。白盒測試能發現程序里的隱患,象內存泄漏、誤差累計問題。在這方面,黑盒測試存在嚴重的不足。2)結構測試(白盒測試)

白盒測試白盒測試又稱覆蓋測試。測試軟件產品的內部邏輯結構,是否符合設計規格要求。白盒測試考慮測試用例對程序內部邏輯的覆蓋程度:最徹底的白盒法是覆蓋程序中的每一條路徑,但是由于程序中一般含有循環,所以路徑的數目極大,要執行每一條路徑是不可能的,只能希望覆蓋的程度盡可能高些。對一個具有多重選擇和循環嵌套的程序,不同的路徑數目可能是天文數字。例:某個小程序的流程圖,包括了一個執行20次的循環。包含的不同執行路徑數達520條,對每一條路徑進行測試需要1毫秒,假定一年工作365×24小時,要把所有路徑測試完,需3170年。圖7-12執行20次循環程序的流程圖邏輯覆蓋:語句覆蓋判定覆蓋(分支覆蓋)條件覆蓋判定/條件覆蓋條件組合覆蓋控制結構覆蓋:基本路徑測試循環測試條件測試數據流測試為了衡量測試的覆蓋程度,下面給出了從低到高的覆蓋方法:102對模塊的每一個獨立的執行路徑至少測試一次。

對所有的邏輯判定的每一個分支,(真與假)都至少測試一次。

在循環的邊界和運行界限內執行循環體。這些方法主要對程序模塊進行如下的檢查:測試內部數據結構的有效性。(1)語句覆蓋(StatementCoverage)被測程序中的每條語句至少應該執行一次語句覆蓋是最弱的測試標準。例1:floatexample(floatA,B,X){if(A>1&&B==0)X=X/A;if(A==2||X>1)X=X+1;}測試用例:圖7-13例1程序流程圖A>1&&B=0aA=2‖X>1X=X+1bdceX=X/AYYNNA=2,B=0,X=3語句覆蓋的缺點語句覆蓋是最弱邏輯覆蓋如果第一個條件語句中的“&&”錯誤的寫成“||”,上面的測試用例無法發現這個錯誤;如果第三個條件語句中x>1誤寫成x>0,這個測試用例也不能暴露它;沿著路徑abd執行時,x的值應該保持不變,如果這一方面有錯誤,上述測試數據也不能發現它。語句覆蓋的例2voidDoWork(intx,inty,intz){

intk=0,j=0;if((x>3)&&(z<10)){k=x*y-1;//語句塊1j=sqrt(k);}if((x==4)||(y>5)){j=x*y+10;//語句塊2}j=j%3;//語句塊3}測試用例:x=4,y=5,z=5圖7-13例2程序流程圖(2)判定(分支)覆蓋執行足夠的測試用例,使得程序中的每一個分支至少都通過一次。測試用例:A=3,B=0,X=1(沿路徑acd執行)

A=2,B=1,X=3(沿路徑abe執行)圖7-13例1程序流程圖A>1&&B=0aA=2‖X>1X=X+1bdceX=X/AYYNN判定(分支)覆蓋測試用例:但是,兩個測試用例雖然能夠滿足條件覆蓋的要求,但是也不能對判斷條件進行檢查。如把條件y>5錯誤的寫成y<5,上面的測試用例同樣滿足了分支覆蓋。x=4,y=5,z=5x=2,y=5,z=5圖7-13例2程序流程圖(3)條件覆蓋一個判定中往往包含了若干個條件;例如:判定(A>1)AND(B=0)包含了兩個條件:A>1以及B=0“條件覆蓋”,執行足夠的測試用例,使得判定中的每個條件獲得各種可能的結果。條件覆蓋

例中

的程序有四個條件:

A>1、B=0、A=2、X>1

圖7-13例1程序流程圖A>1&&B=0aA=2‖X>1X=X+1bdceX=X/AYYNN

在a點的條件有:

A>1、A≤1、B=0、B≠0

在b點條件有:A=2、A≠2、X>1、X≤1 現在只需設計以下兩個測試用例就可滿足這一標準:A=2,B=0,X=4

(沿路徑ace執行);A=1,B=1,X=1

(沿路徑abd執行)。

條件覆蓋對例中的所有條件取值加以標記。對于第一個判斷:條件x>3取真值為T1,取假值為-T1條件z<10取真值為T2,取假值為-T2圖7-13例2程序流程圖對于第二個判斷:條件x=4取真值為T3,取假值為-T3條件y>5取真值為T4,取假值為-T4條件覆蓋表7-15條件覆蓋測試用例1

測試用例

通過路徑

條件取值

覆蓋分支x=4、y=6、z=5abdT1、T2、T3、T4

bdx=2、y=5、z=5ace-T1、T2、-T3、-T4cex=4、y=5、z=15acdT1、-T2、T3、-T4cd上面的測試用例不但覆蓋了所有分支的真假兩個分支,而且覆蓋了判斷中的所有條件的可能值。

條件覆蓋“條件覆蓋”通常比“分支覆蓋”強,因為它使一個判定中的每一個條件都取到了兩個不同的結果,而分支覆蓋則不保證這一點。“條件覆蓋”并不包含“分支覆蓋”,如對語句“if(A&&B)S;”設計測試用例使其滿足條件覆蓋,即“使A為真并使B為假”、“使A為假且B為真”,但是它們都未能使語句S得以執行。

如設計了下面的測試用例,則雖然滿足了條件覆蓋,但只覆蓋了第一個條件的取假分支和第二個條件的取真分支,不滿足分支覆蓋的要求。測試用例

通過路徑

條件取值覆蓋分支x=2、y=6、z=5acd-T1、T2、-T3、T4cdx=4、y=5、z=15acdT1、-T2、T3、-T4cd表7-15條件覆蓋測試用例2圖7-13例2程序流程圖(4)分支/條件覆蓋分支/條件覆蓋是:執行足夠的測試用例,使得分支中每個條件取到各種可能的值,并使每個分支取到各種可能的結果。對前面的兩個例子: ①A=2,B=0,X=4(沿ace路)

②A=1,B=1,X=1(沿abd路徑)

是滿足這一標準的。圖7-13例1程序流程圖A>1&&B=0aA=2‖X>1X=X+1bdceX=X/AYYNN分支/條件覆蓋

對該例,根據定義只需設計以下兩個測試用例便可以覆蓋8個條件值以及4個判斷分支。

測試用例通過路徑條件取值覆蓋分支x=4、y=6、z=5abdT1、T2、T3、T4bdx=2、y=5、z=11ace-T1、-T2、-T3、-T4ce表7-15分支/條件覆蓋測試用例圖7-13例2程序流程圖分支/條件覆蓋分支/條件覆蓋從表面來看,它測試了所有條件的取值,但是實際上某些條件掩蓋了另一些條件。如:

對于條件表達式(x>3)&&(z<10)來說,必須兩個條件都滿足才能確定表達式為真。如果(x>3)為假,則一般的編譯器不再判斷是否z<10了。

對于表達式(x==4)||(y>5)來說,若x==4測試結果為真,就認為表達式的結果為真,這時不再檢查(y>5)條件了。因此,采用分支/條件覆蓋,邏輯表達式中的錯誤不一定能夠查出來了。(5)條件組合覆蓋針對上述問題,提出“條件組合覆蓋”方法。含義:執行足夠的例子,使得每個判定中條件的各種可能組合都至少出現一次。顯然,滿足“條件組合覆蓋”的測試用例是一定滿足“分支覆蓋”、“條件覆蓋”和“分支/條件覆蓋”的。條件組合覆蓋A>1,B=0

A≤1,B=0 A=2,X>1 A≠2,X>1圖7-13例1程序流程圖A>1&&B=0aA=2‖X>1X=X+1bdceX=X/AYYNN

后四種情況是第二個if語句的條件組合,而X的值在該語句之前是要經過計算的,所以還必須根據程序的邏輯推算出在程序的入口點X的輸入值應是什么。

A>1,B≠0A≤1,B≠0 A=2,X≤1A≠2,X≤1

該圖可出現下面8種條件組合:

下面設計的四個例子可以使上述8種條件組合至少出現一次:

①A=2,B=0,X=4,ace

使、兩種情況出現;圖7-13例1程序流程圖A>1&&B=0aA=2‖X>1X=X+1bdceX=X/AYYNN1條件組合覆蓋5263748

②A=2,B=1,X=1,abe

使、兩種情況出現;④A=1,B=1,X=1,abd

使、兩種情況出現。③A=1,B=0,X=2,abe

使、兩種情況出現;條件組合覆蓋上面四個例子雖然滿足條件組合覆蓋,但并不能覆蓋程序中的每一條路徑,例如路徑

acd就沒有執行,因此,條件組合覆蓋標準仍然是不徹底。圖7-14例1程序流程圖A>1&&B=0aA=2‖X>1X=X+1bdceX=X/AYYNN

1、x>3,z<10記做T1T2,第一個判斷的取真分支2、x>3,z>=10記做T1-T2,第一個判斷的取假分支3、x<=3,z<10記做-T1T2,第一個判斷的取假分支4、x<=3,z>=10記做-T1-T2,第一個判斷的取假分支5、x=4,y>5記做T3T4,第二個判斷的取真分支6、x=4,y<=5記做T3-T4,第二個判斷的取真分支7、x!=4,y>5記做-T3T4,第二個判斷的取真分支8、x!=4,y<=5記做-T3-T4,第二個判斷的取假分支現對例中各個判斷取條件組合:圖7-13例2程序流程圖條件組合覆蓋根據定義取4個測試用例,就可以覆蓋上面8種條件取值的組合。測試用例如下表:測試用例通過路徑條件取值覆蓋組合號x=4、y=6、z=5abdT1、T2、T3、T41和5x=4、y=5、z=15acdT1、-T2、T3、-T42和6x=2、y=6、z=5acd-T1、T2、-T3、T43和7x=2、y=5、z=15ace-T1、-T2、-T3、-T44和8上面的測試用例覆蓋了所有條件的可能取值的組合,覆蓋了所有判斷的可取分支,但是卻丟失了一條路徑abe。表7-16條件組合覆蓋測試用例發現錯誤的能力弱強語句覆蓋每條語句至少執行一次判定覆蓋每一判定的每個分支至少執行一次條件覆蓋每一判定中的每個條件,分別按“真”、“假”至少各執行一次判定/條件覆蓋同時滿足判定覆蓋和條件覆蓋的要求條件組合覆蓋求出判定中所有條件的各種可能組合值,每一可能的條件組合至少執行一次表7-17五種覆蓋標準的對比1五種覆蓋標準的對比覆蓋標準程序結構舉例測試用例應滿足的條件語句覆蓋AB=T判定覆蓋AB=TAB=F表7-17五種覆蓋標準的對比2覆蓋標準程序結構舉例測試用例應滿足的條件條件覆蓋A=T,A=FB=T,B=F判定/條件覆蓋AB=T,AB=FA=T,A=FB=T,B=F條件組合覆蓋A=TB=TA=TB=FA=FB=TA=FB=F表7-17五種覆蓋標準的對比3路徑測試:設計足夠多的測試用例,覆蓋被測試對象中的所有可能路徑。下面的測試用例則可對程序進行全部的路徑覆蓋。測試用例通過路徑A=2、B=0、X=3aceA=1、B=0、X=1abdA=2、B=1、X=1abeA=3、B=0、X=1acd

圖7-13例1程序流程圖A>1&&B=0aA=2‖X>1X=X+1bdceX=X/AYYNN表7-18路徑測試1(6)路徑測試路徑測試下面的測試用例,則可對該圖進行全部的路徑覆蓋。測試用例通過路徑覆蓋條件x=4、y=6、z=5abdT1、T2、T3、T4x=4、y=5、z=15acdT1、-T2、T3、-T4x=2、y=5、z=15ace-T1、-T2、-T3、T4x=5、y=5、z=5abeT1、T2、-T3、-T4表7-18路徑測試2圖7-13例2程序流程圖

基本路徑測試:將程序流程圖轉換為程序圖,確定基本可執行路徑集合,計算環形復雜度V(G),確定獨立路徑(一條獨立路徑是指,和其他的獨立路徑相比,至少引入一個新處理語句或一個新判斷的程序通路)。V(G)值正好等于該程序的獨立路徑的條數。導出測試用例:根據復雜度和程序結構設計用例數據輸入和預期結果。測試用例,確保基本路徑集中的每一條獨立路徑的執行。

程序圖(流圖)的符號順序結構if結構case結構while結構until結構圖中的每一個圓稱為流圖的結點,代表一條或多條語句。流圖中的箭頭稱為邊或連接,代表控制流。圖7-14程序圖符號程序流程圖流圖程序流程圖流圖圖7-15程序流程圖和程序圖對應關系流圖如果判斷中的條件表達式是由一個或多個邏輯運算符(OR,AND,NAND,NOR)連接的復合條件表達式,則需要改為一系列只有單條件的嵌套的判斷。例如:

1,2ifaorb3x4else5y對應的程序圖為:圖7-16有邏輯運算符程序圖

91762,38910114,5

76

231

8

41110區域:由邊和節點封閉起來的。計算區域:不要忘記區域外的部分。待測試程序用流圖表示的待測試程序

5

節點邊區域圖7-17程序流程圖和程序圖獨立路徑獨立路徑:至少沿一條新的邊移動的路徑路徑1:1-11路徑2:1-2-3-4-5-10-1-11路徑3:1-2-3-6-8-9-10-1-11路徑4:1-2-3-6-7-9-10-1-111

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯系上傳者。文件的所有權益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
  • 4. 未經權益所有人同意不得將文件中的內容挪作商業或盈利用途。
  • 5. 人人文庫網僅提供信息存儲空間,僅對用戶上傳內容的表現方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
  • 6. 下載文件中如有侵權或不適當內容,請與我們聯系,我們立即糾正。
  • 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論