白盒測試方法
覆蓋測試
路徑測試
最少測試用例數計算
白盒測試:
白盒測試是把測試對象看做一個透明的盒子,它允許測試人員利用程序內部的邏輯結構及有關信息,設計或選擇測試用例,對程序所有邏輯路徑進行測試。
白盒測試也稱結構測試或邏輯驅動測試,是針對被測單元內部是如何進行工作的測試。它根據程序的控制結構設計測試用例,主要用於軟件或程序驗證。
定義:基於系統或者組件的內部實現結構和邏輯尋找缺陷的測試技術
常用測試方法:
邏輯覆蓋法(邏輯驅動測試)
基本路徑測試方法
白盒測試注意事項:
- 由於測試路徑可能非常多,由於時間和資源問題,選出足夠多的路徑測試
- 由於深入到程序編碼,通常開發人員協助測試人員書寫白盒測試用例
- 在進行白盒測試之前,一定要根據說明書建立黑盒測試用例。用這種方式可以真正測試模塊的用意。
- 如果先從模塊的白盒子角度建立測試用例,就會受到代碼和注釋的影響,而忽略模塊的真正意圖。
-
白盒測試的局限: 不可能進行徹底的白盒測試
基本路徑測試:
根據程序的控制流圖找出一個模塊所需測試的基本路徑,根據這些基本路徑設計構造相應的測試用例。
設計步驟:
- 根據模塊邏輯構造控制流圖(Flow Graph)
- 計算控制流圖的環復雜度 (Cyclomatic Complexity)
- 列出包含起始節點和終止節點的基本路徑
- 檢查一下列出的基本路徑數目是否超過控制流圖的環復雜度
-
設計覆蓋這些基本路徑的測試用例
控制流圖:
由節點和邊組成的有向圖。
- 節點代表了代碼或程序流程圖中矩形框中所表示的處理,菱形表示的判斷處理以及判斷處理流程相交的匯合點,在圖中用標有編號的圓圈表示
- 邊表明了控制的順序,在圖中用有向箭頭表示
環復雜度:
用V(G)表示;用來衡量一個模塊判定結構的復雜程度,在數量上表現為獨立的路徑條數,是需要測試的基本路徑的上限。
計算公式:
V(G) = 閉合區域的數目。
由節點和邊圍成的封閉區域
- 這些封閉區域一定是不可再分的
- 包括周邊的區域
V(G)=二值判定節點個數+1
V(G)=邊的數目-節點的數目+2
基本路徑:
一條路徑是基本路徑如果:
- 是一條從起始節點到終止節點的路徑
- 至少包含一條其他基本路徑沒有包含的邊。(至少引入一個新處理語句或一個新判斷的程序通路)
注意:對於循環而言,基本路徑應包含不執行循環和執行一次循環體。
基本路徑不一定是測試用例,得可行才行
案例分析,兩種基本路徑的尋找方式。
案例一(以復合條件為節點):
結論:如果基本路徑必須是可行的,則邏輯關系會壓縮基本路徑集合數量,因此環復雜度是包含起始點和終止點的基本路徑數目的上限
白盒測試法:
白盒測試法檢查程序內部邏輯結構,對所有邏輯路徑進行測試,是一種窮舉路徑的測試方法。但即使每條路徑都測試過了,仍然可能存在錯誤。因為:
窮舉路徑測試無法檢查出程序本身是否違反了設計規范,即程序是否是一個錯誤的程序。
窮舉路徑測試不可能查出程序因為遺漏路徑而出錯。
窮舉路徑測試發現不了一些與數據相關的錯誤。
采用白盒測試方法必須遵循一些幾條原則,才能達到測試的目的:
- 保證一個模塊中的所有獨立路徑至少被測試一次
- 所有邏輯值均需測試真 (true) 和假 (false) 兩種情況
- 檢查程序的內部數據結構,保證其結構的有效性
- 在上下邊界及可操作范圍內運行所有循環
邏輯覆蓋法:
覆蓋測試:
測試覆蓋率,邏輯覆蓋法,測試覆蓋准則
測試覆蓋率:用於確定測試所執行到的覆蓋項的百分比。其中的覆蓋項是指作為測試基礎的一個入口或屬性,比如語句、分支、條件等。
測試覆蓋率可以表示出測試的充分性,在測試分析報告中可以作為量化指標的依據,測試覆蓋率越高效果越好。但覆蓋率不是目標,只是一種手段。
例如:一個程序總代碼為100行,使用測試用例運行一次,執行了75行代碼,則
代碼覆蓋率=75%
測試覆蓋率包括功能點覆蓋率和結構覆蓋率:
功能點覆蓋率大致用於表示軟件已經實現的功能與軟件需要實現的功能之間的比例關系。
結構覆蓋率包括語句覆蓋率、分支覆蓋率、循環覆蓋率、路徑覆蓋率等等。
根據覆蓋目標的不同,邏輯覆蓋又可分為語句覆蓋、判定覆蓋、條件覆蓋、判定/條件覆蓋、組合覆蓋和路徑覆蓋。
- 語句覆蓋:選擇足夠多的測試用例,使得程序中的每個可執行語句至少執行一次。
- 判定覆蓋:通過執行足夠的測試用例,使得程序中的每個判定至少都獲得一次"真"值和"假"值, 也就是使程序中的每個取"真"分支和取"假"分支至少均經歷一次,也稱為"分支覆蓋"。
- 條件覆蓋:設計足夠多的測試用例,使得程序中每個判定包含的每個條件的可能取值(真/假)都至少滿足一次。
- 判定/條件覆蓋:設計足夠多的測試用例,使得程序中每個判定包含的每個條件的所有情況(真/假)至少出現一次,並且每個判定本身的判定結果(真/假)也至少出現一次。
——滿足判定/條件覆蓋的測試用例一定同時滿足判定覆蓋和條件覆蓋。
- 組合覆蓋:通過執行足夠的測試用例,使得程序中每個判定的所有可能的條件取值組合都至少出現一次。
——滿足組合覆蓋的測試用例一定滿足判定覆蓋、條件覆蓋和判定/條件覆蓋。
- 路徑覆蓋:設計足夠多的測試用例,要求覆蓋程序中所有可能的路徑。
設計原則:
測試用例盡量少,覆蓋率盡量高。
邏輯覆蓋法包含關系:
實例:
語句覆蓋:
判定覆蓋:
條件覆蓋:
判定條件覆蓋:
組合覆蓋:
路徑覆蓋:
測試覆蓋的准則:
-
邏輯覆蓋的出發點是合理的、完善的。所謂"覆蓋",就是想要做到全面而無遺漏,但邏輯覆蓋並不能真正做到無遺漏。
-
ESTCA覆蓋准則:在容易發生問題的地方設計測試用例,即重視程序中謂詞(條件判斷)的取值
-
ESTCA覆蓋准則是一套錯誤敏感用例分析規則。這一規則雖然並不完備,但在普通程序中卻是有效的。原因在於這是一種經驗型的覆蓋准則,規則本身針對了程序編寫人員容易發生的錯誤,或是圍繞着發生錯誤的頻繁區域,從而提高了發現錯誤的命中率。具體規則如下:
[規則1] 對於A rel B型 (rel可以是<、= 或 >) 的分支謂詞,應適當的選擇A與B的值,使得測試執行到該分支語句時,A<B、A=B、A>B的情況分別出現一次。
——這是為了檢測邏輯符號寫錯的情況,如將"A<B"錯寫為"A>B"。
[規則2] 對於A rel C型 (rel可以是>或<, A是變量,C是常量)的分支謂詞:當rel為<時,應適當的選擇A的值,使A=C-M (M是距C最小的機器容許正數,若A和C都為正整數時,M=1);當rel為>時,應適當的選擇A的值,使A=C+M。
——這是為了檢測"差1"之類的錯誤,如"A>1"錯寫成"A>0"。
[規則3] 對外部輸入變量賦值,使其在每一個測試用例中均有不同的值與符號,並與同一組測試用例中其他變量的值與符號不同。
——這是為了檢測程序語句中的錯誤,如應該引用某一變量而錯成引用另一個常量。
其他白盒測試方法:
循環測試,數據流測試,程序插樁
循環測試:
關注循環體結構的正確性,對循環變量運用類似於邊界值測試的方法以驗證循環體結構的正確性。
四種不同類型的循環結構
- 簡單循環
- 嵌套循環
- 連接循環
- 非結構循環
數據流測試:
測試思想:
- 根據被測模塊中變量的定義和使用路徑,發現代碼中如引用未定義變量、對以前未曾使用的變量再次賦值等數據流異常情況。
- 導致這些異常情況原因是由於代碼存在名字拼錯、名字混淆或是語句遺漏等缺陷。
- 構造其定義——使用路徑設計相應的測試用例。
程序插樁:
-
"插樁":通過在源代碼中加入記錄信息語句,以便進行運行信息的追蹤和調試,統計有關的運行資源狀況。
-
程序插樁方法:借助往被測程序中插入操作,來實現測試目的的方法,即向源程序中添加一些語句,實現對程序語句的執行、變量的變化等情況進行檢查。
-
如print語句(最簡單的插樁)
-
插樁技術是實現各種覆蓋測試的必要手段
-
最少測試用例數計算: