《白盒測試及例題》課件_第1頁
《白盒測試及例題》課件_第2頁
《白盒測試及例題》課件_第3頁
《白盒測試及例題》課件_第4頁
《白盒測試及例題》課件_第5頁
已閱讀5頁,還剩109頁未讀, 繼續(xù)免費閱讀

下載本文檔

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

文檔簡介

白盒測試白盒測試白盒測試概念測試覆蓋標準邏輯驅動測試根本路徑測試白盒測試概念白盒測試也稱結構測試或邏輯驅動測試,是一種測試用例設計方法,它從程序的控制結構導出測試用例。〔測試用例由測試輸入數據以及與之對應的輸出結果組成。測試用例設計的好壞直接決定了測試的效果和結果。所以說在軟件測試活動中最關鍵的步驟就是設計有效的測試用例?!嘲缀袦y試使用被測單元內部如何工作的信息,允許測試人員對程序內部邏輯結構及有關信息來設計和選擇測試用例,對程序的邏輯路徑進行測試。基于一個應用代碼的內部邏輯知識,測試是基于覆蓋全部代碼、分支、路徑、條件。白盒測試的主要目的:保證一個模塊中的所有獨立路徑至少被執(zhí)行一次;對所有的邏輯值均需要測試真、假兩個分支;在上下邊界及可操作范圍內運行所有循環(huán);檢查內部數據結構以確保其有效性。測試覆蓋標準白盒法特點:以程序的內部邏輯為根底設計測試用例,所以又稱為邏輯覆蓋法。應用白盒法時,手頭必須有程序的規(guī)格說明以及程序清單。 白盒法考慮的是測試用例對程序內部邏輯的覆蓋程度。最徹底的白盒法是覆蓋程序中的每一條路徑,但是由于程序中一般含有循環(huán),所以路徑的數目極大,要執(zhí)行每一條路徑是不可能的,只能希望覆蓋的程度盡可能高些。測試覆蓋標準測試覆蓋標準上頁小程序的流程圖,其中包括了一個執(zhí)行達20次的循環(huán)。那么它所包含的不同執(zhí)行路徑數高達520〔=1013〕條,假設要對它進行窮舉測試,覆蓋所有的路徑。假使測試程序對每一條路徑進行測試需要1毫秒,同樣假定一天工作24小時,一年工作365天,那么要想把如下圖的小程序的所有路徑測試完,那么需要3170年。測試覆蓋標準為了衡量測試的覆蓋程度,需要建立一些標準,目前常用的一些覆蓋標準從低到高分別是:語句覆蓋:是一個比較弱的測試標準,它的含義是:選擇足夠的測試用例,使得程序中每個語句至少都能被執(zhí)行一次。它是最弱的邏輯覆蓋,效果有限,必須與其它方法交互使用。測試覆蓋標準判定覆蓋〔也稱為分支覆蓋〕:執(zhí)行足夠的測試用例,使得程序中的每一個分支至少都通過一次。判定覆蓋只比語句覆蓋稍強一些,但實際效果說明,只是判定覆蓋,還不能保證一定能查出在判斷的條件中存在的錯誤。因此,還需要更強的邏輯覆蓋準那么去檢驗判斷內部條件。條件覆蓋:執(zhí)行足夠的測試用例,使程序中每個判斷的每個條件的每個可能取值至少執(zhí)行一次;條件覆蓋深入到判定中的每個條件,但可能不能滿足判定覆蓋的要求。測試覆蓋標準判定/條件覆蓋:執(zhí)行足夠的測試用例,使得判定中每個條件取到各種可能的值,并使每個判定取到各種可能的結果。判定/條件覆蓋有缺陷。從外表上來看,它測試了所有條件的取值。但是事實并非如此。往往某些條件掩蓋了另一些條件。會遺漏某些條件取值錯誤的情況。為徹底地檢查所有條件的取值,需要將判定語句中給出的復合條件表達式進行分解,形成由多個根本判定嵌套的流程圖。這樣就可以有效地檢查所有的條件是否正確了。測試覆蓋標準條件組合覆蓋:執(zhí)行足夠的例子,使得每個判定中條件的各種可能組合都至少出現一次。這是一種相當強的覆蓋準那么,可以有效地檢查各種可能的條件取值的組合是否正確。它不但可覆蓋所有條件的可能取值的組合,還可覆蓋所有判斷的可取分支,但可能有的路徑會遺漏掉。測試還不完全。白盒測試的主要方法:邏輯驅動測試語句覆蓋:語句覆蓋就是設計假設干個測試用例,運行被測試程序,使得每一條可執(zhí)行語句至少執(zhí)行一次;判定覆蓋〔也稱為分支覆蓋〕:設計假設干個測試用例,運行所測程序,使程序中每個判斷的取真分支和取假分支至少執(zhí)行一次;條件覆蓋:設計足夠多的測試用例,運行所測程序,使程序中每個判斷的每個條件的每個可能取值至少執(zhí)行一次;判定/條件覆蓋:設計足夠多的測試用例,運行所測程序,使程序中每個判斷的每個條件的所有可能取值至少執(zhí)行一次,并且每個可能的判斷結果也至少執(zhí)行一次,換句話說,即是要求各個判斷的所有可能的條件取值組合至少執(zhí)行一次;白盒測試的主要方法:條件組合覆蓋:設計足夠多的測試用例,運行所測程序,使程序中每個判斷的所有可能的條件取值組合至少執(zhí)行一次;根本路徑測試設計足夠多的測試用例,運行所測程序,要覆蓋程序中所有可能的路徑。這是最強的覆蓋準那么。但在路徑數目很大時,真正做到完全覆蓋是很困難的,必須把覆蓋路徑數目壓縮到一定限度。語句覆蓋語句覆蓋〞是一個比較弱的測試標準,它的含義是:選擇足夠的測試用例,使得程序中每個語句至少都能被執(zhí)行一次。如,例1:PROCEDURE

M(VARA,B,X:REAL);

BEGINIF(A>1)AND(B=0)

