探究白盒測試

1 白盒測試的概念

白盒測試也稱結構測試或邏輯驅動測試,是一種測試用例設計方法,它從程序的控制結構導出測試用例。(測試用例由測試輸入數據以及與之對應的輸出結果組成。)

白盒測試使用被測單元內部如何工作的信息,允許測試人員對程序內部邏輯結構及有關信息來設計和選擇測試用例,對程序的邏輯路徑進行測試。基於一個應用代碼的內部邏輯知識,測試是基於覆蓋全部代碼、分支、路徑、條件。

2 白盒測試的主要目的

  • 保證一個模塊中的所有獨立路徑至少被執行一次;
  • 對所有的邏輯值均需要測試真、假兩個分支;
  • 在上下邊界及可操作範圍內運行所有循環;
  • 檢查內部數據結構以確保其有效性。

3 測試覆蓋標準

白盒法特點:以程序的內部邏輯爲基礎設計測試用例,所以又稱爲邏輯覆蓋法。應用白盒法時,手頭必須有程序的規格說明以及程序清單。

白盒法考慮的是測試用例對程序內部邏輯的覆蓋程度。最徹底的白盒法是覆蓋程序中的每一條路徑,但是由於程序中一般含有循環,所以路徑的數目極大,要執行每一條路徑是不可能的,只能希望覆蓋的程度儘可能高些。

圖1 程序流程圖

圖1包括了一個執行達20次的循環。那麼它所包含的不同執行路徑數高達520(=1013)條,若要對它進行窮舉測試,覆蓋所有的路徑。假使測試程序對每一條路徑進行測試需要1毫秒,同
樣假定一天工作24小時,一年工作365天, 那麼要想把如圖所示的小程序的所有路徑測試完,則需要3170年。

爲了衡量測試的覆蓋程度,需要建立一些標準,目前常用的一些覆蓋標準從低到高分別是:

  • 語句覆蓋:是一個比較弱的測試標準,它的含義是:選擇足夠的測試用例,使得程序中每個語句至少都能被執行一次。它是最弱的邏輯覆蓋,效果有限,必須與其它方法交互使用。
  • 判定覆蓋(也稱爲分支覆蓋):執行足夠的測試用例,使得程序中的每一個分支至少都通過一次。判定覆蓋只比語句覆蓋稍強一些,但實際效果表明,只是判定覆蓋,還不能保證一定能查出在判斷的條件中存在的錯誤。因此,還需要更強的邏輯覆蓋準則去檢驗判斷內部條件。
  • 條件覆蓋:執行足夠的測試用例,使程序中每個判斷的每個條件的每個可能取值至少執行一次;條件覆蓋深入到判定中的每個條件,但可能不能滿足判定覆蓋的要求。
  • 判定/條件覆蓋:執行足夠的測試用例,使得判定中每個條件取到各種可能的值,並使每個判定取到各種可能的結果。判定/條件覆蓋有缺陷。從表面上來看,它測試了所有條件的取值。但是事實並非如此。往往某些條件掩蓋了另一些條件。會遺漏某些條件取值錯誤的情況。爲徹底地檢查所有條件的取值,需要將判定語句中給出的複合條件表達式進行分解,形成由多個基本判定嵌套的流程圖。這樣就可以有效地檢查所有的條件是否正確了。
  • 條件組合覆蓋:執行足夠的例子,使得每個判定中條件的各種可能組合都至少出現一次。這是一種相當強的覆蓋準則,可以有效地檢查各種可能的條件取值的組合是否正確。它不但可覆蓋所有條件的可能取值的組合,還可覆蓋所有判斷的可取分支,但可能有的路徑會遺漏掉。測試還不完全。

4 白盒測試的主要方法

  1. 邏輯驅動測試
    • 語句覆蓋
    • 判定覆蓋(分支覆蓋)
    • 條件覆蓋
    • 判定/條件覆蓋
    • 條件組合覆蓋
  2. 基本路徑測試

    • 設計足夠多的測試用例,運行所測程序,要覆蓋程序中所有可能的路徑。這是最強的覆蓋準則。但在路徑數目很大時,真正做到完全覆蓋是很困難的,必須把覆蓋路徑數目壓縮到一定限度。

4.1 邏輯驅動測試

4.1.1 語句覆蓋

程序1如下:

PROCEDURE M(VAR A,B,X:REAL);
BEGIN
IF (A>1) AND (B=0) THEN X:=X/A ;
IF (A=2) OR (X>1) THEN X:=X+1 ;
END

