白盒測試的幾種方法



語句覆蓋”是一個比較弱的測試標准,它的含義是:選擇足夠的測試用例,使得程序中每個語句至少都能被執行一次。                                          

圖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,所以可引進一個更強的覆蓋標准——“條件覆蓋”。“條件覆蓋”的含義是:執行足夠的測試用例,使得判定中的每個條件獲得各種可能的結果。   

 

6.4的程序有四個條件:

 

        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.5是由編譯系統產生的6.4的目標程序。上面的兩個例子未能使目標程序中的每一個簡單判定取到各種可能的結果;它們不能使判定I為“假”也不能使判定K為“真”,其原因在於:含有AND或OR的邏輯表達式中,某些條件將抑制其他條件,例如邏輯表達式A AND B,如果A為“假”,目標程序就不再檢查條件B了,這樣B中的錯誤就發現不了。    

 

上面的討論說明了,盡管“判定/條件覆蓋”看起來能使各種條件取到所有可能的值,但實際上並不一定能檢查到這樣的程度。

 

 

 

針對上述問題又提出了另一種標准——“條件組合覆蓋”。它的含義是:執行足夠的例子,使得每個判定中條件的各種可能組合都至少出現一次。顯然,滿足“條件組合覆蓋”的測試用例是一定滿足“判定覆蓋”、“條件覆蓋”和“判定/條件覆蓋”的。

 

再看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的輸入值應是什么。
下面四個例子可以使上述8種條件組合至少出現一次:

 

①A=2,B=0,X=4使1)、5)兩種情況出現;②A=2,B=1,X=1使2)、6)兩種情況出現; 

 

           


③A=1,B=0,X=2使3)、7)兩種情況出現; ④A=1,B=1,X=1使4)、8)兩種情況出現。  

 

上面四個例子雖然滿足條件組合覆蓋,但並不能覆蓋程序中的每一條路徑,例如路徑acd就沒有執行,因此,條件組合覆蓋標准仍然是不徹底。

 

 
 轉載自: https://www.cnblogs.com/chengnuo/p/5297942.html


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM