路徑分析與測試
1.基礎路徑:
基本路徑是指所有程序路徑作爲一個集合,在這些路徑當中必然存在一個最小路徑的集合。基本路徑測試通過確定測試用例是否完全覆蓋基本路徑而進行測試。
基本路徑測試法是在程序控制流圖的基礎上,通過分析控制構造環路複雜性,導出基本可執行路徑集合,設計測試用例。
2.基本路徑的測試方法:
基本路徑測試法主要步驟如下所示。
步驟一:以詳細設計或源代碼作爲基礎,導出程序的控制流圖。
步驟二:計算控制流圖G的圈複雜度V(G)。 圈複雜度爲程序邏輯複雜性提供定量的測度,該度量用於計算程序的基本獨立路徑數目,確保所有語句至少執行一次的測試數量的上界。
步驟三:確定獨立路徑的集合,即確定線性無關的路徑的基本集。獨立路徑是指至少引入程序的一個新處理語句集合或一個新條件的路徑,即獨立路徑必須包含一條在定義之前不曾使用的邊。
步驟四:測試用例生成,確保基本路徑集中每條路徑的執行。
3.計算圈複雜度的方法:
方法一:控制流圖G的圈複雜度V(G)的定義爲V(G)=E-N+2,E是圖中邊的數量,N是圖中結點的數量。
方法二:將圈複雜度定義爲控制流圖中的區域數。
方法三:V(G)=P+1,P是控制流圖G中判定(謂詞)結點的數量。
方法四:將控制流圖轉化爲連接矩陣,根據圖5.5原理,可得圖5.6中的判定結點爲4,故圈複雜度同樣爲5。
4.獨立路徑表示
獨立路徑:所謂獨立路徑,是指至少包含一條新邊的路徑,也就是包含一些前面的路徑未包含的語句。
路徑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
5.Z路徑覆蓋
爲解決實際操作中路徑覆蓋難以實現問題,必須捨棄一些次要因素,簡化循環結構,從而極大地減少路徑的數量,使得覆蓋這些有限的路徑成爲可能。採用簡化循環方法的路徑覆蓋就是Z路徑覆蓋。
所謂簡化循環就是減少循環的次數,不考慮循環體的形式和複雜度如何,也不考慮循環體實際上需要執行多少次,只考慮通過循環體零次和一次這兩種情況。零次循環是指跳過循環體,從循環體的入口直接到循環體的出口。通過一次循環體是指檢查循環初始值。根據簡化循環的思路,循環要麼執行,要麼跳過,這和判定分支的效果是一樣的可見,簡化循環就是將循還結構編程選擇結構。
6.獨立路徑測試及測試用例生成
獨立路徑測試法主要步驟如下所示。
第一步:以詳細設計或源代碼作爲基礎,導出程序的控制流圖。
第二步:計算環路複雜度V(G)
圈複雜度爲程序邏輯複雜性提供定量的測度,該度量用於計算程序的基本獨立路徑數目,確保所有語句至少執行一次的測試數量的上界。
計算如下:
流圖中有四個區城;
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
根據上面的獨立路徑,去設計輸入數據使程序分別執行到上面四條路徑
第四步:準備測試用例,確保基本路徑集中每條路徑的執行。
爲了確保基本路徑集中的每一條路徑的執行,根據判斷結點給出的條件,選擇適當的數據以保證某一條路徑可以被測試到,滿足上面例子基本路徑集的測試用例是:
void Sort(int iRecordNum,int iType){
int x=0;
int y=0;
while(iRecordNum-- >0)
{
if( 0 == iType){
x=y+2;
break;
}else{
if(1 == iType)
x=y+10;
else
x=y+20;
}
}
路徑1:4-14
輸入數據:iRecordNum=0,或者取iRecordNum<0的某個取值
預期結果:x=0,y=0;
路徑2: 4-6-7-14
輸入數據: iRecordNum= 1, iType= 0
預期結果: x=2
路徑3: 4-6-8-10-13-4-14
輸入數據: iRecordNum= I, iType= 1
預期結果: x= 10
路徑4: 4-6-8-11-13-4-14
輸入數據: iRecordNum= 1, iType = 2
預期結果: x= 20
7.獨立獨立路徑測試及測試用例生成步驟總結:
流程圖一控制流圖
計算圈複雜度
找到四條基本路徑
根據基本路徑找到輸入輸出
數據流測試分析
控制流一邏輯
數據流一定義和使用
定義使用異常缺陷
變量被定義,但從來沒有使用(引用)
所使用的變量沒有被定義
變量在使用之前被定義兩次
數據流測試指關注變量接收值(點)和使用(或引用)這些值(點)的路徑,是結構性測試方法的一種。
1.定義節點def:
會發現,當且僅當變量v的值是用對應節點,用對應的語句片段所定義時,節點N是變量V的定義節點,執行時與變量相關的存儲單元內內容會改變,其實這就是我們所說的賦值。輸入語句,賦值語句,循環控制語句和過程調用。
2.使用節點use:
輸出語句,賦值語句,條件語句,循環控制語句和過程調用。
3.謂詞使用P-use/計算使用C-use
當且僅當語句原因是謂詞語句時,使用節點use是一個謂詞使用,否側use就是一個所謂的計算使用。
謂詞使用對應謂詞使用的節點的出度>=2
計算使用對應計算使用的節點的出度<=1
3.使用路徑use-path
使用路徑是指PATH中使得對某個節點屬於V的節點中,存在和定義使用節點DEF和USE之間使得M和N是該路徑的所謂最終節點或者最初節點。(定義節點可出現多次)
4.清除路徑dc-path
是具有最初和最終節點,DEF和USE節點、PATH路徑使得路徑中其他的節點都是定義節點(定義節點出現 一次)
使用路徑和清除路徑描述了從值被定義的點到值被使用的點的源數據的數據流。
例如:
變量的定義和使用
1 a=5; //定義a
2 While(C1) {
3 if (C2){
4 b=a*a;//使用a
5 a=a-1;//定義且使用a
6 }
7 print(a); } //使用a
Du-path dc-path
1234 y
1237 y
12345 y
1234567 n
567 y
5.測試用例的產生的步驟:
●選擇定義/使用路徑測試覆蓋指標
●由測試覆蓋指標構造定義/使用路徑
●選擇一條路徑,使得其至少包含一條“定義/使用路徑”
●由路徑產生測試用例
6.定義-使用路徑測試覆蓋指標
數據流指標假設所有程序變量都標識了定義節點和使用節 點,且關於各變量都標識了定義-使用路徑
T:擁有變量集合V的程序P的程序圖G(P)中的一個路徑集合
7.全定義準則
集合T滿足程序b的全定義準則,當且僅當所有變量v∈V,T包含從v的每個定義節點到v的一個使用的定義清除路徑。
8.全使用準則
集合T滿足程序P的全使用準則,當且僅當所有變量v∈V,T包含從v的每個定義節點到v的所有使用以及到所有USE(v,n)後續節點的定義清除路徑。
9.全謂詞使用/部分計算使用準則
集合T滿足一樣的規則,如果這些謂詞使用沒有一個謂詞使用的時候,我們就認爲需要有一個計算使用作爲定義點
10.全計算使用/部分謂詞使用準則
假設如果沒有計算使用,那麼我們會發現所有的定義清除節點就會導致一個謂詞使用。
11.全定義-使用路徑準則
它包含從v到V的一個所有使用以及到所有USE VIN的後續節點所有路徑
定義/使用測試提供一種檢查缺陷可能發生點的嚴格和系統化的方法。
變異測試
儘可能縮小錯誤押索的範圍
1.變異測試(Mutation Testing):
(有時也叫做“變異分析”)是一種在細節方面改進程序源代碼的軟件測試方法。這些所謂的變異,是基於良好定義的變異操作,這些操作或者是模擬典型應用錯誤(例如:使用錯誤的操作符或者變量名字),或者是強制產生有效地測試(例如使得每個表達式都等於0)。目的是幫助測試者發現有效地測試,或者定位測試數據的弱點,或者是在執行中很少(或從不)使用的代碼的弱點。
2.分類
(1)程序強變異測試(程序變異)
(2)程序弱變異測試
3.基本思想
P e1,e2 ,···, en
P' P1,P2 ,···, Pn
P i稱爲P的變異因子測試數據Ci
C={C1,C2,····,Cn}
如果對每一個Ci,P都是正確的,而Pi都是錯誤的,這說明P的正確性較高。
如果對某個Ci, P是錯誤的,而Pi是正確的,這說明P存在錯誤,而錯誤就是ei。
4.缺點
-
需要大量的計算機資源來完成測試充分性分析
-
對於一箇中等規模的軟件,所需的存儲空間巨大
-
運行大量變異因子導致時間上巨大的開銷
-
實際使用中,對故障類型難以把握
-
變異測試侷限性很大
5.強變異
給定一個程序P和一個測試數據集T,通過變異算子爲P產生一組變異體Mi ( 合乎語法的變更),對P和M都使用T進行測試運行,如果某Mi在某個測試輸入t.上與P產生不同的結果,則該Mi 被殺死;若某Mi在所有的測試數據集上都與P產生相同的結果,則稱其爲活的變異體。接下來對活的變異體進行分析,檢查其是否等價於P;對不等價於P的變異體M進行進一步的測試, 直到充分性度量達到滿意的程度。
假設程序P已使用測試T中的測試用例測試通過,而且沒有錯誤。變異是一種輕微改變程序的操作。
C(n)=C(n)+1
n=1,2,3,·····,n;
練習
一、選擇題
1. 以下不屬於白盒測試技術的是( D )。
A. 邏輯覆蓋 B. 基本路徑測試 C. 循環覆蓋測試 D. 等價類劃分
2. 以下不屬於邏輯覆蓋的是( D )。
A. 語句覆蓋 B. 判定覆蓋 C. 條件覆蓋 D. 基本路徑
3. ( A )方法根據輸出對輸入的依賴關係設計測試用例。
A. 路徑測試 B. 等價類 C. 因果圖 D. 歸納測試
4. McCabe建議模塊規模應滿足V(G)≤( A )。
A. 20 B. 10 C. 30 D. 40
5.下列關於覆蓋邏輯,說法錯誤的是( B )
A.滿足條件覆 蓋並不一-定 滿足判斷覆蓋
B.滿足條件組合覆蓋的測試一定滿足判斷覆蓋、條件覆蓋和判定/條件覆蓋
C.滿足路徑覆蓋也- -定滿足條件組合覆蓋
D.滿足判斷1條件覆蓋同時滿足判定覆蓋和條件覆蓋
6.使用白盒測試方法時,確定測試數據應根據( A )和指定的覆蓋標準
A.程序的內部邏輯
B. 程序的複雜程度
C.使用說明書
D.程序的功能
7.白盒測試方法的優點是( C )
A.可測試軟件的特定功能
B. 能站在用戶立場上測試
C.可按軟件內部結構測試
D.可發現實現功能需求中的錯誤
二、簡答題
1. 白盒測試是什麼?白盒測試和黑盒測試的區別體現在哪些方面?
答:
白盒測試也稱結構測試或邏輯驅動測試,它是按照程序內部的結構 測試程序,通過測試來檢測產品內部動作是否按照設計規格說明書的規定正常進 行,檢驗程序中的每條通路是否都能按預定要求正確工作。 這一方法是把測試 對象看作一個打開的盒子, 測試人員依據程序內部邏輯結構相關信息, 設計或選 擇測試用例, 對程序所有邏輯路徑進行測試, 通過在不同點檢查程序的狀態, 確 定實際的狀態是否與預期的狀態一致。
黑盒測試也稱功能測試或數據驅動測試, 它是在已知產品所應具有的 功能, 通過測試來檢測每個功能是否都能正常使用,在測試時,把程序看作一個不能打開的黑盒子, 在完全不考慮程序內部結構和內部特性的情況下, 測試者在 程序接口進行測試,它只檢查程序功能是否按照需求規格說明書的規定正常使 用,程序是否能適當地接收輸入數鋸而產生正確的輸出信息, 並且保持外部信息 (如數據庫或文件)的完整性。黑盒測試方法主要有等價類劃分、邊值分析、因 —果圖、錯誤推測等,主要用於軟件確認測試。 “黑盒”法着眼於程序外部結 構、不考慮內部邏輯結構、針對軟件界面和軟件功能進行測試。 “黑盒”法是窮 舉輸入測試, 只有把所有可能的輸入都作爲測試情況使用, 才能以這種方法查出 程序中所有的錯誤。 實際上測試情況有無窮多個, 人們不僅要測試所有合法的輸 入,而且還要對那些不合法但是可能的輸入進行測試。
白盒測試也稱結構測試或邏輯驅動測試, 它是知道產品內部工作過程, 可通過測試來檢測產品內部動作是否按照規格說明書的規定正常進行, 按照程序 內部的結構測試程序,檢驗程序中的每條通路是否都有能按預定要求正確工作, 而不顧它的功能, 白盒測試的主要方法有邏輯驅動、 基路測試等, 主要用於軟件 驗證。
白盒測試技術 (White Box Testing) : 深入到代碼一級的測試, 使用這種技術 發現問題最早,效果也是最好的。 該技術主要的特徵是測試對象進入了代碼內部, 根據開發人員對代碼和對程序的熟悉程度,對有需要的部分進行在軟件編碼階 段,開發人員根據自己對代碼的理解和接觸所進行的軟件測試叫做白盒測試。 這 一階段測試以軟件開發人員爲主,在 JAVA 平臺使用 Xunit 系列工具進行測 試, Xunit 測試工具是類一級的測試工具對每一個類和該類的方法進行測試
2. 爲什麼說語句覆蓋是最弱的邏輯覆蓋?
答:
語句覆蓋對一些控制結構不敏感,不能發現判斷中邏輯運算符的錯 誤,覆蓋率低。
3. 條件覆蓋爲什麼不一定包含判定覆蓋?
答:
條件覆蓋比判定覆蓋增加了對符合條件情況的測試,增加了測試路 徑,但條件覆蓋只能保證每個條件至少有一次爲真,爲不考慮所有的判定結果。
4.採用白盒法進行測試時,測試用例覆蓋路徑的種類有哪幾種? 它們相互之間是什麼關係?
答:
覆蓋路徑:
1、 語句覆蓋
2 、 判定覆蓋
3 、 條件覆蓋
4 、 判定、條件覆蓋
5 、 條件組合覆蓋
他們之間的關係:
1. 語句覆蓋是很不充分的一種標準。
2. 判斷覆蓋比語句覆蓋更嚴格, 因爲如果每個根治執行過了, 則每個 語句也就執行過了。
3. 條件覆蓋比判斷覆蓋強因爲他使一個判定中的每一個條件都去到兩個不同的結果,而判定覆蓋則不保證這一點。
4. 滿足條件組合覆蓋的測試用例、 是一定滿足判定覆蓋, 條件覆蓋和 判定、條件覆蓋的。
5. 請把下面的程序流程圖轉換成控制流圖。
答: