2016-08-23算法
1 白盒測試的概念
2 白盒測試的主要目的
3 測試覆蓋標準
4 白盒測試的主要方法
4.1 邏輯驅動測試
4.1.1 語句覆蓋
4.1.2 斷定覆蓋(分支覆蓋)
4.1.3 條件覆蓋
4.1.4 斷定/條件覆蓋
4.1.5 條件組合覆蓋
4.1.6 黑盒法補充測試用例
4.2 路徑測試
4.2.1 基本路徑測試
1) 控制流圖
2) 獨立路徑
3) 基本路徑測試
4) 工具方法:圖形矩陣
5 控制結構測試的其餘變種
5.1 條件測試
5.1.1 條件
5.1.2 條件測試的目的
5.1.3 條件測試策略
5.2 循環測試
6 面向對象的白盒測試
6.1 類測試方式
6.1.1 結構性測試
7 白盒測試工具
8 總結
8.1 白盒測試的主要方法的優缺點
8.2 窮舉路徑測試的侷限性數據結構
返回函數
白盒測試也稱結構測試或邏輯驅動測試,是一種測試用例設計方法,它從程序的控制結構導出測試用例。(測試用例由測試輸入數據以及與之對應的輸出結果組成。)工具
白盒測試使用被測單元內部如何工做的信息,容許測試人員對程序內部邏輯結構及有關信息來設計和選擇測試用例,對程序的邏輯路徑進行測試。基於一個應用代碼的內部邏輯知識,測試是基於覆蓋所有代碼、分支、路徑、條件。單元測試
返回測試
返回spa
白盒法特色:以程序的內部邏輯爲基礎設計測試用例,因此又稱爲邏輯覆蓋法。應用白盒法時,手頭必須有程序的規格說明以及程序清單。翻譯
白盒法考慮的是測試用例對程序內部邏輯的覆蓋程度。最完全的白盒法是覆蓋程序中的每一條路徑,可是因爲程序中通常含有循環,因此路徑的數目極大,要執行每一條路徑是不可能的,只能但願覆蓋的程度儘量高些。設計
圖1 程序流程圖
圖1包括了一個執行達20次的循環。那麼它所包含的不一樣執行路徑數高達520(=1013)條,若要對它進行窮舉測試,覆蓋全部的路徑。假使測試程序對每一條路徑進行測試須要1毫秒,同
樣假定一天工做24小時,一年工做365天, 那麼要想把如圖所示的小程序的全部路徑測試完,則須要3170年。
爲了衡量測試的覆蓋程度,須要創建一些標準,目前經常使用的一些覆蓋標準從低到高分別是:
基本路徑測試
程序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
缺點: 從上例可看出,語句覆蓋其實是很弱的
對程序1,若是設計兩個用例,使它們能經過路徑ace和abd,或者經過路徑acd和abe,就可達到「斷定覆蓋」標準,爲此,能夠選擇輸入數據爲:
優勢:「分支覆蓋」比「語句覆蓋」嚴格,由於若是每一個分支都執行過了,則每一個語句也就執行過了。
缺點:可是,「分支覆蓋」仍是很不夠的
一個斷定中每每包含了若干個條件,如程序中,斷定 (A>1) AND (B=0)包含了兩個條件: A>1以及 B=0,因此可引進一個更強的覆蓋標準——「條件覆蓋」。
程序1有四個條件:
A>1 、B=0、A=二、X>1
爲了達到「條件覆蓋」標準,須要執行足夠的測試用例使得在a點有:
A>一、A≤一、B=0、B≠0
以及在b點有:
A=二、A≠二、X>一、X≤1
如今只需設計如下兩個測試用例就可知足這一標準:
優勢:「條件覆蓋」一般比「分支覆蓋」強,由於它使一個斷定中的每個條件都取到了兩個不一樣的結果,而斷定覆蓋則不保證這一點。
缺點:「條件覆蓋」並不包含「分支覆蓋」,如兩個用例沒有有覆蓋斷定(A>1 and B=0)爲True的狀況
程序1,如下用例是知足斷定/條件覆蓋:
優勢:既有「條件覆蓋」,又有「斷定覆蓋」
缺點:分支/條件覆蓋從表面來看,它測試了全部條件的取值,可是實際上某些條件掩蓋了另外一些條件。
所以,採用分支/條件覆蓋,邏輯表達式中的錯誤不必定可以查出來了。
程序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種條件組合至少出現一次:
優勢:既有「條件覆蓋」,又有「斷定覆蓋」,還有「條件組合覆蓋」
缺點:上面四個例子雖然知足條件組合覆蓋,但並不能覆蓋程序中的每一條路徑,例如路徑acd就沒有執行
經過前面邏輯驅動測試方法,能夠獲得兩點結論:
一個參考的黑盒法補充策略是:
1) 在任何狀況下都需使用邊界值分析(這個方法應包括對輸入和輸出的邊界值進行分析)。
2) 必要的話,再用等價分類法補充一些測試用例。
3) 再用錯誤推測法附加測試用例。
4) 檢查上述例子的邏輯覆蓋程度,若是未能知足某些覆蓋標準,則再增長足夠的測試用例。
5) 若是功能說明中含有輸入條件的組合狀況,則一開始就可先用因果圖(斷定表)法。
路徑測試就是設計足夠多的測試用例,覆蓋被測試對象中的全部可能路徑。
程序1是很簡單的程序函數,只有四條路徑。但在實踐中,一個不太複雜的程序,其路徑都是一個龐大的數字,要在測試中覆蓋全部的路徑是不現實的。爲了解決這一難題,只得把覆蓋的路徑數壓縮到必定限度內,例如,程序中的循環體只執行一次。
基本路徑測試就是這樣一種測試方法,它在程序控制圖的基礎上,經過分析控制構造的環行復雜性,導出基本可執行路徑集合,從而設計測試用例的方法。設計出的測試用例要保證在測試中程序的每個可執行語句至少執行一次。
在程序控制流圖的基礎上,經過分析控制構造的環路複雜性,導出基本可執行路徑集合,從而設計測試用例。包括如下4個步驟和一個工具方法:
工具方法:
在介紹基本路徑方法以前,必須先介紹一種簡單的控制流表示方法,即流圖。流圖是對待測試程序過程處理的一種表示。流圖使用下面的符號描述邏輯控制流,每一種結構化構成元素有一個相應的流圖符號。
圖3 流圖符號
流圖只有二種圖形符號
任何過程設計都要被翻譯成控制流圖。
在將程序流程圖簡化成控制流圖時,應注意:
圖4 控制流圖
若是判斷中的條件表達式是由一個或多個邏輯運算符 (OR, AND) 鏈接的複合條件表達式,則須要改成一系列只有單條件的嵌套的判斷。
獨立路徑:至少沿一條新的邊移動的路徑
圖6 獨立路徑
對以上路徑的遍歷,就是至少一次地執行了程序中的全部語句
第一步:畫出控制流圖
流程圖用來描述程序控制結構。可將流程圖映射到一個相應的流圖(假設流程圖的菱形決定框中不包含複合條件)。
圖7 程序流程圖
圖8 程序流程圖和對應的控制流圖
第二步:計算圈複雜度
圈複雜度是一種爲程序邏輯複雜性提供定量測度的軟件度量,將該度量用於計算程序的基本的獨立路徑數目,爲確保全部語句至少執行一次的測試數量的上界。
獨立路徑必須包含一條在定義以前未曾用到的邊。
有如下三種方法計算圈複雜度:
第三步:導出測試用例
根據上面的計算方法,可得出四個獨立的路徑。(一條獨立路徑是指,和其餘的獨立路徑相比,至少引入一個新處理語句或一個新判斷的程序通路。V(G)值正好等於該程序的獨立路徑的條數。)
第四步:準備測試用例
爲了確保基本路徑集中的每一條路徑的執行,根據判斷結點給出的條件,選擇適當的數據以保證某一條路徑能夠被測試到,知足上面例子基本路徑集的測試用例是:
路徑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
必須注意,一些獨立的路徑,每每不是徹底孤立的,有時它是程序正常的控制流的一部分,這時,這些路徑的測試能夠是另外一條路徑測試的一部分。
導出控制流圖和決定基本測試路徑的過程均須要機械化,爲了開發輔助基本路徑測試的軟件工具,稱爲圖形矩陣(graph matrix)的數據結構頗有用。
利用圖形矩陣能夠實現自動地肯定一個基本路徑集。一個圖形矩陣是一個方陣
對每一個矩陣項加入鏈接權值(link weight),圖矩陣就能夠用於在測試中評估程序的控制結構,鏈接權值爲控制流提供了另外的信息。最簡單狀況下,鏈接權值是 1(存在鏈接)或0(不存在鏈接),可是,鏈接權值能夠賦予更有趣的屬性:
圖9 圖形矩陣
鏈接權爲「1」表示存在一個鏈接,在圖中若是一行有兩個或更多的元素「1」,則這行所表明的結點必定是一個斷定結點,經過鏈接矩陣中有兩個以上(包括兩個)元素爲「1」的個數,就能夠獲得肯定該圖圈複雜度的另外一種算法。
前面所述的基本路徑測試技術是控制結構測試技術之一。儘管基本路徑測試簡單高效,可是,其自己並不充分。下面討論控制結構測試的其餘變種,這些測試覆蓋並提升了白盒測試的質量。包括:
條件測試方法注重於測試程序中的條件。是檢查程序模塊中所包含邏輯條件的測試用例設計方法。
程序中的條件分爲簡單條件和複合條件。
簡單條件是一個布爾變量或一個可能帶有NOT(「!」)操做符的關係表達式。關係表達式的形式如:
E1<關係操做符>E2
其中E1和E2是算術表達式,而<關係操做符>是下列之一:「<」、「≤」、「=」、「≠」(「!=」)、「>」、或「≥」。
複合條件由簡單條件經過邏輯運算符(AND、OR、NOT)和括號鏈接而成,不含關係表達式的條件稱爲布爾表達式。
因此條件的成分類型包括:布爾操做符、布爾變量、布爾括弧(括住簡單或複雜條件)、關係操做符、算術表達式。
條件測試是測試程序條件錯誤和程序的其餘錯誤。若是程序的測試集可以有效地檢測程序中的條件錯誤,則該測試集可能也會有效地檢測程序中的其餘錯誤。此外,若是測試策略對檢測條件錯誤有效,則它也可能有效地檢測程序錯誤。
有n個變量的布爾表達式須要2n個可能的測試(n>0)。這種策略能夠發現布爾操做符、變量和括弧的錯誤,可是隻有在n很小時實用。
分支測試多是最簡單的條件測試策略,它是真假分支必須至少執行一次的路徑策略,對於複合條件C,C的真分支和假分支以及C中的每一個簡單條件都須要至少執行一次。
域測試是對於大於、小於和等於值的測試路徑策略。域測試要求從有理表達式中導出三個或四個測試,有理表達式的形式如:
E1<關係操做符>E2
須要三個測試分別用於計算E1的值是大於、等於或小於E2的值。若是<關係操做符>錯誤,而E1和E2正確,則這三個測試可以發現關係算子的錯誤。爲了發現E1和E2的錯誤,計算E1小於或大於E2的測試應使兩個值間的差異儘量小。
若是在一個斷定的複合條件表達式中每一個布爾變量和關係運算符最多隻出現一次,並且沒有公共變量,應用一種稱之爲BRO(分支與關係運算符)的測試法能夠發現多個布爾運算符或關係運算符錯,以及其餘錯誤。
BRO策略引入條件約束的概念。設有n個簡單條件的複合條件C,其條件約束爲D= (D1,D2,…,Dn) ,其中Di(0<i≤n)是條件C中第i個簡單條件的輸出約束。若是在C的執行過程當中,其每一個簡單條件的輸出都知足D中對應的約束,則稱條件C的條件約束D由C的執行所覆蓋。對於布爾變量或布爾表達式B,B的輸出約束必須是真(t)或假(f);對於關係表達式,其輸出約束爲符號>、=、< 。
循環測試是一種白盒測試技術,注重於循環構造的有效性。
有四種循環:簡單循環,串接(連鎖)循環,嵌套循環、不規則循環。
圖10 循環結構
對於簡單循環,測試應包括如下幾種,其中的n表示循環容許的最大次數。
對於嵌套循環,不能將簡單循環的測試方法簡單地擴大到嵌套循環,由於可能的測試數目將隨嵌套層次的增長呈幾何倍數增加。這可能致使一個天文數字的測試數目。下面是一種有助於減小測試數目的測試方法。
從最內層循環開始,設置全部其餘層的循環爲最小值;
對於串接循環,要區別兩種狀況。
對於非結構循環,不能測試,應從新設計循環結構,使之成爲其它循環方式,而後再進行測試。
對OO軟件的類測試至關於傳統軟件的單元測試。和傳統軟件的單元測試不一樣,他每每關注模塊的算法細節和模塊接口間流動的數據,OO軟件的類測試是由封裝在類中的操做和類的狀態行爲所驅動的。OO軟件測試的特色:
類測試通常有兩種主要的方式:
功能性測試和結構性測試,即對應於傳統結構化軟件的黑盒測試和白盒測試:
結構性測試對類中的方法進行測試,它把類做爲一個單元來進行測試。測試分爲兩層:
每一個方法的測試要求能針對其全部的輸入狀況,但這樣還不夠,只有對這些方法之間的接口也作一樣測試,才能認爲測試是完整的。
對於一個類的測試要保證類在其狀態的表明集上可以正確工做,構造函數的參數選擇以及消息序列的選擇都要知足這一準則。所以,在這兩個不一樣的測試層次上應分別作到:
內存資源泄漏檢查:Numega中的bouncechecker,Rational的Purify等;
代碼覆蓋率檢查:Numega中的truecoverage,Rational的Purecoverage,Telelogic公司的logiscope,Macabe公司的Macabe等;
開源覆蓋率測試軟件gCov等。
確保覆蓋語句 | 確保覆蓋分支 | 確保覆蓋條件 | 確保覆蓋條件組合 | 確保覆蓋基本路徑 | ||
邏輯驅動測試 | 語句覆蓋 | 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 |
注意:
「白盒」法全面瞭解程序內部邏輯結構、對全部邏輯路徑進行測試。「白盒」法是窮舉路徑測試。在使用這一方案時,測試者必須檢查程序的內部結構,從檢查程序的邏輯着手,得出測試數據。貫穿程序的獨立路徑數是天文數字。但即便每條路徑都測試了仍然可能有錯誤: