1. 程式人生 > >六種白盒測試(1)

六種白盒測試(1)

常用的軟體測試方法有兩大類:靜態測試方法和動態測試方法。其中軟體的靜態測試不要求在計算機上實際執行所測程式,主要以一些人工的模擬技術對軟體進行分析和測試;而軟體的動態測試是通過輸入一組預先按照一定的測試準則構造的例項資料來動態執行程式,而達到發現程式錯誤的過程。在動態分析技術中,最主要的測試有白盒和黑盒。
其中,白盒測試又稱結構測試、透明盒測試、邏輯驅動測試或基於程式碼的測試。盒子指的是被測試的軟體,白盒指的是盒子是可視的,你清楚盒子內部的東西以及裡面是如何運作的。白盒要考慮測試用例對程式內部的覆蓋程度,最好的白盒測試是能覆蓋到每一條路徑,但是由於路徑數目極大,要執行每一條路徑是不可能。但我們能做到就是讓覆蓋率變高一點,下面要介紹的六種覆蓋測試方法,看看他們的覆蓋程度。

六種白盒測試:(從低到高)

語句覆蓋。

判定覆蓋。

條件覆蓋。

判定/條件覆蓋。

條件組合覆蓋。

一、語句覆蓋(Statement coverage)

(1)定義:

  • “語句覆蓋”是一個比較弱的測試標準,它的含義是:在測試時,首先設計若干個測試用例,然後執行被測程式, 使程式中的每個可執行語句至少執行一次。這時所謂“若干個”,自然是越少越好。

(2)用例設計:

這裡寫圖片描述

  • 圖1是一個被測試的程式,它的源程式是:
    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
      這樣該程式段的4個語句均得到執行,從而作到了語句覆 蓋。
      這裡寫圖片描述

    • 但如果選用的測試用例是:
      A=2 B=0 X=-3 程式按路徑abe執行,便未能達到語句覆蓋。
      這裡寫圖片描述

  • 從本例可看出,語句覆蓋實際上是很弱的,程式中每個語句都得到執行這一點來看,語句覆蓋的方法似乎能夠比較全面地 檢驗每一個語句。但它也絕不是完美無缺的。假如這一程式段中兩個判斷的邏輯運算 有問題,如果第一個條件語句中的AND錯誤地編寫成OR,上面的測試用例是不能發現這個錯誤的;又如第三個條件語句中X>1誤寫成X>0,這個測試用例也不能暴露它,此外,沿著路徑abd執行時,X的值應該保持不變,以為每個語句都經歷過,似乎可以放心了。其實這種測試不十分可靠。語句覆蓋在測試被測程式中,除去對檢查不可執行語句有一定作用外,並沒有排除被測程式包含錯誤的風險。

  • 總之,一般認為“語句覆蓋”是很不充分的一種標準。

(3)優點:

  • 可以很直觀地從原始碼得到測試用例,無須細分每條判定表示式。

(4)缺點:

  • 由於這種測試方法僅僅針對程式邏輯中顯式存在的語句(即可執行語句),但對於隱藏的條件和可能到達的隱式邏輯分支,是無法測試的。

二、判定覆蓋(Decision coverage)

(1)定義:

  • 比“語句覆蓋”稍強的覆蓋標準是“判定覆蓋”(或稱branch coverage分支覆蓋)標準。判定覆蓋準則進行測試是指,設計若干測試用例,執行被側程式,使得程式中每個判斷的取真分支和取假分支至少經歷一次,即判斷的真假值均曾被滿足。判定覆 蓋又稱為分支覆蓋。

(2)用例設計:

  • 對圖1的程式,如果設計兩個例子,使它們能通過路徑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的值是否保持不變。所以它只能滿足條件覆蓋的要求,但是不能對判斷的條件進行檢查。

(3)優點:

  • 判定覆蓋比語句覆蓋要多幾乎一倍的測試路徑,當然也就具有比語句覆蓋更強的測試能力。同樣判定覆蓋也具有和語句覆蓋一樣的簡單性,無須細分每個判定就可以得到測試用例。

(4)缺點:

  • 往往大部分的判定語句是由多個邏輯條件組合而成(如,判定語句中包含AND、OR、CASE),若僅僅判斷其整個最終結果,而忽略每個條件的取值情況,必然會遺漏部分測試路徑。