等價類分法 新解

2021-10-01 00:24:26 字數 3856 閱讀 9626

1、等價類分法的基本概念

等價類分法是將

測試空間劃分成若干個子集,並且滿足每個子集中的任一資料對揭露程式中的缺陷都是等價的,這些子集就叫做等價類或者叫等價子集。

比如乙個程式的輸入資料滿足   0其他為無效資料,那麼就可以劃分成兩個等價類,乙個是有效資料的等價類,另乙個是無效資料的等價類,設計測試用例時就可以從這兩個等價類中分別取乙個輸入資料來得到兩個測試用例。有效資料的等價類為1~99,所以可以從1~99中任意取乙個數作為輸入資料來作為乙個測試用例,從x不等於1~99中的資料中任意取乙個資料作為輸入資料得到另乙個測試用例。

1~99中的任一資料和其他資料都是等價的,比如使用了2來進行測試,那麼可以假定資料2測試通過的話,1~99中的其他資料也能測試通過。

等價類分法可以用來對一些不能窮舉的集合進行合理分類,從各個等價類中選出有代表性的資料進行測試,從而保證設計出來的設計用例具有一定的代表性和一定範圍內的完整性,有效地縮減測試用例的數量。

等價類實際上是符合測試空間劃分原則的一種特殊劃分形式,即劃分完後的子集裡的可測資料是等價的,而測試空間劃分原則則是要求裡面有乙個可測資料測試通 過能夠代表其他測試資料在滿足選取概率條件下也都可以通過。等價類選取測試資料時可以選取等價類中的任意資料作為測試資料,而測試空間劃分原則劃分的子集 一般是選擇指定的資料作為測試資料,如果按測試空間劃分原則劃分後的子集剛好成為了等價類才可以選擇裡面的任一資料作為測試資料。

2、等價類的幾種型別

在現實情況中,由於缺陷的可能情況非常多,乙個子集中的資料對某種缺陷是等價的,但對另外一種缺陷可能又是不等價的。所以把等價類分為弱等價類、強等價類、理想等價類三種型別。

1)弱等價類

弱等價類是考慮某個單一缺陷情況下的等價情況,子集裡所有資料在這種缺陷假設下是等價的,並且劃分成的幾個等價類能夠覆蓋整個測試空間的單一缺陷。比如以下一段程式:

void func(unsigned int x)

else

}

我們可以將資料劃分為兩個等價類,0~10為1個等價類,大於10的資料為1個等價類,在考慮「>」號誤寫成「<」號這種缺陷的情況下,這 兩個等價集中的資料都是等價的,比如0~10這個等價類中,使用0或使用10來進行測試都能發現缺陷。這兩個等價類中各自抽取乙個測試資料進行測試,都能 代表其他資料揭示出「>」號誤寫成「<」號這種缺陷來,因此整個測試空間都被覆蓋了。

2)強等價類

強等價類是在多個缺陷假設前提下,各個等價類中的可測資料在單個或多個缺陷假設下是等價的,並且劃分的各個等價子集中各自取乙個測試資料可以覆蓋整個測試空間的多個缺陷情況。

再考慮前面弱等價類中的例子程式,出錯的可能性有那些呢?除了大於號會錯寫成小於號外,實際上還有可能寫成大於等於號,10有可能寫成1或100等大於 10或小於10的數,為方便描述以錯寫成1和100為例,事實上錯誤成其他數和錯寫成1和100是等價的。這樣將各種可能出錯的情況組合起來,程式中的判 斷條件有可能有以下12種情況:

判斷條件

揭示缺陷的等價類

判斷條件

揭示缺陷的等價類

判斷條件

揭示缺陷的等價類

x>10

x>1

x>100

x<10

x<1

x<100

,

x<=10

,

x<=1

x<=100

,

x>=10

x>=1

x>=100

考慮0~10這個集合,在誤寫成中間一列條件中情況下,裡面的資料並不等價,比如誤寫成x>1的情況下,使用1做測試和使用2做測試揭示缺陷是不同的,使用1做測試發現不了缺陷,但使用2測試就能發現缺陷。

在判斷條件誤寫成x>=10條件下,10和0~9中的任一資料也不等價,並且使用大於10的資料也無法揭示出條件錯寫成x>=10這個缺陷,因此整個測試空間的多個缺陷無法被已劃分的兩個等價類來覆蓋,10需要單獨劃分成乙個等價類。

這樣將資料劃分成三個等價類、、,再看看這三個等價類是否可以覆蓋表中各種出錯情況,顯然在x>100和 x>=100兩種情況下,大於10的資料集合中的資料是不等價的,使用大於100的資料不能揭示出缺陷,但使用大於10小於100的資料卻能揭示出 缺陷,因此需要對大於10的資料再劃分等價類,實際上只要將邊界值劃乙個單獨的等價類就可以了。

