1. 程式人生 > >白盒測試

白盒測試

這也 設計 目的 完成 以及 復雜度 異常 log 上界

#### <center>白盒測試</center>

1.**白盒測試**:也稱結構測試或邏輯驅動測試,基於應用代碼的內部邏輯,它從程序的控制結構導出測試用例,++對程序的邏輯路徑進行測試++,測試是基於覆蓋++*全部代碼*、*分支*、*路徑*、*條件*++。

2.**測試要求**:
- 保證一個模塊中的所有獨立路徑至少被使用一次。
- 對所有邏輯值均需測試 true 和 false。
- 在上下邊界及可操作範圍內運行所有循環。
- 檢查內部數據結構以確保其有效性。

3.**測試方法**:
```mermaid
graph TD
A((白盒測試)) -- 不執行代碼/程序結構分析 --> B((靜態測試))
A((白盒測試)) -- 執行代碼/邏輯覆蓋 --> C((動態測試))
B-->D[代碼走查]
B-->E[代碼審查]
B-->F[控制流分析]
B-->G[數據流分析]
B-->H[信息流分析]
C-->I[語句覆蓋]
C-->J[判定覆蓋]
C-->K[條件覆蓋]
C-->L[判定-條件覆蓋]
C-->M[條件組合覆蓋]
C-->N[路徑覆蓋]
```

4.**判斷標準強弱**
從弱到強依次如下,語句覆蓋最弱,路徑覆蓋最強。
1. 語句覆蓋每條語句至少執行一次。
2. 判定覆蓋每個判定的每個分支至少執行一次。
3. 條件覆蓋每個判定的每個條件應取到各種可能的值。
4. 判定/條件覆蓋同時滿足判定覆蓋條件覆蓋。
5. 條件組合覆蓋每個判定中各條件的每一種組合至少出現一次。
6. 路徑覆蓋使程序中每一條可能的路徑至少執行一次。

5.**代碼覆蓋率**:是白盒測試中的一個重要指標,雖然窮舉不可能實現,但是**要盡可能提高覆蓋程度**。==白盒測試實質是窮舉路徑測試==,++邏輯覆蓋是白盒測試的主要測試方法++,白盒測試的不足正是黑盒測試的內容。

6.**靜態測試**

| 名稱 | 含義 |
|--------|--------|
| 代碼走查 | 代碼走查是由一組程序和錯誤檢查技術組成,並以代碼審查組方式進行,重點探討代碼編寫思路:比如算法,基於對象的編程,類設計。 |
| 代碼審查 | 檢查代碼和設計的一致性,結構的合理性,標準的遵循情況,代碼可讀性等。主要是對代碼的檢查,不涉及測試用例。|
| 控制流分析 | 非結構化程序會給測試、排錯、和程序的維護帶來許多困難,因此,檢查程序的控制結構很重要|
| **程序流程圖** | 又稱為框圖,是一種程序控制結構的圖形表示。在圖上的框內標明了處理要求或條件,**通常使用簡化了的程序流程圖作為控制流圖**,對程序進行分析。|
| 控制流分析 | 控制流圖中只有兩種符號,==*節點*==:*++以標有編號的圓圈表示++,有兩種含義,1程序流程圖中矩形框所表示的處理;2程序流程圖中菱形表示的兩個甚至多個出口判斷以及多條流線相交的匯合點*。==*控制流線或弧*==:*以箭頭表示與程序流程圖中的流線是一致的,表明了控制的順序,控制流線通常標有名字*,==同時也可以用控制流矩陣表示==。|
| 數據流分析 | 用來查找對以前未曾使用的變量再次賦值等數據流異常的情況。通常表現為,如錯拼名字、名字混淆或語句丟失等錯誤。|
| 信息流分析 | 通過對輸入數據、輸出數據、語句之間的關系的分析來檢查程序錯誤,信息流分析用來分析,是否存在無用的語句。 |

7.**動態測試**

