一、什麼是白盒測試
白盒測試又稱結構測試、邏輯驅動測試或基于代碼的測試。
白盒測試是一種測試用例設計方法,盒子指的是被測試的軟體,白盒指的是盒子是可視的,即清楚盒子内部的東西以及裡面是如何運作的。
"白盒"法需要測試者了解程式内部邏輯結構,對所有邏輯路徑進行測試,也就是說,"白盒"法是“窮舉路徑測試”。
二、白盒測試的分類
總體上分為靜态分析和動态分析兩大類。
靜态分析:不需要執行程式,就可以進行的測試,例如:代碼審查、代碼掃描
動态分析:需要執行程式,才可以進行的測試,例如:單元測試、覆寫測試
三、白盒測試的設計方法
四、白盒測試靜态方法
靜态方法關注代碼是否符合已制定的編碼規範、發現潛在的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. 缺點
- 投入成本高昂
- 覆寫所有代碼路徑難度大
- 不能替代內建測試