一、什么是白盒測試
白盒測試又稱結構測試、邏輯驅動測試或基於代碼的測試。
白盒測試是一種測試用例設計方法,盒子指的是被測試的軟件,白盒指的是盒子是可視的,即清楚盒子內部的東西以及里面是如何運作的。
"白盒"法需要測試者了解程序內部邏輯結構,對所有邏輯路徑進行測試,也就是說,"白盒"法是“窮舉路徑測試”。
二、白盒測試的分類
總體上分為靜態分析和動態分析兩大類。
靜態分析:不需要執行程序,就可以進行的測試,例如:代碼審查、代碼掃描
動態分析:需要執行程序,才可以進行的測試,例如:單元測試、覆蓋測試
三、白盒測試的設計方法
四、白盒測試靜態方法
靜態方法關注代碼是否符合已制定的編碼規范、發現潛在的bug或漏洞,更強調開發人員的參與。或者直接交給自動化代碼檢查工具去做,如SonarQube等
如何開展靜態方法,可參考:
https://blog.csdn.net/chichichi0813/article/details/80814596
五、白盒測試動態方法
動態方法是白盒測試人員主要參與的環節。
1、邏輯覆蓋法
原則:以程序內部的邏輯結構為基礎設計測試用例。
邏輯覆蓋包括語句覆蓋、判定覆蓋、條件覆蓋、判定/條件覆蓋、條件組合覆蓋和路徑覆蓋。
以上六種覆蓋標准發現錯誤的能力呈由弱到強變化:
- 語句覆蓋每條語句至少執行一次。
- 判定覆蓋每個判定的每個分支至少執行一次。
- 條件覆蓋每個判定的每個條件應取到各種可能的值。
- 判定條件覆蓋同時滿足判定覆蓋條件覆蓋。
- 條件組合覆蓋每個判定中各條件的每一種組合至少出現一次。
- 路徑覆蓋使程序中每一條可能的路徑至少執行一次。
之所以六種覆蓋標准發現錯誤的能力有差異,是因為使用每種覆蓋標准所設計的測試用例對程序內部邏輯的覆蓋率不同。
覆蓋率是什么?
覆蓋率是用來度量測試完整性的一個指標。
以下圖的示例代碼為例,分別說明每種覆蓋標准的測試覆蓋率。
1.1、語句覆蓋(SC)
語句覆蓋:設計足夠多的測試用例,使得運行這些測試用例時,被測程序的每一個語句至少執行一次,其覆蓋標准無法發現運算中的邏輯關系錯誤。
示例代碼中共有4條可執行語句
設計測試用例執行了3條,語句覆蓋率為3/4=75%
1.2、判定覆蓋(DC)
判定覆蓋:設計足夠多的測試用例,使得程序中的每一個判斷至少獲得一次“真”和一次“假”,即使得程序流程圖中的每一個真假分支至少被執行一次。
但若程序中的判定是有幾個條件聯合構成時,未必能發現每個條件的錯誤。
示例代碼中有判定2個,判定結果4個
設計測試用例執行了3個分支,分支覆蓋率為3/4=75%
1.3、條件覆蓋(CC)
條件覆蓋:設計足夠多的測試用例,使得運行這些測試用例時,使得判定中的每個條件至少有一次取真值,有一次取假值。
但未必能覆蓋全部分支。
案例代碼中有判定2個,條件3個,條件結果6個
設計測試用例執行了5個條件結果,條件覆蓋率為5/6=83%
1.4、判定/條件覆蓋(DCC)
判定/條件覆蓋:設計足夠多的測試用例,使得被測試程序中的每個判斷本身的判定結果(真假)至少滿足一次,同時,每個邏輯條件的可能值(真假)也至少被滿足一次。
即同時滿足100%判定覆蓋和100%條件覆蓋的標准。
示例代碼中有判定2個,條件3個,判定結果4個,條件結果6個
設計測試用例執行了3個判定結果,5個條件結果,判定條件覆蓋率為:(3+5)/(4+6)=80%
1.5、條件組合覆蓋(BCCC)
條件組合覆蓋:設計足夠多的測試用例,使得被測試程序中的每個判定中條件結果的所有可能組合至少執行一次。
顯然,滿足“條件組合覆蓋”的測試用例是一定滿足“判定覆蓋”、“條件覆蓋”和“判定/條件覆蓋”的。
示例代碼中有判定2個,條件3個(判定1有2個條件,判定2有1個條件),判定1的條件組合為4個,判定2的條件組合為2個
設計測試用例執行了5個條件組合,條件組合覆蓋率為:5/(4+2)=83%
1.6、路徑覆蓋
路徑覆蓋:設計足夠多的測試用例,覆蓋被測試程序中的所有可能路徑,是最強的覆蓋准則。
案例代碼中共有4條路徑
設計測試用例執行了3條路徑,路徑覆蓋率為3/4=75%
2、基本路徑測試法
理想情況下,路徑覆蓋需要覆蓋程序中所有可能的路徑。但在路徑數目很大時,真正做到完全覆蓋是很困難的,
必須把覆蓋路徑數目壓縮到一定限度。例如程序中的循環體只執行一次。
所以,基本路徑測試法可以理解為壓縮后的路徑覆蓋。
基本路徑測試法如何操作?
在程序控制流圖的基礎上,通過分析程序的環路復雜性,導出基本可執行路徑集合,從而設計測試用例。
程序的控制流圖:描述程序控制流的一種圖示方法
程序環路復雜度:McCabe復雜性度量。從程序的環路復雜性可導出程序基本路徑集合中的獨立路徑條數。
導出測試用例:根據圈復雜度和程序結構設計用例數據輸入和預期結果。
准備測試用例:確保基本路徑集中的每一條路徑的執行。
步驟:
六、白盒測試的特點
展開:
1. 優點
- 可以檢測代碼中的每條分支和路徑
- 揭示隱藏在代碼中的錯誤
- 對代碼的測試比較徹底
- 讓軟件最優化
2. 缺點
- 投入成本高昂
- 覆蓋所有代碼路徑難度大
- 不能替代集成測試