圖2 程序流程圖

爲使程序中每個語句至少執行一次,只需設計一個能通過路徑ace的例子就可以了,就可達到“語句覆蓋”標準。例如選擇輸入數據爲:

A=2,B=0,X=3

缺點: 從上例可看出,語句覆蓋實際上是很弱的

  • 如果第一個條件語句中的AND錯誤地編寫成OR,上面的測試用例是不能發現這個錯誤的;
  • 又如第三個條件語句中X>1誤寫成X>0,這個測試用例也不能暴露它;
  • 此外,沿着路徑abd執行時,X的值應該保持不變,如果這一方面有錯誤,上述測試數據也不能發現它們。 

4.1.2 判定覆蓋(分支覆蓋) 

對程序1,如果設計兩個用例,使它們能通過路徑ace和abd,或者通過路徑acd和abe,就可達到“判定覆蓋”標準,爲此,可以選擇輸入數據爲:

  • A=3,B=0,X=1 (沿路徑acd執行);
  • A=2,B=1,X=3(沿路徑abe執行)

優點:“分支覆蓋”比“語句覆蓋”嚴格,因爲如果每個分支都執行過了,則每個語句也就執行過了。

缺點:但是,“分支覆蓋”還是很不夠的

  • 兩個測試用例未能烤爐到A<=1的情況
  • 兩個測試用例未能檢查沿着路徑abd執行時,X的值是否保持不變。

4.1.3 條件覆蓋

一個判定中往往包含了若干個條件,如程序中,判定 (A>1) AND (B=0)包含了兩個條件: A>1以及 B=0,所以可引進一個更強的覆蓋標準——“條件覆蓋”。

程序1有四個條件:

A>1 、B=0、A=2、X>1
爲了達到“條件覆蓋”標準,需要執行足夠的測試用例使得在a點有:
A>1、A≤1、B=0、B≠0
以及在b點有:
A=2、A≠2、X>1、X≤1
現在只需設計以下兩個測試用例就可滿足這一標準:

  • A=2,B=1,X=4 (沿路徑abe執行);
  • A=1,B=0,X=1 (沿路徑abd執行)。

優點:“條件覆蓋”通常比“分支覆蓋”強,因爲它使一個判定中的每一個條件都取到了兩個不同的結果,而判定覆蓋則不保證這一點。

缺點:“條件覆蓋”並不包含“分支覆蓋”,如兩個用例沒有有覆蓋判定(A>1 and B=0)爲True的情況

4.1.4 判定/條件覆蓋

程序1,以下用例是滿足判定/條件覆蓋:

  • A=2,B=0,X=4 (沿ace路徑)
  • A=1,B=1,X=1 (沿abd路徑)

優點:既有“條件覆蓋”,又有“判定覆蓋”

缺點:分支/條件覆蓋從表面來看,它測試了所有條件的取值,但是實際上某些條件掩蓋了另一些條件。 

  • 對於第一個表達式(A>1 and B=0)如果(A>1)爲假則一般的編譯器不在判斷是否B=0了。
  • 對於第二個表達式(A=2 or X>1)來說,若A=2測試結果爲真,就認爲表達式的結果爲真,這時不再檢查(X>1)條件了。

因此,採用分支/條件覆蓋,邏輯表達式中的錯誤不一定能夠查出來了。

4.1.5 條件組合覆蓋

程序1,以下用例是滿足條件組合覆蓋:

再看程序1,我們需要選擇適當的用例,使得下面 8種條件組合都能夠出現:

1) A>1, B=0  2) A>1, B≠0  3) A≤1, B=0  4) A≤1, B≠0

5) A=2, X>1  6) A=2, X≤1  7) 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)兩種情況出現 (沿ace路徑);
  • A=2,B=1,X=1 使 2)、6)兩種情況出現 (沿abd路徑);
  • A=1,B=0,X=2 使 3)、7)兩種情況出現 (沿abe路徑);
  • A=1,B=1,X=1 使 4)、8)兩種情況出現 (沿abd路徑)。

優點:既有“條件覆蓋”,又有“判定覆蓋”,還有“條件組合覆蓋”

缺點:上面四個例子雖然滿足條件組合覆蓋,但並不能覆蓋程序中的每一條路徑,例如路徑acd就沒有執行

4.1.6 黑盒法補充測試用例