這 樣總共得到四個等價類、、、,從這四個等價類中各取乙個資料的話就可以將以上列出的所有可能的缺陷情況都揭 示出來,但是各個等價類並不是對所有缺陷都等價的,這種劃分的等價類由於可以將各種缺陷情況覆蓋到,把它叫叫做強等價類。

3)理想等價類這種等價類是嚴格按照等價類的定義來劃分的,即劃分的各個等價類中,每個等價類都滿足每個可測資料對揭示所有可能的缺陷都是等價的,並且劃分的各個等價類中各自任意取乙個可測資料做為測試資料可以將全部的缺陷都揭示出來。

理想等價類在實際情況中是很罕見的,除非只有很少的一兩種可能的出錯情況,否則很難劃分成對揭示所有可能缺陷都等價的子集。所以在實際使用時,沒有必要去尋找理想等價類,否則徒然浪費時間,一般採用強等價類或弱等價類進行測試就足夠了。

3、等價類的判定方法

當將乙個輸入域進行等價類劃分後,劃分出來的子集是否是等價的基本上靠經驗判斷,這給使用等價類分法帶來很大的難度,憑經驗劃分出來的等價類也許並不是真的等價類,如何才能確定劃分的類是等價類呢?

按照前面講過的弱等價類與強等價類的定義,要知道劃分的子集是否等價類先要知道又那些種類的可能缺陷,然後將劃分的等價類對照可能的缺陷進行驗證看是否能揭示出那些可能發生的缺陷。

這種判定方法的缺點是必須先知道會發生那些可能的缺陷,實際情況中往往並不知道所有可能的缺陷,那麼在實際情況中如何採取一些簡單方法來判定乙個子集是否是等價類呢?

當乙個子集的處理過程與輸出完全一致時,基本上可以認為是等價類,處理過程是否相同很容易從需求和設計中得出。但是現實情況中往往同乙個等價類中的不同資料對應的輸出結果並不相同,所以這種方法並不能對所有的情況都適用。

其實沒有什麼特別好的辦法可以用來判斷乙個子集中的任一資料對揭露程式中的缺陷都是等價的,除非將所有資料測試一遍。但是有一些條件可以協助判斷出某個子集不是等價類。

1)路徑判定法

最容易判定乙個子集是否是等價類的方法就是路徑判定法,路徑判定法的基本思想是:對於子集中的任一資料,如果執行路徑並不完全相同,那麼這個子集不是等價類。

需要注意的是,路徑判定法的反命題並不成立,即不能由執行路徑相同就推斷出子集中的資料是等價類。因為執行路徑相同情況下得到的結果不一定相同,舉例如下:

int mul(int a)

在mul()函式中,不論a輸入多少,執行路徑都只有一條,但是當a超過一定大小時,會出現整數乘法溢位,顯然不能將a的任意取值都作為等價類。

路徑相同之所以不能認為是等價類的根本原因在於程式設計中本身可能存在缺陷和遺漏,設計或編碼後的程式中的路徑本身就可能不正確,測試用例設計時不能假定程式中的路徑一定是正確的。

2)概率判定法

概率判定法是通過計算等價子集中的資料揭示某個缺陷的概率來進行判斷的方法。如果在乙個等價子集中,所有資料的揭示缺陷的概率不相同並有一定差距,那麼可以認為不是等價類。

這個判定法的使用並不是說事先需要知道所有可能發生的缺陷,它只需要找到乙個缺陷來證明在這種缺陷情況下,子集中的資料在揭示這個缺陷方面的概率是不相同的,那麼就可以認為在這種缺陷條件下不是等價類,至少可以認為不是強等價類。

比如前面講的x>10的劃分,這個集合中,在寫成x>=10的情況下,10和子集中其他資料揭示缺陷的概率是不同 的,0~9都不能發現缺陷,測試會通過,也就是說揭示出這個缺陷的概率為0,而10則能揭示出這個缺陷,所以它們不能劃分到同乙個等價類裡面。

演算法新解 一

一.前言 function min free a x 0 loop if x a then return x else x x 1 其中,定義如下 function x,x for i 1 to len x do if x x i then return false else return true...

等價類劃分法

等價類劃分法 何為等價類,某個輸入域的集合,在這個集合中每個輸入條件都是等效的,如果其中乙個的輸入不能導致問題發生,那麼集合中其它輸入條件進行測試也不可能發現錯誤。等價類分為有效等價類和無效等價類,有效等價類就是由那些對程式的規格說明有意義的 合理的輸入資料所構成的集合 無效等價類就是那些對程式的規...

等價類劃分法例項

基本概念 等價類 對應用程式的規格 介面 的輸入資料構成的集合 有效等價類 對應用程式的規格說明來說是合理的有意義的輸入資料 無效等價類 六條確定等價類的原則 1 在輸入條件規定了取值範圍或值的個數的情況下,則可以確立乙個有效等價類 在範圍之內的等價類 和兩個無效等價類 有效範圍的兩側 2 在輸入條...