決策測試 (Decision Testing) 與條件測試 (Condition Testing)

在程式中的條件子句與迴圈結構是容易出現邏輯錯誤的地方,因此針對這些地方要使用不同的測試方法去做測試,來確保程式邏輯沒有錯誤,也可以增加程式分支中的覆蓋率。

決策測試是用來評估條件子句,它會依條件子句的真偽 (true/false) 來控制程式的走向與分支,因此又稱作分支測試。

決策測試主要目標是測試布林運算式的結果是真還是偽,主要著重在函式的每一個條件子句,比起語句覆蓋測試 (Statement Testing),決策測試可以提供程式流程更佳的準確性。

如以下程式碼來說:

if ( A==true || B==true) {
Action1;
}
Action2;

原本只使用語句覆蓋測試 (Statement Testing),我們可以設計一個 test case 的 input 是 {A = true, B = true} 來執行語句覆蓋測試,就可以讓每一個 statement 皆有執行。但是如果這樣的 test case 就只有測到當條件子句為真的情況。

決策測試主要目標是測試布林運算式的結果是真還是偽,所以對於上面剛剛的程式碼來說,就會多一條 {A = false, B = true} 的 test case。對於簡單的 if 陳述句或迴圈結構來說,決策測試可以多覆蓋到一些路徑,但對於評估條件子句的關係運算子仍顯不足。

當一個條件子句包含兩個或兩個以上的布林運算式,我們就可以使用結構測試技術中的「條件測試」。條件測試會評估複合式條件子句中每個子運算式的真偽,以上面的程式碼來說,他就會在比決策測試多兩條 test case {A = true, B = false} {A = false, B = false}。在測試複合式條件子句的流程,條件測試比決策測試有更佳的敏感度。

接下來用一個小例子來看語句覆蓋測試、決策測試與條件測試的 test cases 數差異:


圖 IsItOk 函式的控制流程圖

我們可根據控制流程圖,得知 IsItOk 函式的真值表:

語句覆蓋測試為了要讓每一個 statement 都有被巡過,因此用此測試會產生 1 與 2 的 test cases。

決策測試要讓每一個 if 判斷式都有 true 跟 false,因此用此測試會產生 1 與 2 的 test cases。

條件測試是讓每一個條件有 true 跟 false,因此用此測試會產生 1 ~ 9 的 test cases。

不過我們針對此函式的測試案例若採用捷徑寫法的話,可將 test cases 濃縮成 4 個 test cases(1, 2, 3, 5),因為捷徑寫法的邏輯為「and」時,只要第一個條件有錯,就不會再做下面其他的條件的判斷,因此 3 跟 4 是一樣的效果、5~9 也都是一樣的效果,而有效 test cases 可變為四個。

每一個測試方法的重點不同,像條件測試考慮的點就比較多,對於測試邏輯比較不容易漏掉 bug,但測試案例較多,需要花比較多時間測試。語句覆蓋測試可以很快速的測試完,也能夠測到每一條程式碼,但可能會有遺漏掉的邏輯問題沒測到。所以可以自行衡量該用哪一種測試方法,來達到最高效率。

參考文章:
1. 微軟測試之道 Chapter 6 – 結構測試技術

發表留言