軟件測試技術之: 白盒測試和黑盒測試(3)
發表于:2016-06-02來源:C博客作者:好兒郎-志在四方點擊數:
標簽:
判定/條件覆蓋準則的一個缺點是盡管看上去所有條件的所有結果似乎都執行到了,但由于有些特定的條件會屏蔽掉其他的條件,常常并不能全部都執行到
判定/條件覆蓋準則的一個缺點是盡管看上去所有條件的所有結果似乎都執行到了,但由于有些特定的條件會屏蔽掉其他的條件,常常并不能全部都執行到。請參見圖2?2來觀察此種情況。圖2?2 中的流程圖描述的是編譯器將圖2?1中的程序編譯生成機器代碼的過程。源程序中的多重條件判斷被分解成單個的判斷和分支,因為大多數的機器都沒有能執行多重條件判斷的單獨指令。那么,更為完全的測試覆蓋似乎是將每個基本判斷的全部可能的結果都執行到,而前兩個判定覆蓋的測試用例都做不到這點,它們未能執行到判斷 I 中的結果為 “假”的分支, 以及判斷 K 中結果為“真”的分支。
圖 2?2 圖 2?1中程序的機器碼
如圖2?2所示,其中的原因是“與”和“或”表達式中某些條件的結果可能會屏蔽掉或阻礙其他條件,的判斷。舉例來說,如果“與”表達式中有個條件為 “假”,那么就無須計算該表達式中的后續條件。 同樣, 如果 “或”表達式中有個條件為 “真” ,那么后續條件也無須計算。因此,條件覆蓋或判定/條件覆蓋誰都不一定會發現邏輯表達式中的錯誤。
2.1.5 多重條件覆蓋
所謂的多重條件覆蓋準則能夠部分解決這個問題。該準則要求編寫足夠多的測試用例,將每個判定中的所有可能的條件結果的組合,以及所有的入口點都至少執行一次。舉例來說,考慮下面的偽代碼程序;
NOTFOUND=TRUE;
DO I=1 TO TABSIZE WHILE (NOTFOUND); /*SEARCHTABLE*/
……searching logic……;
END
要測試四種情況:
1. I<=TABSIZE,并且 NOTFOUND 為真;
2. I<=TABSIZE,并且 NOTFOUND 為假(在到達表格尾部前查詢指定條目) ;
3. I>TABSIZE,并且 NOTFOUND 為真(查詢了整個表格,未找到指定條目) ;
4. I>TABSIZE,并且 NOTFOUND 為假(指定條目位于表格的最后位置) 。
很容易發現,滿足多重條件覆蓋準則的測試用例集,同樣滿足判定覆蓋準則、條件覆蓋準則以及判定/條件覆蓋準則。
再次回到圖2?1中,測試用例必須覆蓋以下 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 至8 組合表示了第二個 if 語句的值。由于 X可能在該 if 語句之前發生了改變,因此這個 if 語所需的值必需對程序邏輯進行回溯,以找到相對應的輸入值,要測試的這 8 種組合并不一定意味著需要設計出 8 個測試用例。實際上,用 4 個測試用例就可以覆蓋它們。下面是這些測試用例的輸入,以及它們覆蓋的組合:
A=3,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
圖 2?1的程序存在 4 條不同的路徑,需要 4 個測試用例,這樣的情況純屬巧合。事實上,這 4 個用例也沒有覆蓋到每條路徑,路徑 acd 就被遺漏掉了。
舉例來說,對于如下所示的判斷語句,盡管它只包舍兩條路徑,仍可能需要 8個測試用例:
if (x==y && length(z)==0 && FLAG)
{
j=1 ;
}
Else
{
i=1;
}
在存在循環的情況下,多重條件覆蓋準則所需要的測試用例的數量通常會遠遠小于其路徑的數量。
總的來說,對于包含每個判斷只存在一種條件的程序,最簡單的測試準則就是設計出足夠數量的測試用例,實現:(1)將每個判斷的所有結果都至少執行一次;(2)將所有的程序入口都至少調用一次,以確保全部的語句都至少執行一次。而對于包含多重條件判斷的程序,最簡單的測試準則是設計出足夠數量的測試用例,將每個判斷的所有可能的條件結果的組合,以及所有的入口點都至少執行一次(加入“可能”二字,是因為有些組合情況難以生成)。
2.1.6 路徑覆蓋
在以上測試用例中,我們發現漏掉了路徑acd。路徑覆蓋則要求覆蓋程序所有可能的路徑,路徑覆蓋需要對所有可能的路徑進行測試(包括循環、條件組合、分支選擇等)。那么需要設計大量、復雜的測試用例,使得工作量呈指數級增長。而在有些情況下,一些執行路徑是不可能被執行的。
原文轉自:http://blog.csdn.net/rl529014/article/details/51556707#t1