| 名稱 | 含義 |
|--------|--------|
|語句覆蓋|==如果語句中有錯誤,僅靠觀察不執行可能發現不了==,設計的測試用例**使程序中的每個可執行語句至少執行一次**。要求:*用例盡量少,覆蓋盡量高*,優點:*容易實現自動測試,代碼覆蓋率高*,缺點:*無法檢測出,條件錯誤,邏輯錯誤,循環錯誤。*|
|判定覆蓋|==又稱為分支覆蓋,設計若幹測試用例,運行被測程序,**使得程序中每個判斷的真假分支至少經歷一次**==。衡量指標:分支覆蓋率,常用於:*while語句、switch語句、異常處理、跳轉語句等情況*,查錯能力稍強於語句覆蓋,但是同樣++*無法檢測出,條件錯誤,邏輯錯誤,循環錯誤*++。|
|條件覆蓋|==設計若幹測試用例,要使測試程序中**每個判斷中的每個條件的可能取值至少滿足一次**==,執行條件覆蓋並不能實現分支覆蓋,優點:*能夠檢查所有的條件錯誤*,缺點:*不能實現對每個分支的檢查,用例數量的增加*。|
|判定條件覆蓋|==設計足夠的測試用例,**使得判斷中每個條件的所有可能至少出現一次,並且每個判斷本身的判定結果也至少出現一次**==,優點:*同時考慮了每一個條件和每一個分支,發現錯誤能力強於分支覆蓋和條件覆蓋*,缺點:*並不能全面覆蓋所有路徑,用例數量的增加*。|
|條件組合覆蓋|==設計足夠多的測試用例,**使得每個判定中條件的各種可能組合都至少出現一次**==。與判定條件覆蓋相比而言,其重點在於每個判定中的各種可能組合,這也導致了測試用例的增加。|
|路徑覆蓋|==設計足夠多的測試用例,**要求覆蓋程序中所有可能的路徑**==,優點:*實現了所有路徑的測試,發現錯誤能力強*,缺點:*有時無法覆蓋所有路徑,用例數量的增加*。|

8.**基本路徑測試方法**
- 實際情況
- 路徑測試就是從一個程序的入口開始,執行所經歷的各個語句的完整過程。從廣義的角度講,任何有關路徑分析的測試都可以被稱為路徑測試。
- 完成路徑測試的理想情況是做到路徑覆蓋,但對於復雜性大的程序要做到所有路徑覆蓋(測試所有可執行路徑)是不可能的。
- ==在不能做到所有路徑覆蓋的前提下==,<font color ="pink">如果某一程序的每一個++**獨立路徑[^1]**++都被測試過,那麽可以認為程序中的每個語句都已經檢驗過了,即達到了語句覆蓋</font>。這種測試方法就是通常所說的基本路徑測試方法。

- 方法:
*在控制流圖的基礎上*,通過**分析控制結構的環形復雜度**,導出執行路徑的基本集,再從該基本集設計測試用例。
> - 環形復雜度:也稱為圈復雜度,它是一種為程序邏輯復雜度提供定量尺度的軟件度量。將環形復雜度用於基本路徑方法,++可以確定程序基本集的獨立路徑數量++;確保所有語句至少執行一次的測試數量的上界。
- 控制流圖中區域的數量對應於環形復雜度[^2]。
- 給定控制流圖G的環形復雜度—V(G),定義為
$$$
V(G) = E-N+2
$$$
其中,E是控制流圖中邊的數量,N是控制流圖中的節點數量。
- 給定控制流圖G的環形復雜度—V(G),也可定義為
$$$
V(G) = P+1
$$$
其中,P是控制流圖G中判定節點的數量。判定節點是輸出邊至少2條以上的節點。

- 步驟:
(1)畫出程序的控制流圖。
(2)計算程序的環形復雜度,導出程序基本路徑集中的獨立路徑條數,這是確定程序中每個可執行語句至少執行一次所必須的測試用例數目的上界。
(3)導出基本路徑集,確定程序的獨立路徑。
(4)根據(3)中的獨立路徑,設計測試用例的輸入數據和預期輸出。

9.**白盒測試工具**
- 軟件:
> DevPartner(Compuware)(C\++、VC\++、.net、java)
IBM Rational Purify(C,C\++ )

- 框架:
> NUnit(.net)
JUnit(java)
CppUnit(C\++)


[^1]: 獨立路徑是指程序中至少引入了一個新的處理語句集合或一個新條件的程序通路。采用流圖的術語,即獨立路徑必須至少包含一條在本次定義路徑之前不曾用過的邊
[^2]: [軟考軟件設計師McCabe環路復雜度計算方法](http://blog.csdn.net/u012965373/article/details/49662133)

白盒測試