白盒測試之基本路徑測試法
白盒測試的測試方法有程式碼檢查法、靜態結構分析法、靜態質量度量法、邏輯覆蓋法、基本路徑測試法、域測試、符號測試、Z路徑覆蓋、程式變異。
其中運用最為廣泛的是基本路徑測試法。
基本路徑測試法是在程式控制流圖的基礎上,通過分析控制構造的環路複雜性,匯出基本可執行路徑集合,從而設計測試用例的方法。
設計出的測試用例要保證在測試中程式的每個可執行語句至少執行一次。
在程式控制流圖的基礎上,通過分析控制構造的環路複雜性,匯出基本可執行路徑集合,從而設計測試用例。包括以下4個步驟和一個工具方法:
1.程式的控制流圖:描述程式控制流的一種圖示方法。
2.程式圈複雜度:McCabe複雜性度量。從程式的環路複雜性可匯出程式基本路徑集合中的獨立路徑條數,這是確定程式中每個可執行語句至少執行一次所必須的測試用例數目的上界。
3.匯出測試用例:根據圈複雜度和程式結構設計用例資料輸入和預期結果。
4.準備測試用例:確保基本路徑集中的每一條路徑的執行。
工具方法:
圖形矩陣:是在基本路徑測試中起輔助作用的軟體工具,利用它可以實現自動地確定一個基本路徑集。
程式的控制流圖:描述程式控制流的一種圖示方法。
圓圈稱為控制流圖的一個結點,表示一個或多個無分支的語句或源程式語句
流圖只有二種圖形符號:
圖中的每一個圓稱為流圖的結點,代表一條或多條語句。
流圖中的箭頭稱為邊或連線,代表控制流
任何過程設計都要被翻譯成控制流圖。
如何根據程式流程圖畫出控制流程圖?
在將程式流程圖簡化成控制流圖時,應注意:
n在選擇或多分支結構中,分支的匯聚處應有一個匯聚結點。
n邊和結點圈定的區域叫做區域,當對區域計數時,圖形外的區域也應記為一個區域。
如下頁圖所示
n如果判斷中的條件表示式是由一個或多個邏輯運算子 (OR,AND, NAND,NOR)連線的複合條件表示式,則需要改為一系列只有單條件的巢狀的判斷。
例如:
1 if a or b
2x
3 else
4y
對應的邏輯為:
獨立路徑:至少沿一條新的邊移動的路徑
基本路徑測試法的步驟:
o第一步:畫出控制流圖
流程圖用來描述程式控制結構。可將流程圖對映到一個相應的流圖(假設流程圖的菱形決定框中不包含複合條件)。在流圖中,每一個圓,稱為流圖的結點,代表一個或多個語句。一個處理方框序列和一個菱形決測框可被對映為一個結點,流圖中的箭頭,稱為邊或連線,代表控制流,類似於流程圖中的箭頭。一條邊必須終止於一個結點,即使該結點並不代表任何語句
畫出其程式流程圖和對應的控制流圖如下
o第二步:計算圈複雜度
圈複雜度是一種為程式邏輯複雜性提供定量測度的軟體度量,將該度量用於計算程式的基本的獨立路徑數目,為確保所有語句至少執行一次的測試數量的上界。獨立路徑必須包含一條在定義之前不曾用到的邊。
有以下三種方法計算圈複雜度:
1.流圖中區域的數量對應於環型的複雜性;
2.給定流圖G的圈複雜度V(G),定義為V(G)=E-N+2,E是流圖中邊的數量,N是流圖中結點的數量;
3.給定流圖G的圈複雜度V(G),定義為V(G)=P+1,P是流圖G中判定結點的數量。
o第三步:匯出測試用例
根據上面的計算方法,可得出四個獨立的路徑。(一條獨立路徑是指,和其他的獨立路徑相比,至少引入一個新處理語句或一個新判斷的程式通路。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
根據上面的獨立路徑,去設計輸入資料,使程式分別執行到上面四條路徑。
o第四步:準備測試用例
為了確保基本路徑集中的每一條路徑的執行,根據判斷結點給出的條件,選擇適當的資料以保證某一條路徑可以被測試到,滿足上面例子基本路徑集的測試用例是:
舉例說明:
例:下例程式流程圖描述了最多輸入50個值(以–1作為輸入結束標誌),計算其中有效的學生分數的個數、總分數和平均值。
步驟1:匯出過程的流圖。
步驟2:確定環形複雜性度量V(G):
1)V(G)= 6 (個區域)
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是謂詞結點。
步驟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…
步驟4:為每一條獨立路徑各設計一組測試用例,以便強迫程式沿著該路徑至少執行一次。
1)路徑1(1-2-9-10-12)的測試用例:
score[k]=有效分數值,當k < i ;
score[i]=–1, 2≤i≤50;
期望結果:根據輸入的有效分數算出正確的分數個數n1、總分sum和平均分average。
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、且算出正確的總分和平均分。
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。
6)路徑6(1-2-3-4-5-6-7-8-2…)的測試用例:
score[i]=有效分數,當i<50;
期望結果:根據輸入的有效分數算出正確的分數個數n1、總分sum和平均分average。
注意事項:
必須注意,一些獨立的路徑,往往不是完全孤立的,有時它是程式正常的控制流的一部分,這時,這些路徑的測試可以是另一條路徑測試的一部分。
方法工具:圖形矩陣
o匯出控制流圖和決定基本測試路徑的過程均需要機械化,為了開發輔助基本路徑測試的軟體工具,稱為圖形矩陣(graph matrix)的資料結構很有用。
利用圖形矩陣可以實現自動地確定一個基本路徑集。一個圖形矩陣是一個方陣,其行/列數控制流圖中的結點數,每行和每列依次對應到一個被標識的結點,矩陣元素對應到結點間的連線(即邊)。在圖中,控制流圖的每一個結點都用數字加以標識,每一條邊都用字母加以標識。如果在控制流圖中第i個結點到第j個結點有一個名為x的邊相連線,則在對應的圖形矩陣中第i行/第j列有一個非空的元素x。
對每個矩陣項加入連線權值(link weight),圖矩陣就可以用於在測試中評估程式的控制結構,連線權值為控制流提供了另外的資訊。最簡單情況下,連線權值是 1(存在連線)或0(不存在連線),但是,連線權值可以賦予更有趣的屬性:
1.執行連線(邊)的概率。
2.穿越連線的處理時間。
3.穿越連線時所需的記憶體。
4.穿越連線時所需的資源。
根據上面的方法對例4畫出圖形矩陣如下:
連線權為“1”表示存在一個連線,在圖中如果一行有兩個或更多的元素“1”,則這行所代表的結點一定是一個判定結點,通過連線矩陣中有兩個以上(包括兩個)元素為“1”的個數,就可以得到確定該圖圈複雜度的另一種演算法。