邏輯覆蓋測試是通過對程序邏輯結構的遍歷實現程序的覆蓋。從覆蓋源代碼的不同程度可以分爲以下六個標準:語句覆蓋、判定覆蓋(又稱爲分支覆蓋)、條件覆蓋、判定-條件覆蓋(又稱爲分支-條件覆蓋)、條件組合覆蓋和路徑覆蓋。
先看一下具體例子的源代碼(C語言):
- /*
- * 白盒測試邏輯覆蓋測試範例
- * 作者:胡添發([email protected])
- */
- int logicExample(int x, int y)
- {
- int magic=0;
- if(x>0 && y>0)
- {
- magic = x+y+10; // 語句塊1
- }
- else
- {
- magic = x+y-10; // 語句塊2
- }
- if(magic < 0)
- {
- magic = 0; // 語句塊3
- }
- return magic; // 語句塊4
- }
一般做白盒測試不會直接根據源代碼,而是根據流程圖來設計測試用例和編寫測試代碼,在沒有設計文檔時,要根據源代碼畫出流程圖:
做好了上面的準備工作,接下來就開始講解六個邏輯覆蓋標準:
一、語句覆蓋
1、概念:
設計足夠多的測試用例,使得被測試程序中的每條可執行語句至少被執行一次。在本例中,可執行語句是指語句塊1到語句塊4中的語句。
2、測試用例:
{x=3, y=3}可以執行到語句塊1和語句塊4,所走的路徑:a-b-e-f
{x=-3, y=0}可以執行到語句塊2、語句塊3和語句塊4,所走的路徑:a-c-d-f
這樣,通過兩個測試用例即達到了語句覆蓋的標準,當然,測試用例(測試用例組)並不是唯一的。
3、測試的充分性:
假設第一個判斷語句if(x>0 && y>0)中的“&&”被程序員錯誤地寫成了“||”,即if(x>0 || y>0),使用上面設計出來的一組測試用例來進行測試,仍然可以達到100%的語句覆蓋,所以語句覆蓋無法發現上述的邏輯錯誤。
在六種邏輯覆蓋標準中,語句覆蓋標準是最弱的。
二、判斷覆蓋(分支覆蓋)
1、概念:
設計足夠多的測試用例,使得被測試程序中的每個判斷的“真”、“假”分支至少被執行一次。在本例中共有兩個判斷if(x>0 && y>0)(記爲P1)和if(magic < 0)(記爲P2)。
2、測試用例:
數據 | P1 | P2 | 路徑 |
{x=3, y=3} |
T | F |
a-b-e-f |
{x=-3, y=0} |
F | T |
a-c-d-f |
兩個判斷的取真、假分支都已經被執行過,所以滿足了判斷覆蓋的標準。
3、測試的充分性:
假設第一個判斷語句if(x>0 && y>0)中的“&&”被程序員錯誤地寫成了“||”,即if(x>0 || y>0),使用上面設計出來的一組測試用例來進行測試,仍然可以達到100%的判定覆蓋,所以判定覆蓋也無法發現上述的邏輯錯誤。
跟語句覆蓋相比:由於可執行語句要不就在判定的真分支,要不就在假分支上,所以,只要滿足了判定覆蓋標準就一定滿足語句覆蓋標準,反之則不然。因此,判定覆蓋比語句覆蓋更強。
三、條件覆蓋
1、概念:
設計足夠多的測試用例,使得被測試程序中的每個判斷語句中的每個邏輯條件的可能值至少被滿足一次。
也可以描述成:
設計足夠多的測試用例,使得被測試程序中的每個邏輯條件的可能值至少被滿足一次。
在本例中有兩個判斷if(x>0 && y>0)(記爲P1)和if(magic < 0)(記爲P2),共計三個條件x>0(記爲C1)、y>0(記爲C2)和magic<0(記爲C3)。
2、測試用例:
數據 | C1 | C2 | C3 | P1 | P2 | 路徑 |
{x=3, y=3} |
T | T | T | T | F |
a-b-e-f |
{x=-3, y=0} |
F | F | F | F | T |
a-c-d-f |
三個條件的各種可能取值都滿足了一次,因此,達到了100%條件覆蓋的標準。
3、測試的充分性:
上面的測試用例同時也到達了100%判定覆蓋的標準,但並不能保證達到100%條件覆蓋標準的測試用例(組)都能到達100%的判定覆蓋標準,看下面的例子:
數據 | C1 | C2 | C3 | P1 | P2 | 路徑 |
{x=3, y=0} |
T | F | T | F | F |
a-c-e-f |
{x=-3, y=5} |
F | T | F | F | F |
a-c-e-f |
既然條件覆蓋標準不能100%達到判定覆蓋的標準,也就不一定能夠達到100%的語句覆蓋標準了。
四、判定-條件覆蓋(分支-條件覆蓋)
1、概念:
設計足夠多的測試用例,使得被測試程序中的每個判斷本身的判定結果(真假)至少滿足一次,同時,每個邏輯條件的可能值也至少被滿足一次。即同時滿足100%判定覆蓋和100%條件覆蓋的標準。
2、測試用例:
數據 | C1 | C2 | C3 | P1 | P2 | 路徑 |
{x=3, y=3} |
T | T | T | T | F |
a-b-e-f |
{x=-3, y=0} |
F | F | F | F | T |
a-c-d-f |
所有條件的可能取值都滿足了一次,而且所有的判斷本身的判定結果也都滿足了一次。
3、測試的充分性:
達到100%判定-條件覆蓋標準一定能夠達到100%條件覆蓋、100%判定覆蓋和100%語句覆蓋。
五、條件組合覆蓋
1、概念:
設計足夠多的測試用例,使得被測試程序中的每個判斷的所有可能條件取值的組合至少被滿足一次。
注意:
a、條件組合只針對同一個判斷語句內存在多個條件的情況,讓這些條件的取值進行笛卡爾乘積組合。
b、不同的判斷語句內的條件取值之間無需組合。
c、對於單條件的判斷語句,只需要滿足自己的所有取值即可。
2、測試用例:
數據 | C1 | C2 | C3 | P1 | P2 | 路徑 |
{x=-3, y=0} |
F | F | F | F | F |
a-c-e-f |
{x=-3, y=2} |
F | T | F | F | F |
a-c-e-f |
{x=-3, y=0} |
T | F | F | F | F |
a-c-e-f |
{x=3, y=3} |
T | T | T | T | T |
a-b-d-f |
C1和C2處於同一判斷語句中,它們的所有取值的組合都被滿足了一次。
3、測試的充分性:
100%滿足條件組合標準一定滿足100%條件覆蓋標準和100%判定覆蓋標準。
但上面的例子中,只走了兩條路徑a-c-e-f和a-b-d-f,而本例的程序存在三條路徑。
六、路徑覆蓋
1、概念:
設計足夠多的測試用例,使得被測試程序中的每條路徑至少被覆蓋一次。
2、測試用例:
數據 | C1 | C2 | C3 | P1 | P2 | 路徑 |
{x=3, y=5} |
T | T | T | T | T |
a-b-d-f |
{x=0, y=2} |
F | T | T | F | T |
a-c-d-f |
這條路徑不可能 |
a-b-e-f |
|||||
{x=-8, y=3} |
F | T | F | F | F |
a-c-e-f |
所有可能的路徑都滿足過一次。
3、測試的充分性:
由上表可見,100%滿足路徑覆蓋,但並不一定能100%滿足條件覆蓋(C2只取到了真),但一定能100%滿足判定覆蓋標準(因爲路徑就是從判斷的某條分支走的)
七、六種邏輯覆蓋的強弱關係
在外面很多的教程都認爲這六種邏輯覆蓋從弱到強的排列順序是:
語句覆蓋->判定覆蓋->條件覆蓋->判定-條件覆蓋->條件組合覆蓋->路徑覆蓋
但經過上面的分析,它們之間的關係實際上可以用下圖表示:
而路徑覆蓋很難在該圖表示出來。
出處:http://blog.csdn.net/aidisheng/archive/2008/10/07/3025617.aspx