通過前面邏輯驅動測試方法,可以得到兩點結論:

  • “條件組合覆蓋”標準比其他標準優越。
  • 即使達到任何一種覆蓋標準,其測試效果仍然是不徹底的,我們還需要用其他的測試方法作補充。

一個參考的黑盒法補充策略是:

1) 在任何情況下都需使用邊界值分析(這個方法應包括對輸入和輸出的邊界值進行分析)。
2) 必要的話,再用等價分類法補充一些測試用例。
3) 再用錯誤推測法附加測試用例。
4) 檢查上述例子的邏輯覆蓋程度,如果未能滿足某些覆蓋標準,則再增加足夠的測試用例。
5) 如果功能說明中含有輸入條件的組合情況,則一開始就可先用因果圖(判定表)法。

4.2 路徑測試

路徑測試就是設計足夠多的測試用例,覆蓋被測試對象中的所有可能路徑。

4.2.1 基本路徑測試

程序1是很簡單的程序函數,只有四條路徑。但在實踐中,一個不太複雜的程序,其路徑都是一個龐大的數字,要在測試中覆蓋所有的路徑是不現實的。爲了解決這一難題,只得把覆蓋的路徑數壓縮到一定限度內,例如,程序中的循環體只執行一次。

基本路徑測試就是這樣一種測試方法,它在程序控制圖的基礎上,通過分析控制構造的環行復雜性,導出基本可執行路徑集合,從而設計測試用例的方法。設計出的測試用例要保證在測試中程序的每一個可執行語句至少執行一次。

在程序控制流圖的基礎上,通過分析控制構造的環路複雜性,導出基本可執行路徑集合,從而設計測試用例。包括以下4個步驟和一個工具方法:

  1. 程序的控制流圖:描述程序控制流的一種圖示方法。
  2. 程序圈複雜度:McCabe複雜性度量。從程序的環路複雜性可導出程序基本路徑集合中的獨立路徑條數,這是確定程序中每個可執行語句至少執行一次所必須的測試用例數目的上界。
  3. 導出測試用例:根據圈複雜度和程序結構設計用例數據輸入和預期結果。
  4. 準備測試用例:確保基本路徑集中的每一條路徑的執行。

工具方法:

  1. 圖形矩陣:是在基本路徑測試中起輔助作用的軟件工具,利用它可以實現自動地確定一個基本路徑集。

1) 控制流圖

在介紹基本路徑方法之前,必須先介紹一種簡單的控制流表示方法,即流圖。流圖是對待測試程序過程處理的一種表示。流圖使用下面的符號描述邏輯控制流,每一種結構化構成元素有一個相應的流圖符號。

圖3 流圖符號

流圖只有二種圖形符號

  • 圖中的每一個圓稱爲流圖的結點,代表一條或多條語句。
  • 流圖中的箭頭稱爲邊或連接,代表控制流。

任何過程設計都要被翻譯成控制流圖。

在將程序流程圖簡化成控制流圖時,應注意:

  • 在選擇或多分支結構中,分支的匯聚處應有一個匯聚結點。
  • 邊和結點圈定的區域叫做區域,當對區域計數時,圖形外的區域也應記爲一個區域。

圖4 控制流圖

如果判斷中的條件表達式是由一個或多個邏輯運算符 (OR, AND) 連接的複合條件表達式,則需要改爲一系列只有單條件的嵌套的判斷。

圖5 程序結構轉化成流圖

2) 獨立路徑

獨立路徑:至少沿一條新的邊移動的路徑

圖6 獨立路徑

對以上路徑的遍歷,就是至少一次地執行了程序中的所有語句

3) 基本路徑測試 

第一步:畫出控制流圖

流程圖用來描述程序控制結構。可將流程圖映射到一個相應的流圖(假設流程圖的菱形決定框中不包含複合條件)。

  • 流圖中圓,稱爲流圖的結點,代表一個或多個語句。一個處理方框序列和一個菱形決測框可被映射爲一個結點;
  • 流圖中的箭頭,稱爲邊或連接,代表控制流,類似於流程圖中的箭頭。一條邊必須終止於一個結點,即使該結點並不代表任何語句(例如:if-else-then結構);
  • 由邊和結點限定的範圍稱爲區域。計算區域時應包括圖外部的範圍。

圖7 程序流程圖

圖8 程序流程圖和對應的控制流圖

第二步:計算圈複雜度

圈複雜度是一種爲程序邏輯複雜性提供定量測度的軟件度量,將該度量用於計算程序的基本的獨立路徑數目,爲確保所有語句至少執行一次的測試數量的上界。

