在查了大量資料及看同學的博客之外,寫下了這篇作業性質的博文。為避免重復的勞動,故此本文的一些內容直接引用他人的博客,不再贅述。
等價類划分是一種典型的黑盒測試方法,用這一方法設計測試用例完全不考慮程序的內部結構,只根據對程序的要求和說明,即需求規格說明書。我們必須仔細分析和推敲說明書的各項需求,特別是功能需求。把說明書中對輸入的要求和輸出的要求區別開來並加以分解。
1.等價類定義及划分原則
此處附表達很全面的解雪君博文http://www.cnblogs.com/tju-crab/p/4355160.html,感謝此博主。
2.強弱等價類測試例子
此部分不屬課程范圍,但以增強見識為由,隨附。不定面試就用到了呢。
在尋找等價區間時,設法把軟件的相似輸入、輸出、操作分成組,這些組就是等價區間。
等價類的重要問題是它們構成的集合的划分,其中,划分是指互不相交的一組子集,這些子集的並是整個集合。這對於測試有兩點非常重要的意義:表示整個集合這個事實提供了一種形式的完備性,而互不相交可保證一種形式的無冗余性。由於子集是由等價關系決定的,因此子集的元素都有一些共同點。等價類測試的思想是通過每個等價類中的一個元素標識測試用例。如果廣泛選擇等價類,則這樣可以大大減低測試用例之間的冗余。
為了便於理解,以下討論涉及有兩個變量X1和X2的函數F。如果函數F實現為一個程序,則輸入變量X1和X2將擁有以下邊界,以及邊界內的區間:
a≤X1≤d,區間為[a,b),[b,c),[c,d]
e≤X2≤g,區間為[e,f),[f,g]
其中方括號和圓括號分別表示閉區間和開區間的端點。X1,X2的無效值是X1<a,X1>d,X2<e,X2>g。以此作為例子,我們將進一步討論等價類划分法。
弱一般等價類測試(覆蓋每個變量的定義域,而所用用例最少)
采用上面給出的標記,弱一般等價類測試通過一個測試用例中的每個等價類(區間)的一個變量實現(請注意單邊假設作用)。對於前面給出的例子,可得到如下圖所示的弱等價類測試用例。
由函數的定義可知,帶陰影的矩形中的任何點都是函數F的有效輸入。這三個測試用例使用每個等價類中的一個值。我們以對稱方式標識這些測試用例,於是得到外在的模式。事實上,永遠都有等量的弱等價類測試用例,因為划分中的類對應最大子集數。
強一般等價類測試
強一般等價類測試基於多缺陷假設,因此需要等價類笛卡爾積的每個元素對應的測試用例,如下圖所示:
請注意,這些測試用例的模式與命題邏輯中的真值表構造具有相似性。笛卡爾積可以保證兩種意義上的“完備性”:一是覆蓋所有的等價類,二是有可能的輸入組合中的一個。
事實上,“好的”等價類測試的關鍵是等價關系的選擇。注意被“相同處理”的輸入。在大多數情況下,等價類測試定義輸入定義域的類。沒有理由不能根據被測程序函數的輸出值域定義等價關系,我們可以看到,這對於三角形問題是最簡單的方法。
弱健壯等價類測試
這種測試的名稱顯然與直覺矛盾,且自相矛盾。怎么能夠既弱又健壯呢?說它健壯,是因為這種測試考慮了無效值;說它弱,是因為有單缺陷假設。
1、對於有效輸入,使用每個有效類的一個值。(就像我們在所謂弱一般等價類測試中所做的一樣。請注意,這些測試用例中的所有輸入都是有效的。)
2、對於無效輸入,測試用例將擁有一個無效值,並保持其余的值都是等效的。(因此,“單缺陷”會造成測試用例失敗。)
按照這種策略產生的測試用例如下圖所示:
健壯等價類測試有兩個問題。第一個問題是,規格說明常常並沒有定義無效測試用例所預期的輸出是什么。(我們可以把這看作是規格說明的不足,但是這並不能解決問題。)因此,測試人員需要花費大量時間定義這些測試用例的輸出。第二個問題是,強類型語言沒有必要考慮無效輸入。傳統等價類測試是諸如FORTRAN和COBOL這樣的語言占統治地位的年代的產物,因此那時這種錯誤很常見。事實上,正是由於經常出現這種錯誤,才促使人們實現強類型語言。
對於第二個問題,應該是指對於純編程語言而言的。在實際的項目中,由於人的因素(人總會犯錯誤,即使編程語言本身再怎么完美,諸如Java、Python、C++這樣的強類型語言,也無法避免),以及業務的具體要求,無效輸入往往要考慮業務因素,所以任何時刻都必須考慮無效輸入。
強健壯等價類測試
至少這種測試的名稱既不與直覺矛盾,也不自相矛盾,只是有些冗余。像以前的定義一樣,健壯是指要考慮無效值,強是指多缺陷假設。
我們從所有的等價類笛卡爾積的每個元素中獲得測試用例,如下圖所示:
例題:根據下面給出的規格說明,利用等價類划分的方法,給出足夠的測試用例。“一個程序讀入3個整數,把這3個數值看作一個三角形的3條邊的長度值。這個程序要打印信息,說明這個三角形是不等邊的、是等腰的、是等邊的,或者不能構成三角形”。
在描述問題時,我們提到有四種可能出現的輸出:非三角形、不等邊三角形、等腰三角形和等邊三角形。可以使用這些輸出標識如下所示的輸出(值域)等價類:
R1={<a,b,c>:有三條邊a、b和c的等邊三角形}
R2={<a,b,c>:有三條邊a、b和c的等腰三角形}
R3={<a,b,c>:有三條邊a、b和c的不等邊三角形}
R4={<a,b,c>:三條邊a、b和c的不構成三角形}
四個弱一般等價類測試用例是:
由於a、b和c沒有有效區間,則強一般等價類測試用例與弱一般等價類測試用例相同。
考慮a、b和c的無效值產生的以下額外弱健壯等價類測試用例:
以下是額外強健壯等價類測試用例三維立方的一個“角”:
請注意,預期輸出如何完備地描述無效輸入值。
等價類測試顯然對用來定義類的等價關系很敏感。如果在輸入定義域上定義等價類,則可以得到更豐富的測試用例集合。三個整數a、b和c有些什么可能的取值呢?這些整數可以相等,有一對整數相等(有三種相等方式),或都不相等。
D1={<a,b,c>:a=b=c},D2={<a,b,c>:a=b,a≠c},D3={<a,b,c>:a=c,a≠b}
D4={<a,b,c>:b=c,a≠b},D5={<a,b,c>:a≠b,a≠c,b≠c}
作為一個單獨的問題,我們可以通過三角形的性質來判斷三條邊是否構成一個三角形。(例如,三元組<1,4,1>有一對相等的邊,但是這些邊不構成一個三角形。)
D6={<a,b,c>:a≥b+c},D7={<a,b,c>:b≥a+c},D8={<a,b,c>:c≥a+b}
如果我們要徹底一些,可以將“大於或等於”分解為兩種不同的情況,這樣D6就變成
D6′={<a,b,c>:a=b+c},D6″={<a,b,c>:a>b+c},同樣對於D7和D8也有類似的情況。
列出等價類表,如下所示:
設計測試用例:輸入順序是[A,B,C],如下表所示:
請記住,等價分配的目標是把可能的測試用例組合縮減到仍然足以滿足軟件測試需求為止。因為,選擇了不完全測試,就要冒一定的風險,所以必須仔細選擇分類。
關於等價分配的最后一點要注意的是,這樣做有可能不客觀。科學有時也是一門藝術。測試同一個復雜軟件的兩個測試人員,可能會制定出兩組不同的等價區間。只要審查等價區間的人認為它們都足以覆蓋測試對象就可以了。
3.EditBox
- 允許1到6個英文字符或數字,按OK結束
- 有效等價類和無效等價類
有效等價類 | 無效等價類 |
E1:長度:1到6 | T1:長度:0,7 |
E2:字符:a-z,A-Z,0-9 | T2:字符:英文、數字以外字符,控制字符,標點符號 |
測試用例設計,根據有效和無效等價類可以設計出6個測試用例
編號 | 輸入 | 預期輸出 |
Test1 | daiA93 | 有效 |
Test2 | daiwenjing | 無效 |
Test3 | @123 | 無效 |
Test4 | 123回車鍵 | 無效 |
Test5 | (空) | 無效 |
Test6 | 123,45 | 無效 |
想實現編碼的,可參照博文http://www.cnblogs.com/dengye/p/4356777.html,只需簡單修改即可。
4.個人想法
等價類划分方法比較簡單,工作量也小。但考慮到軟件測試的健壯性,還是與邊界值分析法結合更好,而且不是每一種軟件測試都適合等價類划分法。如今我們沒有實際在公司干過這一行,暫沒有實際經驗可以添加。