由於窮舉測試工作量太大,以至於無法實際完成,促使我們在大量的可能數據中選取其中的一部分作為測試用例。例如,在不了解等價分配技術的前提下,我們做計算器程序的加法測試時,測試了1+1,1+2,1+3和1+4之后,還有必要測試1+5和1+6嗎?能否放心地認為它們是正確的?
等價類划分是把程序的輸入域划分為若干部分,然后從每個部分中選取少數代表性數據作為測試用例。每一類的代表性數據在測試中的作用等價於這一類中的其他值,也就是說,如果某一類中的一個例子發現了錯誤,這一類等價類中的其他例子也能發現同樣的錯誤;反之,如果某一類中的一個例子沒有發現錯誤,則這一類中的其他例子也不會查出錯誤(除非等價類中的某些例子屬於另一等價類,因為幾個等價類可能相交的)。使用這一方法設計測試用例,首先必須在分析需求規格說明的基礎上划分等價類,列出等價類表。
1、划分等價類和列出等價類表
等價類是指某個輸入域的子集合。等價類划分有兩種不同的情況:有效等價類和無效等價類
有效等價類:指對於程序的規格說明來說是合理的、有意義的輸入數據構成的集合。利用有效等價類可檢驗程序是否實現了規格說明中所規定的功能和性能。
無效等價類:與有效等價類的定義相反
設計測試用例時,要同時考慮這兩種等價類。因為軟件不僅要能接收合理的數據,也要能經受意外的考驗。這樣的測試才能確保軟件具有更高的可靠性。
下面給出6條確定等價類的原則:
(1)在輸入條件規定了取值范圍或值的個數的情況下,可以確立一個有效等價類和兩個無效等價類。
(2)在輸入條件規定了輸入值的集合或者規定了“必須如何”的條件情況下,可以確定一個有效等價類和一個無效等價類
(3)在輸入條件是一個布爾量的情況下,可以確定一個有效等價類和一個無效等價類。
(4)在規定了輸入數據的一組值(假定n個),並且程序要對每一個輸入值分別處理的情況下,可確立n個有效等價類和一個無效等價類。
(5)在規定了輸入數據必須遵守的規則的情況下,可確立一個有效等價類(符合規則)和若干個無效等價類(從不同角度違反規則)。
(6)在確知已划分的等價類中,各元素在程序處理中的方式不同的情況下,則應再將該等價類進一步地划分為更小的等價類。
2、確定測試用例
根據已列出的等價類表,按以下步驟確定測試用例:
(1)為每個等價類規定一個唯一的編號
(2)設計一個新的測試用例,使其盡可能多地覆蓋尚未覆蓋的有效等價類。重復這一步,最后使得所有有效等價類均被測試用例所覆蓋。
(3)設計一個新的測試用例,使其只覆蓋一個無效等價類。重復這一步是所有無效等價類均被覆蓋。
3、例題:根據下面給出的規格說明,利用等價類划分的方法,給出足夠的測試用例。
“一個程序讀入3個整數,把這3個數值作為一個三角形的3條邊的長度值,這個程序要打印出信息,說明這個三角形是不是等邊的、是等腰的、還是一般的。”
分析:我們可以設三角形的3條邊分別為A,B,C。如果它們能構成三角形,必須滿足:A>0,B>0,C>0,且A+B>C,A+C>B,B+C>A。
如果是等腰的,還有判斷 A=B,或B=C,或A=C
如果是等邊的,則需判斷A=B且B=C且A=C
列出等價類表,如下:
輸入條件 | 有效等價類 | 無效等價類 |
是否三角形的3條邊 | (A>0), (1) (B>0), (2) (C>0), (3) (A+B>C), (4) (B+C)>A, (5) (A+C)>B, (6) |
(A<=0), (7) (B<=0), (8) (C<=0), (9) (A+B<=C), (10) (B+C<=A), (11) (A+C<=B), (12) |
是否等腰三角形 | (A=B), (13) (A=C), (14) (B=C), (15) |
(A!=B) and (B!=C) and (A!=C), (16) |
是否等邊三角形 | (A=B) and (B=C) and (A=C), (17) |
(A!=B), (18) (B!=C), (19) (C!=A), (20) |
設計測試用例:輸入順序是 A,B,C,如下表:
序號 | 【A,B,C】 | 覆蓋等價類 | 輸出 |
1 | 【3,4,5】 | (1),(2),(3),(4),(5),(6) | 一般三角形 |
2 | 【0,1,2】 | (7) | 不能構成三角形 |
3 | 【1,0,2】 | (8) | 不能構成三角形 |
4 | 【1,2,0】 | (9) | 不能構成三角形 |
5 | 【1,2,3】 | (10) | 不能構成三角形 |
6 | 【1,3,2】 | (11) | 不能構成三角形 |
7 | 【3,1,2】 | (12) | 不能構成三角形 |
8 | 【3,3,4】 | (1),(2),(3),(4),(5),(6),(13) | 等腰三角形 |
9 | 【3,4,4】 | (1),(2),(3),(4),(5),(6),(14) | 等腰三角形 |
10 | 【3,4,3】 | (1),(2),(3),(4),(5),(6),(15) | 等腰三角形 |
11 | 【3,4,5】 | (1),(2),(3),(4),(5),(6),(16) | 非等腰三角形 |
12 | 【3,3,3】 | (1),(2),(3),(4),(5),(6),(17) | 等邊三角形 |
13 | 【3,4,4】 | (1),(2),(3),(4),(5),(6),(18) | 非等邊三角形 |
14 | 【3,4,3】 | (1),(2),(3),(4),(5),(6),(19) | 非等邊三角形 |
15 | 【3,3,4】 | (1),(2),(3),(4),(5),(6),(20) | 非等邊三角形 |
請記住,等價分配的目標是把可能的測試用例組合縮減到仍然足以滿足軟件測試需求為止。因為選擇了不完全測試,就要冒一定的風險,所以必須仔細選擇分類。