獨立路徑必須包含一條在定義之前不曾用到的邊。

有以下三種方法計算圈複雜度:

  1. 流圖中區域的數量對應於環型的複雜性;
  2. 給定流圖G的圈複雜度V(G),定義爲V(G)=E-N+2,E是流圖中邊的數量,N是流圖中結點的數量;
  3. 給定流圖G的圈複雜度V(G),定義爲V(G)=P+1,P是流圖G中判定結點的數量。

第三步:導出測試用例

根據上面的計算方法,可得出四個獨立的路徑。(一條獨立路徑是指,和其他的獨立路徑相比,至少引入一個新處理語句或一個新判斷的程序通路。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

第四步:準備測試用例

爲了確保基本路徑集中的每一條路徑的執行,根據判斷結點給出的條件,選擇適當的數據以保證某一條路徑可以被測試到,滿足上面例子基本路徑集的測試用例是:

路徑1:4-14
輸入數據:iRecordNum=0,或者取iRecordNum<0的某一個值  預期結果:x=0

路徑2:4-6-7-14
輸入數據:iRecordNum=1,iType=0  預期結果:x=2

路徑3:4-6-8-10-13-4-14
輸入數據:iRecordNum=1,iType=1  預期結果:x=10

路徑4:4-6-8-11-13-4-14
輸入數據:iRecordNum=1,iType=2  預期結果:x=20

必須注意,一些獨立的路徑,往往不是完全孤立的,有時它是程序正常的控制流的一部分,這時,這些路徑的測試可以是另一條路徑測試的一部分。

4) 工具方法:圖形矩陣

導出控制流圖和決定基本測試路徑的過程均需要機械化,爲了開發輔助基本路徑測試的軟件工具,稱爲圖形矩陣(graph matrix)的數據結構很有用。

利用圖形矩陣可以實現自動地確定一個基本路徑集。一個圖形矩陣是一個方陣

  • 其行/列數控制流圖中的結點數,每行和每列依次對應到一個被標識的結點,
  • 矩陣元素對應到結點間的連接(即邊)。

對每個矩陣項加入連接權值(link  weight),圖矩陣就可以用於在測試中評估程序的控制結構,連接權值爲控制流提供了另外的信息。最簡單情況下,連接權值是 1(存在連接)或0(不存在連接),但是,連接權值可以賦予更有趣的屬性:

  • 執行連接(邊)的概率。
  • 穿越連接的處理時間。
  • 穿越連接時所需的內存。
  • 穿越連接時所需的資源。

圖9 圖形矩陣

連接權爲“1”表示存在一個連接,在圖中如果一行有兩個或更多的元素“1”,則這行所代表的結點一定是一個判定結點,通過連接矩陣中有兩個以上(包括兩個)元素爲“1”的個數,就可以得到確定該圖圈複雜度的另一種算法。

5 控制結構測試的其他變種

前面所述的基本路徑測試技術是控制結構測試技術之一。儘管基本路徑測試簡單高效,但是,其本身並不充分。下面討論控制結構測試的其他變種,這些測試覆蓋並提高了白盒測試的質量。包括:

  1. 條件測試
  2. 數據流測試 (略)
  3. 循環測試。

5.1 條件測試

條件測試方法注重於測試程序中的條件。是檢查程序模塊中所包含邏輯條件的測試用例設計方法。

5.1.1 條件

程序中的條件分爲簡單條件和複合條件。

簡單條件是一個布爾變量或一個可能帶有NOT(“!”)操作符的關係表達式。關係表達式的形式如:

E1<關係操作符>E2

其中E1和E2是算術表達式,而<關係操作符>是下列之一:“<”、“≤”、“=”、“≠”(“!=”)、“>”、或“≥”。

複合條件由簡單條件通過邏輯運算符(AND、OR、NOT)和括號連接而成,不含關係表達式的條件稱爲布爾表達式。

所以條件的成分類型包括:布爾操作符、布爾變量、布爾括弧(括住簡單或複雜條件)、關係操作符、算術表達式。

5.1.2 條件測試的目的

條件測試是測試程序條件錯誤和程序的其他錯誤。如果程序的測試集能夠有效地檢測程序中的條件錯誤,則該測試集可能也會有效地檢測程序中的其他錯誤。此外,如果測試策略對檢測條件錯誤有效,則它也可能有效地檢測程序錯誤。

5.1.3 條件測試策略

1) 窮舉測試(條件組合)

