等價類划分法:
一、方法簡介
1.定義
是把所有可能輸入的數據,即程序的輸入域划分策划國內若干部分(子集),然后從每一個子集中選取少數具有代表性的數據作為測試用例。方法是一種重要的、常用的黑盒測試用例設計方法。
2.划分等價類
等價類是指某個輸入域的子集合。在該子集合中,各個輸入數據對於揭露程序中的錯誤都是等效的,並合理地假定:測試某等價類的代表值就等於對這一類其他值的測試,因此,可以把全部輸入數據合理划分為若干等價類,在每一個等價類中取一個數據作為測試的輸入條件就可以用少量代表性的測試數據取得較好的測試結果。等價類划分有兩種不同的情況:有效等價類和無效等價類。
1)有效等價類
是指對於程序的規格說明來說是合理的、有意義的輸入數據構成的集合。利用有效等價類可檢驗程序是否實現了規格說明所規定的功能和性能。
2)無效等價類
指對程序的規格說明是不合理的或無意義的輸入數據所構成的集合。對於具體的問題,無效等價類至少應有一個,也可能多個。
設計測試用例時,要同時考慮這兩種等價類。因為軟件不僅要能接收合理的數據,也要能經受意外的考驗,這樣的測試才能確保軟件具有更高的可靠性。
3.划分等價類的標准
1) 完備測試、避免冗余
2) 划分等價類重要的是:集合的划分、划分為互不相交的一組子集,而子集的並是整個集合
3) 並是整個集合:備性
4) 子集互不相交:保證一種形式的無冗余性
5) 同一類中標識(選擇)一個測試用例,同一等價類中,往往處理相同,相同處理映射到“相同的執行路徑”。
4.划分等價類的方法
1) 在輸入條件規定了取值范圍或值的個數的情況下,則可以確立一個有效等價類和兩個無效等價類。如:輸入值是學生成績,范圍是0~100;
2)在輸入條件規定了輸入值的集合或者規定了“必須如何”的條件的情況下,可確立一個有效等價類和一個無效等價類:
3)在輸入條件是一個布爾量的情況下,可確定一個有效等價類和一個無效等價類。
4)在規定了輸入數據的一組值(假定n個),並且程序要對每一個輸入值分別處理的情況下,可確立n個有效等價類和一個無效等價類。
例:輸入條件說明學歷可為:專科、本科、碩士、博士四種之一,則分別取這四種的四個值作為四個有效等價類,另外把四種學歷之外的任何學歷作為無效等價類。
5)在規定了輸入數據必須遵守的規則情況下,可確立一個有效等價類(符合規則)和若干個無效等價類(從不同角度違反規則);
6)在確知已划分的等價類中各元素在程序處理中的方式不同的情況下,則應在將該等價類進一步的划分為更小的等價類。
5.設計測試用例
在確立了等價類后,可建立等價類表,列出所有划分出的等價類輸入條件:有效等價類、無效等價類,然后從划分出的等價類中按以下三個原則設計測試用例:
1)為每一個等價類規定一個唯一的編號;
2)設計一個新的測試用例,使其盡可能多地覆蓋尚未被覆蓋地有效等價類,重復這一步,直到所有的有效等價類都被覆蓋為止;
3)設計一個新的測試用例,使其僅覆蓋一個尚未被覆蓋的無效等價類,重復這一步,直到所有的無效等價類都被覆蓋為止。
二、實戰演習
1、三角形問題
1、某程序規定:“輸入三個整數a、b、c分別作為三邊的邊長構成三角形。通過程序判定所構成的三角形的類型,當此三角形為一般三角形、等腰三角形、等邊三角形時,分別做計算。。。”用等價類划分方法為該程序進行測試用例設計。(三角形問題的復雜之處在於輸入與輸出之間的關系比較復雜。)
分析題目中給出和隱含的對輸入條件的要求:
(1)整數 (2)三個數(3)非零數(4)正數
(5)兩邊之和大於第三邊(6)等腰 (7)等邊
如果a、b、c滿足條件(1)~(4),則輸出下列四種情況之一:
1)如果不滿足條件(5),則程序輸出為“非三角形”
2)如果三條邊相等即滿足條件(7),則程序輸出為“等邊三角形”
3)如果只有兩條邊相等,及滿足條件(6),則程序輸出為“等腰三角形”
4)如果三條邊都不相等,則程序輸出為“一般三角形”
列出等價類表並編號
覆蓋有效等價類的測試用例:
a b c覆蓋等價類號碼
3 4 5 (1) (7)
4 4 5 (1)(7) (8)
4 5 5 (1) (7) (9)
5 4 5 (1) (7) (10)
4 4 4 (1) (7) (11)
覆蓋無效等價類的測試用例:
2、NextDate
2、NextDate函數包含三個變量:month、day、year,函數的輸出為輸入日期后一天的日期。
例如,輸入2006年3月7日,則函數的輸出為2006年3月8日。要求輸入變量month、day、year均為整數值,並且滿足下列條件:
1、1<=month<=12
2、1<=day<=31
3、1812<=year<=2012
1)有效等價類為:
M1={月份:1<=月份<=12}
D1={日期:1<=日期<=31}
Y1={年份:1812<=年<=2012}
2)若條件1~3中任何一個條件失效,則NextDate函數都會產生一個輸出,指明相應的變量超出取值范圍,比如“month的值不在12范圍中”。顯然還存在這大量的year、month、day的無效組合,NextDate函數將這些組合作為統一的輸出:“無效輸入日期”。
其無效等價類為:
M2={月份:月份<1}
M3={月份:月份>12}
D2={日期:日期<1}
D3={日期:日期>31}
Y2={年份:年<1812}
Y3={年份:年>2012}
弱一般等價類測試用例
月份 |
日期 |
年 |
預期輸出 |
6 |
15 |
1912 |
1912年6月16日 |
強一般等價類測試用例同弱一般等價類測試用例
注:弱有單缺陷假設;健壯考慮了無效值。
(一)弱健壯等價類測試
用例 |
ID |
月份 |
日期 |
年 |
預期輸出 |
WR1 |
6 |
15 |
1912 |
1912年6月16日 |
|
WR2 |
0 |
1 |
1912 |
月份不在1~12中 |
|
WR3 |
15 |
1 |
1912 |
月份不在1~12中 |
|
WR4 |
1 |
0 |
1912 |
日期不在1~31中 |
|
WR5 |
1 |
32 |
1912 |
日期不在1~31中 |
|
WR6 |
1 |
1 |
1811 |
年不在1812~2012中 |
|
WR7 |
1 |
1 |
2013 |
年不在1812~2012中 |
(二)強健壯等價類測試
用例 |
ID |
月份 |
日期 |
年 |
預期輸出 |
SR1 |
15 |
1 |
1912 |
月份不在1~12中 |
|
SR2 |
1 |
32 |
1912 |
日期不在1~31中 |
|
SR3 |
1 |
1 |
1811 |
年份不在1812~2012中 |
|
SR4 |
0 |
0 |
1912 |
兩個無效一個有效 |
|
SR5 |
0 |
1 |
1811 |
兩個無效一個有效 |
|
SR6 |
1 |
0 |
1811 |
兩個無效一個有效 |
|
SR7 |
0 |
0 |
1811 |
三個無效 |