在白盒測試中,有四種常見測試方法:
- 語句覆蓋
- 條件覆蓋
- 判斷覆蓋
- 路徑覆蓋
下面我們用一道例題來解釋他們之間的區別:
START
INPUT (A,B,C)
IF A>5
THEN X= 10
ELSE X=1
END IF
IF B> 10
THEN Y=20
ELSE Y=2
END IF
IF C> 15
THEN Z= 30
ELSE Z=3
END IF
PRINT (X,Y,Z)
STOP
該題的程序流程圖:
1、語句覆蓋
語句覆蓋的含義:
選擇足夠多的測試數據,使被測程序中每個語句至少執行一次。
語句覆蓋只關心判定表達式的值,而沒有分別測試判定表達式中每個條件取不同值時的情況(即一個判斷語句的兩個分支若沒有其他語句。則只需要執行一個分支語句)。
如上圖的程序流程圖,若想每個語句至少執行一次(賦值語句也是語句),則最少需要兩組測試數據。
全部為true:A=20,B=20,C=20
全部為false:A=1,B=1,C=1
2、判斷覆蓋(分支覆蓋、判定覆蓋)
判定覆蓋的含義:
不僅每個語句必須至少執行一次,而且每個判定的每種可能的結果都應該至少執行一次
在⑴的基礎上,每個判定的每個分支至少執行一次
如上圖的程序流程圖。在(1)的基礎上每個分支至少執行一次,則可以用和(1)一樣的兩組數據。(該題具有特殊性)
全部為true:A=20,B=20,C=20
全部為false:A=1,B=1,C=1
3、條件覆蓋
條件覆蓋的含義:
不僅每個語句至少執行一次,而且使判定表達式中的每個條件都取到各種可能的結果在⑴的基礎上,使每個判定表達式的每個條件都取到各種可能的結果。
通俗來講就是每個判斷條件都可以取到所有的可能。
如上圖的程序流程圖。在(1)的基礎上使每個判定表達式的每個條件都取到各種可能的結果,則可以用和(1)一樣的兩組數據。(該題具有特殊性)
全部為true:A=20,B=20,C=20
全部為false:A=1,B=1,C=1
4、路徑覆蓋
路徑覆蓋的含義:
選取足夠多測試數據,使程序的每條可能路徑都至少執行一次(如果程序圖中有環,則要求每個環至少經過一次)。
則上圖的程序流程圖一共有8條可以走的路徑,當我們測試時,可以選擇這樣的8組數據:
- 3 個判定表達式之值全為假
輸入:A=1,B=1,C=1
預期的輸出:X=1,Y=2,Z=3
- 3 個判定表達式依次為假、假、真
輸入:A=1,B=1,C=60
預期的輸出:X=1,Y=2,Z=30
- 3 個判定表達式依次為假、真、假
輸入:A=1,B=40,C=1
預期的輸出:X=1,Y=20,Z=3
- 3 個判定表達式依次為假、真、真
輸入:A=1,B=40,C=60
預期的輸出:X=1,Y=20,Z=30
- 3 個判定表達式依次為真、假、假
輸入:A=20,B=1,C=1
預期的輸出:X=10,Y=2,Z=3
- 3 個判定表達式依次為真、假、真
輸入:A=20,B=1,C=60
預期的輸出:X=10,Y=2,Z=30
- 3 個判定表達式依次為真、真、假
輸入:A=20,B=40,C=1
預期的輸出:X=10,Y=20,Z=3
- 3 個判定表達式全為真
輸入:A=20,B=40,C=60
預期的輸出:X=10,Y=20,Z=30
5、條件覆蓋和判斷覆蓋的區別
判斷覆蓋:每個分支都至少執行一次
條件覆蓋:每個判斷條件的值都要取到所有的可能
乍一看,兩者好像表達了相同的意思,其實大多數情況下也的確是這樣。但是,也有不同的時候,我們看下面一個判斷條件:
IF (A<10 OR B>10)
當選擇判斷覆蓋式,則整個判斷式要有true和false兩個結果的兩組測試數據。
但是對條件覆蓋來說,可以選擇都為true的測試數據,如A<5,B<5(true)和A>15,B>15(true),我們覆蓋到了判斷條件所有的可能性,但是兩組數據的結果都為true,所以並沒有覆蓋到所有的分支,這就是條件覆蓋與判斷覆蓋的區別。
即:*判定覆蓋只關心判定表達式的值(真/假),而條件覆蓋涉及到判定表達式的每個條件的值(真/假)