有n個變量的布爾表達式需要2n個可能的測試(n>0)。這種策略可以發現布爾操作符、變量和括弧的錯誤,但是隻有在n很小時實用。

2) 分支測試

分支測試可能是最簡單的條件測試策略,它是真假分支必須至少執行一次的路徑策略,對於複合條件C,C的真分支和假分支以及C中的每個簡單條件都需要至少執行一次。

域測試是對於大於、小於和等於值的測試路徑策略。域測試要求從有理表達式中導出三個或四個測試,有理表達式的形式如:

E1<關係操作符>E2

需要三個測試分別用於計算E1的值是大於、等於或小於E2的值。如果<關係操作符>錯誤,而E1和E2正確,則這三個測試能夠發現關係算子的錯誤。爲了發現E1和E2的錯誤,計算E1小於或大於E2的測試應使兩個值間的差別儘可能小。

3) BRO(branch and relational) 測試

如果在一個判定的複合條件表達式中每個布爾變量和關係運算符最多隻出現一次,而且沒有公共變量,應用一種稱之爲BRO(分支與關係運算符)的測試法可以發現多個布爾運算符或關係運算符錯,以及其他錯誤。

BRO策略引入條件約束的概念。設有n個簡單條件的複合條件C,其條件約束爲D= (D1,D2,…,Dn) ,其中Di(0<i≤n)是條件C中第i個簡單條件的輸出約束。如果在C的執行過程中,其每個簡單條件的輸出都滿足D中對應的約束,則稱條件C的條件約束D由C的執行所覆蓋。對於布爾變量或布爾表達式B,B的輸出約束必須是真(t)或假(f);對於關係表達式,其輸出約束爲符號>、=、< 。

5.2 循環測試

循環測試是一種白盒測試技術,注重於循環構造的有效性。

有四種循環:簡單循環,串接(連鎖)循環,嵌套循環、不規則循環。

圖10 循環結構

對於簡單循環,測試應包括以下幾種,其中的n表示循環允許的最大次數。

  1. 零次循環:從循環入口直接跳到循環出口。
  2. 一次循環:查找循環初始值方面的錯誤。
  3. 二次循環:檢查在多次循環時才能暴露的錯誤。
  4. m次循環:此時的m<n,也是檢查在多次循環時才能暴露的錯誤。
  5. n(最大)次數循環、n+1(比最大次數多一)次的循環、n-1(比最大次數少一)次的循環。

對於嵌套循環,不能將簡單循環的測試方法簡單地擴大到嵌套循環,因爲可能的測試數目將隨嵌套層次的增加呈幾何倍數增長。這可能導致一個天文數字的測試數目。下面是一種有助於減少測試數目的測試方法。
從最內層循環開始,設置所有其他層的循環爲最小值;

  1.  對最內層循環做簡單循環的全部測試。測試時保持所有外層循環的循環變量爲最小值。另外,對越界值和非法值做類似的測試。
  2.  逐步外推,對其外面一層循環進行測試。測試時保持所有外層循環的循環變量取最小值,所有其它嵌套內層循環的循環變量取“典型”值。
  3.  反覆進行,直到所有各層循環測試完畢。
  4.  對全部各層循環同時取最小循環次數,或者同時取最大循環次數。對於後一種測試,由於測試量太大,需人爲指定最大循環次數。

對於串接循環,要區別兩種情況。

  • 如果各個循環互相獨立,則串接循環可以用與簡單循環相同的方法進行測試。
  • 如果有兩個循環處於串接狀態,而前一個循環的循環變量的值是後一個循環的初值。則這幾個循環不是互相獨立的,則需要使用測試嵌套循環的辦法來處理。

對於非結構循環,不能測試,應重新設計循環結構,使之成爲其它循環方式,然後再進行測試。

6 面向對象的白盒測試

 

對OO軟件的類測試相當於傳統軟件的單元測試。和傳統軟件的單元測試不同,他往往關注模塊的算法細節和模塊接口間流動的數據,OO軟件的類測試是由封裝在類中的操作和類的狀態行爲所驅動的。OO軟件測試的特點:

  • 因爲屬性和操作是被封裝的,對類之外操作的測試通常是徒勞的。封裝使對對象的狀態快照難於獲得。
  • 繼承也給測試帶來了難度,即使是徹底複用的,對每個新的使用語境也需要重新測試。
  • 多重繼承更增加了需要測試的語境的數量,使測試進一步複雜化。如果從超類導出的測試用例被用於相同的問題域,有可能對超類導出的測試用例集可以用於子類的測試,然而,如果子類被用於完全不同的語境,則超類的測試用例將沒有多大用途,必須設計新的測試用例集。