THENX:=X/A;IF(A=2)OR(X>1)

THENX:=X+1;END.語句覆蓋 為使程序中每個語句至少執(zhí)行一次,只需設計一個能通過路徑ace的例子就可以了,例如選擇輸入數據為: A=2,B=0,X=3就可到達“語句覆蓋〞標準。語句覆蓋語句覆蓋 從上例可看出,語句覆蓋實際上是很弱的,如果第一個條件語句中的AND錯誤地編寫成OR,上面的測試用例是不能發(fā)現這個錯誤的;又如第三個條件語句中X>1誤寫成X>0,這個測試用例也不能暴露它,此外,沿著路徑abd執(zhí)行時,X的值應該保持不變,如果這一方面有錯誤,上述測試數據也不能發(fā)現它們。分支覆蓋比“語句覆蓋〞稍強的覆蓋標準是“分支覆蓋〞(或稱分支覆蓋)標準。含義是:執(zhí)行足夠的測試用例,使得程序中的每一個分支至少都通過一次。分支覆蓋 對例1的程序,如果設計兩個例子,使它們能通過路徑ace和abd,或者通過路徑acd和abe,就可到達“判定覆蓋〞標準,為此,可以選擇輸入數據為:①A=3,B=0,X=1(沿路徑acd執(zhí)行);

②A=2,B=1,X=3(沿路徑abe執(zhí)行)

分支覆蓋判定覆蓋判定覆蓋A=3,B=0,X=1(沿路徑acd執(zhí)行)

A=2,B=1,X=3(沿路徑abe執(zhí)行)分支覆蓋 程序中含有判定的語句包括IF-THEN-ELSE、DO-WHILE、REPEAT-UNTIL等,除了雙值的判定語句外,還有多值的判定語句,如PASCAL中的CASE語句、FORTRAN中帶有三個分支的IF語句等。所以“分支覆蓋〞更一般的含義是:使得每一個分支獲得每一種可能的結果?!胺种Ц采w〞比“語句覆蓋〞嚴格,因為如果每個分支都執(zhí)行過了,那么每個語句也就執(zhí)行過了。但是,“分支覆蓋〞還是很不夠的,例如例1兩個測試用例未能檢查沿著路徑abd執(zhí)行時,X的值是否保持不變。條件覆蓋一個判定中往往包含了假設干個條件,如例1的程序中,判定(A>1)AND(B=0)包含了兩個條件:A>1以及B=0,所以可引進一個更強的覆蓋標準——“條件覆蓋〞。“條件覆蓋〞的含義是:執(zhí)行足夠的測試用例,使得判定中的每個條件獲得各種可能的結果。條件覆蓋例1的程序有四個條件:

A>1、B=0、A=2、X>1為了到達“條件覆蓋〞標準,需要執(zhí)行足夠的測試用例使得在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執(zhí)行);②A=1,B=1,X=1

(沿路徑abd執(zhí)行)。

條件覆蓋條件覆蓋條件覆蓋A=2,B=0,X=4

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

(沿路徑abd執(zhí)行)條件覆蓋“條件覆蓋〞通常比“分支覆蓋〞強,因為它使一個判定中的每一個條件都取到了兩個不同的結果,而判定覆蓋那么不保證這一點?!皸l件覆蓋〞并不包含“分支覆蓋〞,如對語句IF(AANDB)THENS設計測試用例使其滿足"條件覆蓋",即使A為真并使B為假,以及使A為假而且B為真,但是它們都未能使語句S得以執(zhí)行。分支/條件覆蓋針對上面的問題引出了另一種覆蓋標準——“分支/條件覆蓋〞,它的含義是:執(zhí)行足夠的測試用例,使得分支中每個條件取到各種可能的值,并使每個分支取到各種可能的結果。對例1的程序,前面的兩個例子 ①A=2,B=0,X=4(沿ace路)

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

是滿足這一標準的。條件組合覆蓋針對上述問題又提出了另一種標準——“條件組合覆蓋〞。它的含義是:執(zhí)行足夠的例子,使得每個判定中條件的各種可能組合都至少出現一次。顯然,滿足“條件組合覆蓋〞的測試用例是一定滿足“分支覆蓋〞、“條件覆蓋〞和“分支/條件覆蓋〞的。條件組合覆蓋 再看例1的程序,我們需要選擇適當的例子,使得下面8種條件組合都能夠出現:1〕A>1,B=0

2)

A>1,B≠03)

A≤1,B=0 4)A≤1,B≠05)A=2,X>1 6)A=2,X≤17)A≠2,X>1 8)A≠2,X≤1 5)、6)、7)、8〕四種情況是第二個IF語句的條件組合,而X的值在該語句之前是要經過計算的,所以還必須根據程序的邏輯推算出在程序的入口點X的輸入值應是什么。條件組合覆蓋

