【轉】白盒測試及其基本方法


一、

       白盒測試也稱結構測試或邏輯驅動測試,它是按照程序內部的結構測試程序,通過測試來檢測產品內部動作是否按照設計規格說明書的規定正常進行,檢驗程序中的每條通路是否都能按預定要求正確工作。 這一方法是把測試對象看作一個打開的盒子,測試人員依據程序內部邏輯結構相關信息,設計或選擇測試用例,對程序所有邏輯路徑進行測試,通過在不同點檢查程序的狀態,確定實際的狀態是否與預期的狀態一致。

 二、概述

        白盒測試又稱結構測試、透明盒測試、邏輯驅動測試或基於代碼的測試。白盒測試是一種測試用例的設計方法,盒子對應的是被測試的測試,"白盒"法全面了解程序內部邏輯結構、對所有邏輯路徑進行測試。"白盒"法是窮舉路徑測試。測試者必須檢查程序的內部結構,從檢查程序的邏輯着手,得出測試數據。

三、基本方法

強度由低到高:語句覆蓋、判定覆蓋、條件覆蓋、判定條件覆蓋、條件組合覆蓋、路徑覆蓋。

(1)語句覆蓋:就是設計若干個測試用例,運行被測程序,使得每一可執行語句至少執行一次。

(2)判定覆蓋:使設計的測試用例保證程序中每個判斷的每個取值分支至少經歷一次。

(3)條件覆蓋:條件覆蓋是指選擇足夠的測試用例,使得運行這些測試用例時,判定中每個條件的所有可能結果至少出現一次,但未必能覆蓋全部分支

(4)判定條件覆蓋:判定-條件覆蓋就是設計足夠的測試用例,使得判斷中每個條件的所有可能取值至少執行一次,同時每個判斷的所有可能判斷結果至少執行,即要求各個判斷的所有可能的條件取值組合至少執行一次。

(5)條件組合覆蓋:在白盒測試法中,選擇足夠的測試用例,使所有判定中各條件判斷結果的所有組合至少出現一次,滿足這種覆蓋標准成為條件組合覆蓋。

(6)路徑覆蓋:是每條可能執行到的路徑至少執行一次。

補充:(1)語句覆蓋在所有的測試方法中是一種最弱的覆蓋。

(2)判定覆蓋和條件覆蓋比語句覆蓋強,滿足判定/條件覆蓋標准的測試用例一定也滿足判定覆蓋、條件覆蓋和語句覆蓋(3)路徑覆蓋也是一種比較強的覆蓋,但未必考慮判定條件結果的組合,並不能代替條件覆蓋和條件組合覆蓋。


四、優缺點
1. 優點
a.迫使測試人員去仔細思考軟件的實現
b.可以檢測代碼中的每條分支和路徑
c.揭示隱藏在代碼中的錯誤
d.對代碼的測試比較徹底
e.最優化
2. 缺點
a.代價昂貴
b.無法檢測代碼中遺漏的路徑和數據敏感性錯誤
c.不驗證規格的正確性
五、白盒測試中設計到圈復雜度的計算
首先要畫出控制流圖(這里不再加以說明)
圈復雜度計算公式為:V(G)=e-n+2。其中,e表示控制流圖中邊的數量,n表示控制流圖中節點的數量。
此外圈復雜度的計算還有更直觀的方法,因為圈復雜度所反映的是“判定條件”的數量,所以圈復雜度實際上就是等於判定節點的數量再加上1,也即控制流圖的區域數,
此外對應與控制流圖區域數還有一個圈復雜度計算公式:V(G)=區域數=判定節點數+1。其中判定節點是控制流圖中出現的判斷條件。
下面附上一個實例,實例並不是很好,但是很全,由於包含細節較多,如有錯誤,還望見諒。

被測程序:尋找最大數程序:max.numbers

 

程序操作說明:從鍵盤輸入3個整數(間隔為空格),找出並輸出其中數值最大的那一個。如果其中有一個以上的最大數(相等的情況),也要表示出來。

 

#include<stdio.h>

 void main()

 {

       int i,a,b,c;

       i = 0;

       while(i<100) {

        printf("Enter numbers: ");

       scanf("%d %d%d",&a,&b,&c);

       if(a>b)

             {

              if(a>c)

              printf("max. a=%d\n",a);

             else if(a==c)

               printf("max. a=c=%d\n",c);

                  else

                 printf("max.c=%d\n",c);

              }

       else{

              if(a==b)

                 {

             if(a>c) 

               printf("max.a=b=%d\n",a);

              else

              if(a==c) 

                printf("max.a=b=c=%d\n",c);

                   else

                    printf("max.c=%d\n",c); 

                  }

            else{

                if(b>c)

               printf("max.b=%d\n",b);

               else

               if(b==c) 

                   printf("max. b=c=%d\n",b);

                    else

                      printf("max. c=%d\n",c);

             }

            }

          i++;

         }

    }

  