6.1 類測試方式

類測試一般有兩種主要的方式:

功能性測試和結構性測試,即對應於傳統結構化軟件的黑盒測試和白盒測試:

  • 功能性測試以類的規格說明爲基礎,它主要檢查類是否符合其規格說明的要求。例如,對於Stack類,即檢查它的操作是否滿足LIFO規則;
  • 結構性測試則從程序出發,它需要考慮其中的代碼是否正確,同樣是Stack類,就要檢查其中代碼是否動作正確且至少執行過一次。

6.1.1 結構性測試

結構性測試對類中的方法進行測試,它把類作爲一個單元來進行測試。測試分爲兩層:

  • 第一層考慮類中各獨立方法的代碼;
  • 第二層考慮方法之間的相互作用。

每個方法的測試要求能針對其所有的輸入情況,但這樣還不夠,只有對這些方法之間的接口也做同樣測試,才能認爲測試是完整的。

對於一個類的測試要保證類在其狀態的代表集上能夠正確工作,構造函數的參數選擇以及消息序列的選擇都要滿足這一準則。因此,在這兩個不同的測試層次上應分別做到:

  • 方法的單獨測試:結構性測試的第一層是考慮各獨立的方法,這可以與過程的測試採用同樣的方法,兩者之間最大的差別在於方法改變了它所在實例的狀態,這就要取得隱藏的狀態信息來估算測試的結果,傳給其它對象的消息被忽略,而以樁來代替,並根據所傳的消息返回相應的值,測試數據要求能完全覆蓋類中代碼,可以用傳統的測試技術來獲取。
  • 方法的綜合測試:第二層要考慮一個方法調用本對象類中的其它方法和從一個類向其它類發送信息的情況。單獨測試一個方法時,只考慮其本身執行的情況。而沒有考慮動作的順序問題,測試用例中加入了激發這些調用的信息,以檢查它們是否正確運行了對於同一類中方法之間的調用,一般只需要極少甚至不用附加數據,因爲方法都是對類進行存取,故這一類測試的準則是要求遍歷類的所有主要狀態。

7 白盒測試工具

內存資源泄漏檢查:Numega中的bouncechecker,Rational的Purify等;

代碼覆蓋率檢查:Numega中的truecoverage,Rational的Purecoverage,Telelogic公司的logiscope,Macabe公司的Macabe等;

開源覆蓋率測試軟件gCov等。

8 總結

8.1 白盒測試的主要方法的優缺點 

    確保覆蓋語句 確保覆蓋分支 確保覆蓋條件 確保覆蓋條件組合 確保覆蓋基本路徑
邏輯驅動測試 語句覆蓋 Y N N N N
判定覆蓋 Y Y N N N
條件覆蓋 N N Y N N
判定/條件覆蓋 Y Y Y N N
條件組合覆蓋 Y Y Y Y N
基本路徑測試 基本路徑測試 Y Y Y N Y

注意:

  • 基本路徑測試也能確保覆蓋條件,因爲:如果判斷中的條件表達式是由一個或多個邏輯運算符 (OR, AND) 連接的複合條件表達式,則需要改爲一系列只有單條件的嵌套的判斷見圖5
  • 但基本路徑測試無法確保覆蓋條件組合,因爲:如果判斷中的條件表達式是由一個或多個邏輯運算符 (OR, AND) 連接的複合條件表達式,若是OR連接的前一個表達式返回爲True,就不會考慮後一個表達式;若是AND連接的前一個表達式返回爲False,就不會考慮後一個表達式;

8.2 窮舉路徑測試的侷限性

“白盒”法全面瞭解程序內部邏輯結構、對所有邏輯路徑進行測試。“白盒”法是窮舉路徑測試。在使用這一方案時,測試者必須檢查程序的內部結構,從檢查程序的邏輯着手,得出測試數據。貫穿程序的獨立路徑數是天文數字。但即使每條路徑都測試了仍然可能有錯誤:

  • 第一、窮舉路徑測試決不能查出程序違反了設計規範,即程序本身是個錯誤的程序;
  • 第二、窮舉路徑測試不可能查出程序中因遺漏路徑而出錯。
  • 第三、窮舉路徑測試可能發現不了一些與數據相關的錯誤。
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章