下面設計的四個例子可以使上述8種條件組合至少出現一次:①A=2,B=0,X=4 使1)、5)兩種情況出現;②A=2,B=1,X=1 使2)、6)兩種情況出現;③A=1,B=0,X=2 使3)、7)兩種情況出現;④A=1,B=1,X=1 使4)、8)兩種情況出現。條件組合覆蓋 上面四個例子雖然滿足條件組合覆蓋,但并不能覆蓋程序中的每一條路徑,例如路徑acd就沒有執(zhí)行,因此,條件組合覆蓋標準仍然是不徹底。路徑測試路徑測試就是設計足夠多的測試用例,覆蓋被測試對象中的所有可能路徑。對于例1,下面的測試用例那么可對程序進行全部的路徑覆蓋。測試用例通過路徑A=2、B=0、X=3aceA=1、B=0、X=1abdA=2、B=1、X=1abeA=3、B=0、X=1acd根本路徑測試 例1、例2都是很簡單的程序函數,只有四條路徑。但在實踐中,一個不太復雜的程序,其路徑都是一個龐大的數字,要在測試中覆蓋所有的路徑是不現實的。為了解決這一難題,只得把覆蓋的路徑數壓縮到一定限度內,例如,程序中的循環(huán)體只執(zhí)行一次。 下面介紹的根本路徑測試就是這樣一種測試方法,它在程序控制圖的根底上,通過分析控制構造的環(huán)行復雜性,導出根本可執(zhí)行路徑集合,從而設計測試用例的方法。設計出的測試用例要保證在測試中程序的每一個可執(zhí)行語句至少執(zhí)行一次。根本路徑測試前提條件 測試進入的前提條件是在測試人員已經對被測試對象有了一定的了解,根本上明確了被測試軟件的邏輯結構。測試過程 過程是通過針對程序邏輯結構設計和加載測試用例,驅動程序執(zhí)行,以對程序路徑進行測試。測試結果是分析實際的測試結果與預期的結果是否一致。根本路徑測試在程序控制流圖的根底上,通過分析控制構造的環(huán)路復雜性,導出根本可執(zhí)行路徑集合,從而設計測試用例。包括以下4個步驟和一個工具方法:程序的控制流圖:描述程序控制流的一種圖示方法。程序圈復雜度:McCabe復雜性度量。從程序的環(huán)路復雜性可導出程序根本路徑集合中的獨立路徑條數,這是確定程序中每個可執(zhí)行語句至少執(zhí)行一次所必須的測試用例數目的上界。導出測試用例:根據圈復雜度和程序結構設計用例數據輸入和預期結果。準備測試用例:確保根本路徑集中的每一條路徑的執(zhí)行。

根本路徑測試工具方法:圖形矩陣:是在根本路徑測試中起輔助作用的軟件工具,利用它可以實現自動地確定一個根本路徑集??刂屏鲌D的符號在介紹根本路徑方法之前,必須先介紹一種簡單的控制流表示方法,即流圖。流圖是對待測試程序過程處理的一種表示。流圖使用下面的符號描述邏輯控制流,每一種結構化構成元素有一個相應的流圖符號。順序結構if結構Case結構while結構until結構控制流圖流圖只有二種圖形符號圖中的每一個圓稱為流圖的結點,代表一條或多條語句。流圖中的箭頭稱為邊或連接,代表控制流。任何過程設計都要被翻譯成控制流圖??刂屏鲌D在將程序流程圖簡化成控制流圖時,應注意:在選擇或多分支結構中,分支的會聚處應有一個會聚結點。邊和結點圈定的區(qū)域叫做區(qū)域,當對區(qū)域計數時,圖形外的區(qū)域也應記為一個區(qū)域。如下頁圖所示控制流圖1762,38910114,5

76

231

8

4

511910節(jié)點邊區(qū)域區(qū)域:由邊和節(jié)點封閉起來的區(qū)域計算區(qū)域:不要忘記區(qū)域外的部分待測試程序用流圖表示的待測試程序控制流圖如果判斷中的條件表達式是由一個或多個邏輯運算符(OR,AND,NAND,NOR)連接的復合條件表達式,那么需要改為一系列只有單條件的嵌套的判斷。例如:1ifaorb2x3else4y對應的邏輯為:獨立路徑獨立路徑:至少沿一條新的邊移動的路徑1762,38910114,5路徑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-11對以上路徑的遍歷,就是至少一次地執(zhí)行了程序中的所有語句。根本路徑測試第一步:畫出控制流圖

流程圖用來描述程序控制結構。可將流程圖映射到一個相應的流圖(假設流程圖的菱形決定框中不包含復合條件)。在流圖中,每一個圓,稱為流圖的結點,代表一個或多個語句。一個處理方框序列和一個菱形決測框可被映射為一個結點,流圖中的箭頭,稱為邊或連接,代表控制流,類似于流程圖中的箭頭。一條邊必須終止于一個結點,即使該結點并不代表任何語句(例如:if-else-then結構)。由邊和結點限定的范圍稱為區(qū)域。計算區(qū)域時應包括圖外部的范圍。根本路徑測試畫出其程序流程圖和對應的控制流圖如下根本路徑測試-計算圈復雜度第二步:計算圈復雜度 圈復雜度是一種為程序邏輯復雜性提供定量測度的軟件度量,將該度量用于計算程序的根本的獨立路徑數目,為確保所有語句至少執(zhí)行一次的測試數量的上界。獨立路徑必須包含一條在定義之前不曾用到的邊。有以下三種方法計算圈復雜度:流圖中區(qū)域的數量對應于環(huán)型的復雜性;給定流圖G的圈復雜度V(G),定義為V(G)=E-N+2,E是流圖中邊的數量,N是流圖中結點的數量;給定流圖G的圈復雜度V(G),定義為V(G)=P+1,P是流圖G中判定結點的數量。根本路徑測試-計算圈復雜度對應上面圖中的圈復雜度,計算如下:流圖中有四個區(qū)域;V(G)=10條邊-8結點+2=4;V(G)=3個判定結點+1=4。根本路徑測試-導出測試用例第三步:導出測試用例根據上面的計算方法,可得出四個獨立的路徑。(一條獨立路徑是指,和其他的獨立路徑相比,至少引入一個新處理語句或一個新判斷的程序通路。V(G)值正好等于該程序的獨立路徑的條數。)路徑1:4-14路徑2:4-6-7-14路徑3:4-6-8-10-13-4-14路徑4:4-6-8-11-13-4-14