實驗要求:依據語句覆蓋、判斷覆蓋、條件覆蓋、判斷/條件覆蓋、條件組合覆蓋、基本路徑測試分別給出測試用例。基本路徑測試要求畫出程序流圖、控制流圖、計算圈復雜度、給出路徑並導出測試用例。

 

整個程序對應的流程圖如下和控制流圖對應如下:

 

(1)    語句覆蓋

由控制流圖可知:測試用例需要9組

a.      a=3,b=2,c=1

路徑經過為:1,3,4,5,6,7,8,10,11,16.38,39

b.     a=2,b=1,c=2

路徑經過為:1,3,4,5,6,7,8,10,12,13,16.38,39

c.      a=2,b=1,c=3

路徑經過為:1,3,4,5,6,7,8,10,12,15,16.38,39

d.     a=2,b=2,c=1

路徑經過為:1,3,4,5,6,7,8,18,20,21,27.38,39

e.      a=b=c=2

路徑經過為:1,3,4,5,6,7,8,18,20,23,24,27,38,39

f.      a=2,b=2,c=3

路徑經過為:1,3,4,5,6,7,8,18,20,23,26,27,38,39

g.     a=1,b=3,c=2

路徑經過為:1,3,4,5,6,7,8,18,29,30,37, 38,39

h.     a=1,b=2,c=2

路徑經過為:1,3,4,5,6,7,8,18,29,32,33,37, 38,39

i.       a=1,b=2,c=3

路徑經過為:1,3,4,5,6,7,8,18,29,32,35,37, 38,39

 

(2)    判斷覆蓋

 

由控制流圖可知:測試用例需要9組

a.      a=3,b=2,c=1

路徑經過為:1,3,4,5,6,7,8,10,11,16.38,39

b.     a=2,b=1,c=2

路徑經過為:1,3,4,5,6,7,8,10,12,13,16.38,39

c.      a=2,b=1,c=3

路徑經過為:1,3,4,5,6,7,8,10,12,15,16.38,39

d.     a=2,b=2,c=1

路徑經過為:1,3,4,5,6,7,8,18,20,21,27.38,39

e.      a=b=c=2

路徑經過為:1,3,4,5,6,7,8,18,20,23,24,27,38,39

f.      a=2,b=2,c=3

路徑經過為:1,3,4,5,6,7,8,18,20,23,26,27,38,39

g.     a=1,b=3,c=2

路徑經過為:1,3,4,5,6,7,8,18,29,30,37, 38,39

h.     a=1,b=2,c=2

路徑經過為:1,3,4,5,6,7,8,18,29,32,33,37, 38,39

i.       a=1,b=2,c=3

路徑經過為:1,3,4,5,6,7,8,18,29,32,35,37, 38,39

 

(3)  條件覆蓋

整個測試所覆蓋的條件:

1.a>b 真為T1,假為F1

2.a>c 真為T2,假為F2

3.a=c 真為T3,假為F3

4.a=b 真為T4,假為F4

5.b>c 真為T5,假為F5

6.b=c 真為T6,假為F6

 

測試用例

覆蓋條件

具體條件取值

a=3,b=2,c=1

T1,T2

a>b,a>c

a=2,b=1,c=2

T1, F2,T3

a>b ,a=c

a=2,b=1,c=3

T1,F2,F3

a>b,a<=c,

a=2,b=2,c=1

F1,T4,T2

a=b,a>c

a=b=c=2

F1,T4,F2,T3

a=b=c

a=2,b=2,c=3

F1,T4,F2,F3

a=b,a<c

a=1,b=3,c=2

F1,F4,T5

a<b,b>c

a=1,b=2,c=2

F1,F4,F5,T6

a<b,b=c

a=1,b=2,c=3

F1,F4,F5,F6

a<b,b<c

 

(4)  判斷/條件覆蓋

 

a.      a=3,b=2,c=1

覆蓋路徑經過為:1,3,4,5,6,7,8,10,11,16.38,39

覆蓋條件:T1,T2

b.     a=2,b=1,c=2

路徑經過為:1,3,4,5,6,7,8,10,12,13,16.38,39

覆蓋條件:T1, F2,T3

c.      a=2,b=1,c=3

路徑經過為:1,3,4,5,6,7,8,10,12,15,16.38,39

覆蓋條件:T1,F2,F3

d . a=2,b=2,c=1

路徑經過為:1,3,4,5,6,7,8,18,20,21,27.38,39

覆蓋條件:F1,T4,T2

e.      a=b=c=2

路徑經過為:1,3,4,5,6,7,8,18,20,23,24,27,38,39

覆蓋條件:F1,T4,F2,T3

f.      a=2,b=2,c=3

路徑經過為:1,3,4,5,6,7,8,18,20,23,26,27,38,39

覆蓋條件:F1,T4,F2,F3

