白盒測試:通過檢測軟件內部的邏輯結構,對軟件中的邏輯路徑進行覆蓋測試;在程序不同地方設立檢查點,檢查程序的狀態,以確定實際運行狀態與預期狀態是否一致。
白盒測試也稱結構測試或邏輯驅動測試,它是知道產品內部工作過程,可通過測試來檢測產品內部動作是否按照規格說明書的規定正常進行,按照程序內部的結構測試程序,檢驗程序中的每條通路是否都有能按預定要求正確工作,而不顧它的功能,白盒測試的主要方法有邏輯測試、基路測試等,主要用於軟件內部結構的驗證。
主要包含六種測試方法:語句覆蓋、判定覆蓋、條件覆蓋、判定條件覆蓋、條件組合覆蓋、路徑覆蓋。
覆蓋測試用例表:
編號 | …… | 執行路徑 | 備注 |
---|
注意:設計測試用例時,最好把已經覆蓋的條件划掉,以免重復或遺漏,直到所有條件都被划掉。
例子
以下是一個程序段:
if((a>1)&&(b=0))
c = c/a;
if((a=2)||(c>1))
c = c+1;
對應的程序流程圖如下:
語句覆蓋
語句覆蓋(Statement Coverage, SC):是最起碼的結構覆蓋要求,語句覆蓋要求設計足夠多的測試用例,使得程序中每條語句至少被執行一次。
測試用例:
編號 | a | b | c | 執行路徑 | 備注(語句) |
---|---|---|---|---|---|
1 | 2 | 0 | 5 | ACE | (a>1)... c=c/a (a=2)... c=c+1 |
這樣,(a>1)...、c=c/a、(a=2)...、c=c+1上面所有語句都被覆蓋了。
- 優點:
很直觀地從代碼中得到測試用例,無需細分每條判定表達式。 - 缺點:
對於隱藏的條件和可能到達的隱式分支是無法測試的。它只在乎運行一次,而不考慮其他情況,可以說語句覆蓋是最弱的邏輯覆蓋准則。
判定覆蓋
判定覆蓋(Decision Coverage, DC):又稱分支覆蓋,它要求設計足夠多的測試用例,使得程序中每個判定至少,即 程序中的每個分支至少執行一次。
測試用例:
編號 | a | b | c | 執行路徑 | 備注(分支) |
---|---|---|---|---|---|
1 | 2 | 0 | 3 | ACE | ACE |
2 | 1 | 0 | 1 | ABD | BD |
這樣,ABCDE所有分支都被覆蓋了。
- 優點:
分支覆蓋是比語句覆蓋更強的測試能力,比語句覆蓋要多幾乎一倍的測試路徑。它無需細分每個判定中的條件就可以得到測試用例。 - 缺點:
往往大部分的判定語句是多個邏輯條件組合而成,若僅僅判斷其最終結果,而忽略每個條件的取值必然會遺漏部分的測試路徑。未深入測試復合判定表達式的細節,仍存在測試漏洞。
條件覆蓋
條件覆蓋(Condition Coverage, CC):要求設計足夠多的測試用例,使得判定中的每個條件獲得各種可能的結果,即 每個條件至少都獲得一次“真”值和“假”值。
注意:這里的條件和判定並不是一個概念,而是多個條件組成一個判定。
判定一條件:a>1,b=0
判定二條件:a=2,c>1判定一條件所有可能結果:a>1,a≤1; b=0,b≠0;
判定二條件所有可能結果:a=2,a≠2; c>1,c≤1;
測試用例:
編號 | a | b | c | 執行路徑 | 備注(條件) |
---|---|---|---|---|---|
1 | 2 | 0 | 3 | ACE | a>1,b=0,a=2,c>1 |
2 | 1 | 1 | 1 | ABD | a≤1,b≠0,a≠2,c≤1 |
設計測試用例時,最好把已經覆蓋的條件划掉,以免重復或遺漏,直到:
- 判定一條件所有可能結果:
a>1,a≤1,b=0,b≠0 判定二條件所有可能結果:
a=2,a≠2,c>1,c≤1優點:
條件覆蓋比分支覆蓋增加了對符合判定情況的測試,增加了測試的路徑。缺點:
設計若干測試用例,執行被測程序以后,要使每個判斷中每個條件可能的取值至少滿足一次;但覆蓋了條件的測試用例不一定覆蓋了判定。例如:(1,0,3)和(2,1,1),滿足條件覆蓋,但不滿足判定覆蓋。
判定/條件覆蓋
判定/條件覆蓋(Decision/Condition Coverage, D/CC):要求設計足夠多的測試用例,使得判定中每個條件取到各種可能的值,並使每個判定取到各種可能的值。
注意:判定是很好取各種值的,但是條件比較多可能存在遺漏,所以先滿足條件后滿足判定。
判定一條件所有可能結果:a>1,a≤1; b=0,b≠0;
判定二條件所有可能結果:a=2,a≠2; c>1,c≤1;判定一:T、F
判定二:T、F
編號 | a | b | c | 執行路徑 | 備注(判定/條件) |
---|---|---|---|---|---|
1 | 2 | 0 | 3 | ACE | a>1,b=0,a=2,c>1 T,T |
2 | 1 | 1 | 1 | ABD | a≤1,b≠0,a≠2,c≤1 F,F |
- 優點:
判定/條件覆蓋測試既滿足判定覆蓋准則又滿足條件覆蓋准則,彌補了二者的不足。 - 缺點:
判定/條件覆蓋測試既未滿足條件組合覆蓋,又忽略了路徑覆蓋的問題。其沒有考慮單個判定對整體結果的影響,無法發現程序中的邏輯錯誤。
條件組合覆蓋
條件組合覆蓋(Condition Combination Coverage, CCC):要求設計足夠多的測試用例,使得每個判定中條件的各種組合都至少出現一次。
- 判定一條件組合:
- ①:a>1,b=0
- ②:a>1,b≠0
- ③:a≤1,b=0
- ④:a≤1,b≠0
- 判定二條件組合:
- ⑤:a=2,c>1
- ⑥:a=2,c≤1
- ⑦:a≠2,c>1
- ⑧:a≠2,c≤1
編號 | a | b | c | 執行路徑 | 備注(條件組合) |
---|---|---|---|---|---|
1 | 2 | 0 | 3 | ACE | ①⑤ |
2 | 2 | 1 | 1 | ABC | ②⑥ |
3 | 1 | 0 | 3 | ABE | ③⑦ |
4 | 1 | 1 | 1 | ABD | ④⑧ |
優點:
條件組合覆蓋使得每個判定中條件的各種可能組合都至少出現一次。缺點:
條件組合覆蓋忽略了路徑覆蓋的問題。
路徑覆蓋
路徑覆蓋(Path Coverage, PC):要求設計足夠多的測試用例,使得程序中所有可能的路徑組合都被覆蓋。
- 判定一分為兩條路徑:T、F
判定二分為兩條路徑:T、F
編號 | a | b | c | 執行路徑 | 備注(路徑組合) |
---|---|---|---|---|---|
1 | 1 | 0 | 1 | ABD | F,F |
2 | 2 | 1 | 1 | ABE | F,T |
3 | 3 | 0 | 1 | ACD | T,F |
4 | 2 | 0 | 3 | ACE | T,T |
優點:
路徑覆蓋是經常要用到的測試覆蓋方法,它比普通的判定覆蓋准則和條件覆蓋准則覆蓋率都要高。缺點:
路徑覆蓋不一定能保證條件的所有組合都覆蓋。由於路徑覆蓋需要對所有可能的路徑進行測試(包括循環、條件組合、分支選擇等),那么需要設計大量、復雜的測試用例,使得工作量呈指數級增長。注意:為了解決這個難題,只有把覆蓋路徑壓縮到一定的限度內,如 程序中的循環體只執行一次。
在實際測試中,即使對於數目很有限的程序已經做到路徑覆蓋,仍然不能保證被測程序的正確性,還需要采取其他測試方法進行補充。