根據上面的獨立路徑,去設計輸入數據,使程序分別執(zhí)行到上面四條路徑。根本路徑測試-準備測試用例第四步:準備測試用例 為了確保根本路徑集中的每一條路徑的執(zhí)行,根據判斷結點給出的條件,選擇適當的數據以保證某一條路徑可以被測試到,滿足上面例子根本路徑集的測試用例是:根本路徑測試再舉例 例5:下例程序流程圖描述了最多輸入50個值〔以–1作為輸入結束標志〕,計算其中有效的學生分數的個數、總分數和平均值。開始i=1,n1=n2=0,sum=0Score[i]<>-1ANDn2<50n2=n2+1n1=n1+1,sum=sum+score[i]Score[i]>0ANDscore[i]<100i=i+1n1>0average=sum/n1average=–1返回FFFTTT12和345和6789101112123456789111012R1R2R3R4R5R6開始i=1,n1=n2=0,sum=0Score[i]<>-1ANDn2<50n2=n2+1n1=n1+1,sum=sum+score[i]Score[i]>0ANDscore[i]<100i=i+1n1>0average=sum/n1average=–1返回FFFTTT12和345和6789101112步驟1:導出過程的流圖。步驟2:確定環(huán)形復雜性度量V(G):1〕V(G)=6〔個區(qū)域〕2〕V(G)=E–N+2=16–12+2=6其中E為流圖中的邊數,N為結點數;3〕V(G)=P+1=5+1=6其中P為謂詞結點的個數。在流圖中,結點2、3、5、6、9是謂詞結點。根本路徑測試再舉例123456789111012R1R2R3R4R5R6根本路徑測試再舉例步驟3:確定根本路徑集合〔即獨立路徑集合〕。于是可確定6條獨立的路徑:路徑1:1-2-9-10-12路徑2:1-2-9-11-12路徑3:1-2-3-9-10-12路徑4:1-2-3-4-5-8-2…路徑5:1-2-3-4-5-6-8-2…路徑6:1-2-3-4-5-6-7-8-2…123456789111012R1R2R3R4R5R6根本路徑測試再舉例步驟4:為每一條獨立路徑各設計一組測試用例,以便強迫程序沿著該路徑至少執(zhí)行一次。1〕路徑1(1-2-9-10-12)的測試用例:score[k]=有效分數值,當k<i;score[i]=–1,2≤i≤50; 期望結果:根據輸入的有效分數算出正確的分數個數n1、總分sum和平均分average。開始i=1,n1=n2=0,sum=0Score[i]<>-1ANDn2<50n2=n2+1n1=n1+1,sum=sum+score[i]Score[i]>0ANDscore[i]<100i=i+1n1>0average=sum/n1average=–1返回FFFTTT12和345和6789101112根本路徑測試再舉例2〕路徑2(1-2-9-11-12)的測試用例:score[1]=–1;期望的結果:average=–1,其他量保持初值。3〕路徑3(1-2-3-9-10-12)的測試用例: 輸入多于50個有效分數,即試圖處理51個分數,要求前51個為有效分數; 期望結果:n1=50、且算出正確的總分和平均分。開始i=1,n1=n2=0,sum=0Score[i]<>-1ANDn2<50n2=n2+1n1=n1+1,sum=sum+score[i]Score[i]>0ANDscore[i]<100i=i+1n1>0average=sum/n1average=–1返回FFFTTT12和345和6789101112根本路徑測試再舉例4〕路徑4(1-2-3-4-5-8-2…)的測試用例:score[i]=有效分數,當i<50;score[k]<0,k<i; 期望結果:根據輸入的有效分數算出正確的分數個數n1、總分sum和平均分average。5〕路徑5的測試用例:score[i]=有效分數,當i<50;score[k]>100,k<i; 期望結果:根據輸入的有效分數算出正確的分數個數n1、總分sum和平均分average。開始i=1,n1=n2=0,sum=0Score[i]<>-1ANDn2<50n2=n2+1n1=n1+1,sum=sum+score[i]Score[i]>0ANDscore[i]<100i=i+1n1>0average=sum/n1average=–1返回FFFTTT12和345和6789101112根本路徑測試再舉例6〕路徑6(1-2-3-4-5-6-7-8-2…)的測試用例:score[i]=有效分數,當i<50; 期望結果:根據輸入的有效分數算出正確的分數個數n1、總分sum和平均分average。開始i=1,n1=n2=0,sum=0Score[i]<>-1ANDn2<50n2=n2+1n1=n1+1,sum=sum+score[i]Score[i]>0ANDscore[i]<100i=i+1n1>0average=sum/n1average=–1返回FFFTTT12和345和6789101112第4章白盒測試及其用例的設計4.1白盒測試方法4.2白盒測試的根本概念4.3覆蓋測試4.4路徑測試4.5最少測試用例數計算本章教學目標理論環(huán)節(jié)學習理解白盒測試方法的根本概念學習理解白盒測試的覆蓋理論學習掌握白盒測試的路徑表達學習掌握白盒測試的根本路徑測試法實踐環(huán)節(jié)通過案例運用學習掌握覆蓋問題的解決方法運用根本路徑測試方法進行實際程序測試4.1白盒測試方法為什么要進行白盒測試?如果所有軟件錯誤的根源都可以追溯到某個唯一原因,那么問題就簡單了。然而,事實上一個bug常常是由多個因素共同導致的,如以下圖所示。Return假設此時開發(fā)工作已結束,程序送交到測試組,沒有人知道代碼中有一個潛在的被0除的錯誤。假設測試組采用的測試用例的執(zhí)行路徑沒有同時經過x=0和y=5/x進行測試,顯然測試工作似乎非常完善,測試用例覆蓋了所有執(zhí)行語句,也沒有被0除的錯誤發(fā)生。白盒測試方法〔續(xù)〕白盒測試也稱結構測試或邏輯驅動測試,是針對被測單元內部是如何進行工作的測試。它根據程序的控制結構設計測試用例,主要用于軟件或程序驗證。白盒測試法檢查程序內部邏輯結構,對所有邏輯路徑進行測試,是一種窮舉路徑的測試方法。但即使每條路徑都測試過了,仍然可能存在錯誤。因為:窮舉路徑測試無法檢查出程序本身是否違反了設計標準,即程序是否是一個錯誤的程序。窮舉路徑測試不可能查出程序因為遺漏路徑而出錯。窮舉路徑測試發(fā)現不了一些與數據相關的錯誤。白盒測試方法〔續(xù)〕采用白盒測試方法必須遵循以下幾條原那么,才能到達測試的目的:保證一個模塊中的所有獨立路徑至少被測試一次。所有邏輯值均需測試真(true)和假(false)兩種情況。檢查程序的內部數據結構,保證其結構的有效性。在上下邊界及可操作范圍內運行所有循環(huán)。白盒測試主要是檢查程序的內部結構、邏輯、循環(huán)和路徑。常用測試用例設計方法有:邏輯覆蓋法〔邏輯驅動測試〕根本路徑測試方法4.2白盒測試的根本概念4.2.1控制流圖4.2.2環(huán)形復雜度4.2.3圖矩陣Return控制流圖控制流圖〔可簡稱流圖〕是對程序流程圖進行簡化后得到的,它可以更加突出的表示程序控制流的結構??刂屏鲌D中包括兩種圖形符號:節(jié)點和控制流線。節(jié)點由帶標號的圓圈表示,可代表一個或多個語句、一個處理框序列和一個條件判定框〔假設不包含復合條件〕??刂屏骶€由帶箭頭的弧或線表示,可稱為邊。它代表程序中的控制流。對于復合條件,那么可將其分解為多個單個條件,并映射成控制流圖。常見結構的控制流圖常見結構的控制流圖其中,包含條件的節(jié)點被稱為判定節(jié)點〔也叫謂詞節(jié)點〕,由判定節(jié)點發(fā)出的邊必須終止于某一個節(jié)點,由邊和節(jié)點所限定的范圍被稱為區(qū)域。環(huán)形復雜度環(huán)形復雜度也稱為圈復雜度,它是一種為程序邏輯復雜度提供定量尺度的軟件度量。環(huán)形復雜度的應用——可以將環(huán)形復雜度用于根本路徑方法,它可以提供:程序根本集的獨立路徑數量;確保所有語句至少執(zhí)行一次的測試數量的上界。獨立路徑是指程序中至少引入了一個新的處理語句集合或一個新條件的程序通路。采用流圖的術語,即獨立路徑必須至少包含一條在本次定義路徑之前不曾用過的邊。測試可以被設計為根本路徑集的執(zhí)行過程,但根本路徑集通常并不唯一。計算環(huán)形復雜度的方法環(huán)形復雜度以圖論為根底,為我們提供了非常有用的軟件度量??捎萌缦氯N方法之一來計算環(huán)形復雜度:控制流圖中區(qū)域的數量對應于環(huán)形復雜度。給定控制流圖G的環(huán)形復雜度—V(G),定義為V(G)=E-N+2其中,E是控制流圖中邊的數量,N是控制流圖中的節(jié)點數量。給定控制流圖G的環(huán)形復雜度—V(G),也可定義為V(G)=P+1其中,P是控制流圖G中判定節(jié)點的數量。4.2.3圖矩陣圖矩陣是控制流圖的矩陣表示形式。圖矩陣是一個方形矩陣,其維數等于控制流圖的節(jié)點數。矩陣中的每列和每行都對應于標識的節(jié)點,矩陣元素對應于節(jié)點間的邊。通常,控制流圖中的結點用數字標識,邊那么用字母標識。如果在控制流圖中從第i個結點到第j個結點有一個標識為x的邊相連接,那么在對應圖矩陣的第i行第j列有一個非空的元素x。習題根據左圖給出的程序流程圖,完成以下要求:〔1〕畫出相應的控制流圖?!?〕計算環(huán)形復雜度?!?〕給出相應的圖矩陣。〔4〕找出程序的獨立路徑集合。4.3覆蓋測試4.3.1測試覆蓋率4.3.2邏輯覆蓋法4.3.3面向對象的覆蓋4.3.4測試覆蓋準那么Return4.3.1測試覆蓋率測試覆蓋率:用于確定測試所執(zhí)行到的覆蓋項的百分比。其中的覆蓋項是指作為測試根底的一個入口或屬性,比方語句、分支、條件等。測試覆蓋率可以表示出測試的充分性,在測試分析報告中可以作為量化指標的依據,測試覆蓋率越高效果越好。但覆蓋率不是目標,只是一種手段。測試覆蓋率包括功能點覆蓋率和結構覆蓋率:功能點覆蓋率大致用于表示軟件已經實現的功能與軟件需要實現的功能之間的比例關系。結構覆蓋率包括語句覆蓋率、分支覆蓋率、循環(huán)覆蓋率、路徑覆蓋率等等。4.3.2邏輯覆蓋法根據覆蓋目標的不同,邏輯覆蓋又可分為語句覆蓋、判定覆蓋、條件覆蓋、判定/條件覆蓋、組合覆蓋和路徑覆蓋。語句覆蓋:選擇足夠多的測試用例,使得程序中的每個可執(zhí)行語句至少執(zhí)行一次。判定覆蓋:通過執(zhí)行足夠的測試用例,使得程序中的每個判定至少都獲得一次“真〞值和“假〞值,也就是使程序中的每個取“真〞分支和取“假〞分支至少均經歷一次,也稱為“分支覆蓋〞。條件覆蓋:設計足夠多的測試用例,使得程序中每個判定包含的每個條件的可能取值〔真/假〕都至少滿足一次。邏輯覆蓋法〔續(xù)〕判定/條件覆蓋:設計足夠多的測試用例,使得程序中每個判定包含的每個條件的所有情況〔真/假〕至少出現一次,并且每個判定本身的判定結果〔真/假〕也至少出現一次?!獫M足判定/條件覆蓋的測試用例一定同時滿足判定覆蓋和條件覆蓋。組合覆蓋:通過執(zhí)行足夠的測試用例,使得程序中每個判定的所有可能的條件取值組合都至少出現一次。——滿足組合覆蓋的測試用例一定滿足判定覆蓋、條件覆蓋和判定/條件覆蓋。路徑覆蓋:設計足夠多的測試用例,要求覆蓋程序中所有可能的路徑。邏輯覆蓋法〔續(xù)〕組合覆蓋判斷/條件覆蓋判斷覆蓋條件覆蓋語句覆蓋邏輯覆蓋法〔續(xù)〕voidDoWork(intx,inty,intz){intk=0,j=0;if((x>3)&&(z<10)){k=x*y-1;j=sqrt(k);}//語句塊1if((x==4)||(y>5)){j=x*y+10;}//語句塊2j=j%3;//語句塊3}邏輯覆蓋法〔續(xù)〕X>3&&z<10執(zhí)行語句塊1執(zhí)行語句塊2X==4||y>5執(zhí)行語句塊3FFTTabdce語句覆蓋要實現DoWork函數的語句覆蓋,只需設計一個測試用例就可以覆蓋程序中的所有可執(zhí)行語句。測試用例輸入為:{x=4、y=5、z=5}程序執(zhí)行的路徑是:abd分析:語句覆蓋可以保證程序中的每個語句都得到執(zhí)行,但發(fā)現不了判定中邏輯運算的錯誤,即它并不是一種充分的檢驗方法。例如在第一個判定((x>3)&&(z<10))中把“&&〞錯誤的寫成了“||〞,這時仍使用該測試用例,那么程序仍會按照流程圖上的路徑abd執(zhí)行??梢哉f語句覆蓋是最弱的邏輯覆蓋準那么。判定覆蓋要實現DoWork函數的判定覆蓋,需要設計兩個測試用例。測試用例的輸入為:{x=4、y=5、z=5};{x=2、y=5、z=5}程序執(zhí)行的路徑分別是:abd;ace分析:上述兩個測試用例不僅滿足了判定覆蓋,同時還做到語句覆蓋。從這點看似乎判定覆蓋比語句覆蓋更強一些,但仍然無法確定判定內部條件的錯誤。例如把第二個判定中的條件y>5錯誤寫為y<5,使用上述測試用例,照樣能按原路徑執(zhí)行而不影響結果。因此,需要有更強的邏輯覆蓋準那么去檢驗判定內的條件。判定覆蓋〔續(xù)〕16352789410說明:以上僅考慮了兩出口的判斷,我們還應把判定覆蓋準那么擴充到多出口判斷〔如Case語句〕的情況。因此,判定覆蓋更為廣泛的含義應該是使得每一個判定獲得每一種可能的結果至少一次。條件覆蓋在實際程序代碼中,一個判定中通常都包含假設干條件。條件覆蓋的目的是設計假設干測試用例,在執(zhí)行被測程序后,要使每個判定中每個條件的可能值至少滿足一次。對DoWork函數的各個判定的各種條件取值加以標記。對于第一個判定((x>3)&&(z<10)): 條件x>3取真值記為T1,取假值記為-T1 條件z<10取真值記為T2,取假值記為-T2對于第二個判定((x==4)||(y>5)):條件x==4取真值記為T3,取假值記為-T3條件y>5取真值記為T4,取假值記為-T4條件覆蓋〔續(xù)〕根據條件覆蓋的根本思想,要使上述4個條件可能產生的8種情況至少滿足一次,設計測試用例如下:測試用例執(zhí)行路徑覆蓋條件覆蓋分支x=4、y=6、z=5abdT1、T2、T3、T4bdx=2、y=5、z=15ace-T1、-T2、-T3、-T4ce分析:上面這組測試用例不但覆蓋了4個條件的全部8種情況,而且將兩個判定的4個分支b、c、d、e也同時覆蓋了,即同時到達了條件覆蓋和判定覆蓋。條件覆蓋〔續(xù)〕說明:雖然前面的一組測試用例同時到達了條件覆蓋和判定覆蓋,但是,并不是說滿足條件覆蓋就一定能滿足判定覆蓋。如果設計了下表中的這組測試用例,那么雖然滿足了條件覆蓋,但只是覆蓋了程序中第一個判定的取假分支c和第二個判定的取真分支d,不滿足判定覆蓋的要求。測試用例執(zhí)行路徑覆蓋條件覆蓋分支x=2、y=6、z=5acd-T1、T2、-T3、T4cdx=4、y=5、z=15acdT1、-T2、T3、-T4cd判定/條件覆蓋判定/條件覆蓋實際上是將判定覆蓋和條件覆蓋結合起來的一種方法,即:設計足夠的測試用例,使得判定中每個條件的所有可能取值至少滿足一次,同時每個判定的可能結果也至少出現一次。根據判定/條件覆蓋的根本思想,只需設計以下兩個測試用例便可以覆蓋4個條件的8種取值以及4個判定分支。測試用例執(zhí)行路徑覆蓋條件覆蓋分支x=4、y=6、z=5abdT1、T2、T3、T4bdx=2、y=5、z=15ace-T1、-T2、-T3、-T4ce判定/條件覆蓋〔續(xù)〕分析:從外表上看,判定/條件覆蓋測試了各個判定中的所有條件的取值,但實際上,編譯器在檢查含有多個條件的邏輯表達式時,某些情況下的某些條件將會被其它條件所掩蓋。因此,判定/條件覆蓋也不一定能夠完全檢查出邏輯表達式中的錯誤。例如:對于第一個判定(x>3)&&(z<10)來說,必須x>3和z<10這兩個條件同時滿足才能確定該判定為真。如果x>3為假,那么編譯器將不再檢查z<10這個條件,那么即使這個條件有錯也無法被發(fā)現。對于第二個判定(x==4)||(y>5)來說,假設條件x==4滿足,就認為該判定為真,這時將不會再檢查y>5,那么同樣也無法發(fā)現這個條件中的錯誤。組合覆蓋組合覆蓋的目的是要使設計的測試用例能覆蓋每一個判定的所有可能的條件取值組合。對DoWork函數中的各個判定的條件取值組合加以標記: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,第二個判定的取假分支組合覆蓋〔續(xù)〕根據組合覆蓋的根本思想,設計測試用例如下:測試用例執(zhí)行路徑覆蓋條件覆蓋組合號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分析:上面這組測試用例覆蓋了所有8種條件取值的組合,覆蓋了所有判定的真假分支,但是卻喪失了一條路徑abe。路徑覆蓋前面提到的5種邏輯覆蓋都未涉及到路徑的覆蓋。事實上,只有當程序中的每一條路徑都受到了檢驗,才能使程序受到全面檢驗。路徑覆蓋的目的就是要使設計的測試用例能覆蓋被測程序中所有可能的路徑。根據路徑覆蓋的根本思想,在滿足組合覆蓋的測試用例中修改其中一個測試用例,那么可以實現路徑覆蓋:測試用例執(zhí)行路徑覆蓋條件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路徑覆蓋〔續(xù)〕分析:雖然前面一組測試用例滿足了路徑覆蓋,但并沒有覆蓋程序中所有的條件組合〔喪失了組合3和7〕,即滿足路徑覆蓋的測試用例并不一定滿足組合覆蓋。說明:對于比較簡單的小程序,實現路徑覆蓋是可能做到的。但如果程序中出現較多判斷和較多循環(huán),可能的路徑數目將會急劇增長,要在測試中覆蓋所有的路徑是無法實現的。為了解決這個難題,只有把覆蓋路徑數量壓縮到一定的限度內,如程序中的循環(huán)體只執(zhí)行一次。在實際測試中,即使對于路徑數很有限的程序已經做到路徑覆蓋,仍然不能保證被測試程序的正確性,還需要采用其他測試方法進行補充。習題為以下流程圖所示的程序段設計一組測試用例,要求分別滿足語句覆蓋、判定覆蓋、條件覆蓋、判定/條件覆蓋、組合覆蓋和路徑覆蓋。X>8ANDY>5X>0ORY>0引用語句1引用語句2NYNYX>16ORY>10引用語句3NY4.3.3面向對象的覆蓋繼承上下文覆蓋由于傳統(tǒng)的結構化度量沒有考慮面向對象的一些特性〔如多態(tài)、繼承和封裝等〕,所以在面向對象領域,傳統(tǒng)的結構化覆蓋必須被加強,以滿足面向對象特性。繼承上下文覆蓋考慮在每個類的上下文內獲得的覆蓋率級別。它是擴展到面向對象領域里的一種覆蓋率度量方法,用于度量在系統(tǒng)中的多態(tài)調用被測試得多好。繼承上下文定義將基類上下文內例行程序的執(zhí)行作為獨立于繼承類上下文內例行程序的執(zhí)行。同樣,它們在考慮繼承類上下文內例行程序的執(zhí)行也獨立于基類上下文內例行程序的執(zhí)行。為了獲得100%繼承上下文覆蓋,代碼必須在每個適當的上下文內被完全執(zhí)行。面向對象的覆蓋〔續(xù)〕基于狀態(tài)的上下文覆蓋在絕大多數面向對象的系統(tǒng)中存在這樣的一些類:這些類的對象可以存在于眾多不同狀態(tài)中的任何一種,并且由于類的行為依賴于狀態(tài),每個類的行為在每個可能的狀態(tài)中其性質是不同的?;跔顟B(tài)的上下文覆蓋對應于被測類對象的潛在狀態(tài)。這樣基于狀態(tài)的上下文覆蓋把一個狀態(tài)上下文內的一個例行程序的執(zhí)行認為是獨立于另一個狀態(tài)內相同例行程序的執(zhí)行。為了到達100%的基于狀態(tài)的上下文覆蓋,例行程序必須在每個適當的上下文〔狀態(tài)〕內被執(zhí)行。4.3.4測試覆蓋準那么邏輯覆蓋的出發(fā)點是合理的、完善的。所謂“覆蓋〞,就是想要做到全面而無遺漏,但邏輯覆蓋并不能真正做到無遺漏。例如:我們不小心將前面提到的程序段中的if(x>3&&Z<10){……}錯寫成if(x>=3&&Z<10){……}按照我們前面設計的測試用例〔x的值取2或4〕來看,邏輯覆蓋對這樣的小問題都無能為力。分析出現這一情況的原因在于:錯誤區(qū)域僅僅在x=3這個點上,即僅當x的值取3時,測試才能發(fā)現錯誤。面對這類情況,我們應該從中吸取的教訓是測試工作要有重點,要多針對容易發(fā)生問題的地方設計測試用例。測試覆蓋準那么〔續(xù)〕ESTCA覆蓋準那么:在容易發(fā)生問題的地方設計測試用例,即重視程序中謂詞〔條件判斷〕的取值。ESTCA覆蓋準那么是一套錯誤敏感用例分析規(guī)那么。這一規(guī)那么雖然并不完備,但在普通程序中卻是有效的。原因在于這是一種經驗型的覆蓋準那么,規(guī)那么本身針對了程序編寫人員容易發(fā)生的錯誤,或是圍繞著發(fā)生錯誤的頻繁區(qū)域,從而提高了發(fā)現錯誤的命中率。具體規(guī)那么如下:[規(guī)那么1]對于ArelB型(rel可以是<、=或>)的分支謂詞,應適當的選擇A與B的值,使得測試執(zhí)行到該分支語句時,A<B、A=B、A>B的情況分別出現一次?!@是為了檢測邏輯符號寫錯的情況,如將“A<B〞錯寫為“A>B〞。測試覆蓋準那么〔續(xù)〕[規(guī)那么2]對于ArelC型(rel可以是>或<,A是變量,C是常量)的分支謂詞:當rel為<時,應適當的選擇A的值,使A=C-M〔M是距C最小的機器容許正數,假設A和C都為正整數時,M=1〕;當rel為>時,應適當的選擇A的值,使A=C+M?!@是為了檢測“差1〞之類的錯誤,如“A>1〞錯寫成“A>0〞。[規(guī)那么3]對外部輸入變量賦值,使其在每一個測試用例中均有不同的值與符號,并與同一組測試用例中其他變量的值與符號不同?!@是為了檢測程序語句中的錯誤,如應該引用某一變量而錯成引用另一個常量。測試覆蓋準那么〔續(xù)〕關于LCSAJLCSAJ(LinearCodeSequenceandJump)的字面含義是線性代碼序列與跳轉。在程序中,一個LCSAJ是一組順序執(zhí)行的代碼,以控制跳轉為其結束點。LCSAJ的起點是根據程序本身決定的。它的起點可以是程序第一行或轉移語句的入口點,或是控制流可跳達的點。如果有幾個LCSAJ首尾相接,且第一個LCSAJ起點為程序起點,最后一個LCSAJ終點為程序終點,這樣的LCSAJ串就組成了程序的一條路徑〔LCSAJ路徑〕。一條LCSAJ程序路徑可能是由2個、3個或多個LCSAJ組成的。測試覆蓋準那么〔續(xù)〕基于LCSAJ與路徑的關系,提出了層次LCSAJ覆蓋準那么。它是一個分層的覆蓋準那么,可以概括的描述為:第一層—語句覆蓋。第二層—分支覆蓋。第三層—LCSAJ覆蓋,即程序中的每一個LCSAJ都至少在測試中經歷過一次。第四層—兩兩LCSAJ覆蓋,即程序中的每兩個相連的LCSAJ組合起來在測試中都要經歷一次。第n+2層—每n個首尾相連的LCSAJ組合在測試中都要經歷一次。在實施測試時,假設要實現上述的層次LCSAJ覆蓋,需要產生被測程序的所有LCSAJ。測試覆蓋準那么〔續(xù)〕例:找出前面DoWork函數的所有LCSAJ和LCSAJ路徑。LCSAJ〔5個〕:〔1〕intk=0,j=0;if((x>3)&&(z<10))〔2〕k=x*y-1;j=sqrt(k);if((x==4)||(y>5))〔3〕if((x==4)||(y>5))〔4〕j=x*y+10;j=j%3〔5〕j=j%3LCSAJ路徑〔4條〕:〔1〕-〔2〕-〔4〕〔1〕-〔2〕-〔5〕〔1〕-〔3〕-〔4〕〔1〕-〔3〕-〔5〕4.4路徑測試4.4.1路徑表達式4.4.2根本路徑測試方法4.4.3循環(huán)測試方法4.4.4產生測試用例Return4.4.1路徑表達式為了滿足路徑覆蓋,必須首先確定具體的路徑以及路徑的個數。我們通常采用控制流圖的邊〔弧〕序列和節(jié)點序列表示某一條具體路徑,更為概括的表示方法為:〔1〕弧a和弧b相乘,表示為ab,它說明路徑是先經歷弧a,接著再經歷弧b,弧a和弧b是先后相接的?!?〕弧a和弧b相加,表示為a+b,它說明兩條弧是“或〞的關系,是并行的路段。路徑數的計算:在路徑表達式中,將所有弧均以數值1來代替,再進行表達式的相乘和相加運算,最后得到的數值即為該程序的路徑數。4.4.2根本路徑測試方法路徑測試就是從一個程序的入口開始,執(zhí)行所經歷的各個語句的完整過程。從廣義的角度講,任何有關路徑分析的測試都可以被稱為路徑測試。完成路徑測試的理想情況是做到路徑覆蓋,但對于復雜性大的程序要做到所有路徑覆蓋〔測試所有可執(zhí)行路徑〕是不可能的。在不能做到所有路徑覆蓋的前提下,如果某一程序的每一個獨立路徑都被測試過,那么可以認為程序中的每個語句都已經檢驗過了,即到達了語句覆蓋。這種測試方法就是通常所說的根本路徑測試方法。根本路徑測試方法〔續(xù)〕根本路徑測試方法是在控制流圖的根底上,通過分析控制結構的環(huán)形復雜度,導出執(zhí)行路徑的根本集,再從該根本集設計測試用例。根本路徑測試方法包括以下4個步驟:〔1〕畫出程序的控制流圖?!?〕計算程序的環(huán)形復雜度,導出程序根本路徑集中的獨立路徑條數,這是確定程序中每個可執(zhí)行語句至少執(zhí)行一次所必須的測試用例數目的上界?!?〕導出根本路徑集,確定程序的獨立路徑。〔4〕根據〔3〕中的獨立路徑,設計測試用例的輸入數據和預期輸出。根本路徑測試方法〔續(xù)〕voidSort(intiRecordNum,intiType)1{2intx=0;3inty=0;4while(iRecordNum-->0)5{6 If(iType==0)7 x=y+2;8else9 If(iType==1)10x=y+10;11else12x=y+20;13}14}根本路徑測試方法〔續(xù)〕畫出控制流圖:如右圖所示計算環(huán)形復雜度:10〔條邊〕-8〔個節(jié)點〕+2=4導出獨立路徑〔用語句編號表示〕路徑1:4→14路徑2:4→6→7→14路徑3:4→6→9→10→13→4→14路徑4:4→6→9→12→13→4→14467910121314根本路徑測試方法〔續(xù)〕輸入數據預期輸出測試用例1irecordnum=0itype=0x=0y=0測試用例2irecordnum=1itype=0x=0y=0測試用例3irecordnum=1itype=1x=10y=0測試用例4irecordnum=1itype=2x=0y=20設計測試用例:習題1、使用根本路徑測試方法,為以下程序段設計測試用例。voidDo(intX,intA,intB){1if((A>1)&&(B=0))2X=X/A;3if((A=2)||(X>1))4X=X+1;5}2、在三角形問題中,要求輸入三個邊長:a,b,c。當三邊不可能構成三角形時提示錯誤,可構成三角形時計算三角形的周長。假設是等腰三角形打印“等腰三角形〞,假設是等邊三角形,那么打印“等邊三角形〞。畫出相應的程序流程圖,并采用根本路徑測試方法為該程序設計測試用例。4.4.3循環(huán)測試方法從本質上說,循環(huán)測試的目的就是檢查循環(huán)結構的有效性。通常,循環(huán)可以劃分為簡單循環(huán)、嵌套循環(huán)、串接循環(huán)和非結構循環(huán)4類。〔

溫馨提示

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

評論

0/150

提交評論