g.     a=1,b=3,c=2

路徑經過為:1,3,4,5,6,7,8,18,29,30,37, 38,39

覆蓋條件:F1,F4,T5

h.  a=1,b=2,c=2

路徑經過為:1,3,4,5,6,7,8,18,29,32,33,37, 38,39

覆蓋條件:F1,F4,F5,T6

i.                   a=1,b=2,c=3

路徑經過為:1,3,4,5,6,7,8,18,29,32,35,37, 38,39

覆蓋條件:F1,F4,F5,F6

 

(5)  條件組合覆蓋

所有可能的條件組合:

編號

覆蓋條件

判定條件

具體條件

1

T1,T2

8取Y,10取Y

a>b,a>c

2

T1, F2,

8取Y,10取N,

a>b,a<=c

3

F2,T3

10取N,12取Y

a=c

4

F2,F3

10取N,12取N

a<c

5

F1,T4

8取N,18取Y

a=b

6

F1,F4

8取N,18取N

a<b

7

T4,T2

18取Y,20取Y

a=b,a>c

8

T4,F2

18取Y,20取N

a=b,a<=c

9

F2,T3

20取N,23取Y

a=c

10

F2,F3

20取N,23取N

a<c,

11

F4,T5

18取N,29取Y

a<b,b>c

12

F4,F5

18取N,29取N

a<b,b<=c

13

F5,T6

29取N,32取Y

b<=c,b==c

14

F5,F6

29取N,32取N

b<c

1.a>b 真為T1,假為F1

2.a>c 真為T2,假為F2

3.a=c 真為T3,假為F3

4.a=b 真為T4,假為F4

5.b>c 真為T5,假為F5

6.b=c 真為T6,假為F6

 

 

測試用例:

測試用例

覆蓋條件

覆蓋組合

具體條件取值

a=3,b=2,c=1

T1,T2

1

a>b,a>c

a=2,b=1,c=2

T1, F2,T3

2,3

a>b ,a=c

a=2,b=1,c=3

T1,F2,F3

2,4

a>b,a<=c,

a=2,b=2,c=1

F1,T4,T2

5,7

a=b,a>c

a=b=c=2

F1,T4,F2,T3

5,8,3

a=b=c

a=2,b=2,c=3

F1,T4,F2,F3

5,8,4

a=b,a<c

a=1,b=3,c=2

F1,F4,T5

6,11

a<b,b>c

a=1,b=2,c=2

F1,F4,F5,T6

6,12,13

a<b,b=c

a=1,b=2,c=3

F1,F4,F5,F6

6,12,14

a<b,b<c

 

(7)基本路徑測

 

a.      a=3,b=2,c=1

路徑經過為:1,3,4,5,6,7,8,10,11,16.38,39

b.     a=2,b=1,c=2

路徑經過為:1,3,4,5,6,7,8,10,12,13,16.38,39

c.      a=2,b=1,c=3

路徑經過為:1,3,4,5,6,7,8,10,12,15,16.38,39

d.     a=2,b=2,c=1

路徑經過為:1,3,4,5,6,7,8,18,20,21,27.38,39

e.      a=b=c=2

路徑經過為:1,3,4,5,6,7,8,18,20,23,24,27,38,39

f.      a=2,b=2,c=3

路徑經過為:1,3,4,5,6,7,8,18,20,23,26,27,38,39

g.     a=1,b=3,c=2

路徑經過為:1,3,4,5,6,7,8,18,29,30,37, 38,39

h.     a=1,b=2,c=2

路徑經過為:1,3,4,5,6,7,8,18,29,32,33,37, 38,39

i.       a=1,b=2,c=3

路徑經過為:1,3,4,5,6,7,8,18,29,32,35,37, 38,39

 

每個測試用例對應的路徑:

路徑1:  1-3-4-5-6-7-8-10-11-16-38-39

路徑2: 1-3-4-5-6-7-8-10-12-13-16-38-39

路徑3: 1-3-4-5-6-7-8-10-12-15-16-38-39

路徑4: 1-3-4-5-6-7-8-18-20-21-27-37-38-39

路徑5: 1-3-4-5-6-7-8-18-20-23-24-27-37-38-39

路徑6:1-3-4-5-6-7-8-18-20-23-26-27-37-38-39

路徑7: 1-3-4-5-6-7-8-18-29-30-36-37-38-39

路徑8:1-3-4-5-6-7-8-18-29-32-33-36-37-38-39

路徑9:1-3-4-5-6-7-8-18-29-32-35-36-37-38-39

 

圈復雜度V(G)=判斷節點數+1=9+1=10

 


---------------------
版權聲明:本文為CSDN博主「Gavin-Zhang」的原創文章,遵循CC 4.0 by-sa版權協議,轉載請附上原文出處鏈接及本聲明。
原文鏈接:https://blog.csdn.net/u013457642/article/details/41680853


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM