| “語句覆蓋”是一個比較弱的測試標准,它的含義是:選擇足夠的測試用例,使得程序中每個語句至少都能被執行一次。 |
|||||||||||||
| 圖6.4是一個被測試的程序,它的源程序是: PROCEDURE M(VAR A,B,X:REAL); BEGIN IF(A>1) AND (B=0) THENX:=X/A; IF(A=2)OR (X>1) THENX:=X+1; END. 為使程序中每個語句至少執行一次,只需設計一個能通過路徑ace的例子就可以了,例如選擇輸入數據為: A=2,B=0,X=3 就可達到“語句覆蓋”標准。 |
|||||||||||||
| 從本例可看出,語句覆蓋實際上是很弱的,如果第一個條件語句中的AND錯誤地編寫成OR,上面的測試用例是不能發現這個錯誤的;又如第三個條件語句中X>1誤寫成X>0,這個測試用例也不能暴露它,此外,沿着路徑abd執行時,X的值應該保持不變,如果這一方面有錯誤,上述測試數據也不能發現它們。 總之,一般認為“語句覆蓋”是很不充分的一種標准。
比“語句覆蓋”稍強的覆蓋標准是“判定覆蓋”(或稱分支覆蓋)標准。含義是:執行足夠的測試用例,使得程序中的每一個分支至少都通過一次。
對圖6.4的程序,如果設計兩個例子,使它們能通過路徑ace和abd,或者通過路徑acd和abe,就可達到“判定覆蓋”標准,為此,可以選擇輸入數據為:
①A=3,B=0,X=1(沿路徑acd執行); ②A=2,B=1,X=3(沿路徑abe執行)
程序中含有判定的語句包括IF-THEN-ELSE、DO-WHILE、REPEAT-UNTIL等,除了雙值的判定語句外,還有多值的判定語句,如PASCAL中的CASE語句、FORTRAN中帶有三個分支的IF語句等。所以“判定覆蓋”更一般的含義是:使得每一個判定獲得每一種可能的結果。
“判定覆蓋”比“語句覆蓋”嚴格,因為如果每個分支都執行過了,則每個語句也就執行過了。但是,“判定覆蓋”還是很不夠的,例如上面兩個測試用例未能檢查沿着路徑abd執行時,X的值是否保持不變。
一個判定中往往包含了若干個條件,例如圖6.4的程序中,判定(A>1) AND (B=0)包含了兩個條件:A>1以及B=0,所以可引進一個更強的覆蓋標准——“條件覆蓋”。“條件覆蓋”的含義是:執行足夠的測試用例,使得判定中的每個條件獲得各種可能的結果。
A>1、B=0、A=2、X>1
為了達到“條件覆蓋”標准,需要執行足夠的測試用例使得在a點有:
A>1、A≤1、B=0、B≠0
等各種結果出現,以及在b點有:
A=2、A≠2、X>1、X≤1
等各種結果出現。
現在只需設計以下兩個測試用例就可滿足這一標准:
①A=2,B=0,X=4 (沿路徑ace執行); ②A=1,B=1,X=1 (沿路徑abd執行)。
“條件覆蓋”通常比“判定覆蓋”強,因為它使一個判定中的每一個條件都取到了兩個不同的結果,而判定覆蓋則不保證這一點。但如對語句IF(A AND B)THEN S設計測試用例使其滿足"條件覆蓋",即使A為真並使B為假,以及使A為假而且B為真,但是它們都未能使語句S得以執行。
針對上面的問題引出了另一種覆蓋標准——“判定/條件覆蓋”,它的含義是:執行足夠的測試用例,使得判定中每個條件取到各種可能的值,並使每個判定取到各種可能的結果。對圖6.4的程序,上一節中的兩個例子 ①A=2,B=0,X=4 (沿ace路徑) ②A=1,B=1,X=1(沿abd路徑)
是滿足這一標准的。 “判定/條件覆蓋”似乎是比較合理的,但事實並非如此,因為大多數計算機不能用一條指令對多個條件作出判定,而必須將源程序中對多個條件的判定分解成幾個簡單判定,所以較徹底的測試應使每一個簡單判定都真正取到各種可能的結果。
上面的討論說明了,盡管“判定/條件覆蓋”看起來能使各種條件取到所有可能的值,但實際上並不一定能檢查到這樣的程度。
針對上述問題又提出了另一種標准——“條件組合覆蓋”。它的含義是:執行足夠的例子,使得每個判定中條件的各種可能組合都至少出現一次。顯然,滿足“條件組合覆蓋”的測試用例是一定滿足“判定覆蓋”、“條件覆蓋”和“判定/條件覆蓋”的。
再看圖6.4的程序,我們需要選擇適當的例子,使得下面8種條件組合都能夠出現:
1)A>1, B=0 2) A>1, B¹0 3) A≤1, B=0 4)A≤1, B≠0
5)A=2, X>1 6)A=2,X≤1 7)A≠2, X>1 8)A≠2, X≤1
必須注意到,5)、6)、7)、8)四種情況是第二個IF語句的條件組合,而X的值在該語句之前是要經過計算的,所以還必須根據程序的邏輯推算出在程序的入口點X的輸入值應是什么。
①A=2,B=0,X=4使1)、5)兩種情況出現;②A=2,B=1,X=1使2)、6)兩種情況出現;
上面四個例子雖然滿足條件組合覆蓋,但並不能覆蓋程序中的每一條路徑,例如路徑acd就沒有執行,因此,條件組合覆蓋標准仍然是不徹底。
|
|||||||||||||












