一.方法簡介
1.定義
把所有可能的輸入資料,即程式的輸入域劃分成若幹部分(子集),然後從每一個子集中選取少數具有代表性的資料作為測試用例。該方法是一種重要的,常用的黑盒測試用例設計方法。
2.劃分等價類:
等價類是指某個輸入域的子集合。在該子集合中,各個輸入資料對于揭露程式中的錯誤都是等效的,并合理地假定:測試某等價類的代表值就等于對這一類其它值的測試,是以,可以把全部輸入資料合理劃分為若幹等價類,在每一個等價類中取一個資料作為測試的輸入條件就可以用少量代表性的測試資料取得較好的測試結果。
等價類劃分可有兩種不同的情況:有效等價類和無效等價類。
1)有效等價類
是指對于程式的規格說明來說是合理的、有意義的輸入資料構成的集合。利用有效等價類可檢驗程式是否實作了規格說明中所規定的功能和性能。
2)無效等價類
與有效等價類的定義恰巧相反。無效等價類指對程式的規格說明是不合理的或無意義的輸入資料所構成的集合。對于具體的問題,無效等價類至少應有一個,也可能有多個。
設計測試用例時,要同時考慮這兩種等價類。因為軟體不僅要能接收合理的資料,也要能經受意外的考驗,這樣的測試才能確定軟體具有更高的可靠性。
有效等價類和無效等價類的劃分
3.劃分等價類的标準:
1)劃分等價類重要的是:集合的劃分,劃分為互不相交的一組子集,而子集的并是整個集合;
1.1)并是整個集合:完備性;
1.2)子集互不相交:保證一種形式的無備援性;
1.3)同一類中辨別(選擇)一個測試用例,同一等價類中,往往處理相同,相同處理映射到"相同的執行路徑":等價性。
4.劃分等價類的方法
1)在輸入條件規定了取值範圍或值的個數的情況下,則可以确立一個有效等價類和兩個無效等價類。如:輸入值是學生成績,範圍是0~100;
2)在輸入條件規定了輸入值的集合或者規定了"必須如何"的條件的情況下,可确立一個有效等價類和一個無效等價類;
3)在輸入條件是一個布爾量的情況下,可确定一個有效等價類和一個無效等價類。
4)在規定了輸入資料的一組值(假定n個),并且程式要對每一個輸入值分别處理的情況下,可确立n個有效等價類和一個無效等價類。
例:輸入條件說明學曆可為:專科、大學、碩士、博士四種之一,則分别取這四種這四個值作為四個有效等價類,另外把四種學曆之外的任何學曆作為無效等價類。
5)在規定了輸入資料必須遵守的規則的情況下,可确立一個有效等價類(符合規則)和若幹個無效等價類(從不同角度違反規則);
6)在确知已劃分的等價類中各元素在程式進行中的方式不同的情況下,則應再将該等價類進一步的劃分為更小的等價類。
5.設計測試用例
在确立了等價類後,可建立等價類表,列出所有劃分出的等價類輸入條件:有效等價類、無效等價類,然後從劃分出的等價類中按以下三個原則設計測試用例:
1)為每一個等價類規定一個唯一的編号;
2)設計一個新的測試用例,使其盡可能多地覆寫尚未被覆寫地有效等價類,重複這一步,直到所有的有效等價類都被覆寫為止;
3)設計一個新的測試用例,使其僅覆寫一個尚未被覆寫的無效等價類,重複這一步,直到所有的無效等價類都被覆寫為止。(原因:不同的無效等價類可能互相屏蔽,是以用單一測試用例覆寫無效等價類)
二.實戰演習
1.某程式規定:“輸入三個整數 a 、 b 、 c 分别作為三邊的邊長構成三角形。通過程式判定所構成的三角形的類型,當此三角形為一般三角形、等腰三角形及等邊三角形時,分别作計算…”“。用等價類劃分方法為該程式進行測試用例設計。(三角形問題的複雜之處在于輸入與輸出之間的關系比較複雜。)
解答:
方式1
根據等價分類的定義:是把所有可能的輸入資料,即程式的輸入域劃分成若幹部分(子集),分成有效等價類,無效等價類.而有效,無效的分類是根據題目規定來的。
仔細分析題目:
"輸入三個整數 a 、 b 、 c 分别作為三邊的邊長構成三角形。通過程式判定所構成的三角形的類型,當此三角形為一般三角形、等腰三角形及等邊三角形時,分别作計算 …
"
有效等價類:
輸入三個數(a,b,c一個都不能少),
輸入整數(a為整數,b為整數,c為整數),
輸入的數構成三角形(a>0,b>0,c>0 && 兩邊之和大于第三邊)
無效等價類:不滿足有效等價類的
根據劃分的方法之一:在确知已劃分的等價類中各元素在程式進行中的方式不同的情況下,則應再将該等價類進一步的劃分為更小的等價類。
上述題目中等價類,輸入的數構成三角形,不同三角形處理不一樣,是以要進一步劃分有效等價類為:
輸入的數值構成一般三角形,輸入的數值構成等腰三角形,輸入的數值構成等邊三角形,是以,有效等價類為:
輸入三個數(a,b,c一個都不能少),
輸入整數(a,b,c都為整數),
輸入的數值構成三角形(a>0,b>0,c>0&& 兩邊之和大于第三邊--子分類>>夠成一般三角形:a,b,c都不相等;構成等腰三角形:其中a,b,c中僅兩個數相等;構成等邊三角形:a,b,c都相等)
無效等價類:
輸入少于三個數(a,b,c僅少1個,僅少2個);
輸入整數(a,b,c僅某個不為整數,僅某2個不為整數,僅3個都不為整數);
輸入的數值不構成三角形;
1)a,b,c三個數僅某個數為0,僅某兩個數為0,三個都為0
2)a,b,c中僅某個數小于0,僅某2個數小于0,3個數都為0
3)輸入三個數:某兩數之和小于第三個數,某兩數之和等于第三個數)
方式二:
按業務流程來,按等價劃分的原則來
輸入資料->處理(判斷)->輸出
一種,我們按輸入進行分類,這個情況比較複雜,不好分類
一種,我們按輸出進行分類,這個情況就比較簡單了。是以選擇輸出入手
輸出形狀:
{構成三角形,不構成三角形} à分成兩類,且并為整個集合
1)構成三角形-->{一般三角形,等腰三角形,等邊三角形}
2)不同三角形判斷不一樣,同一等價類中,出現處理不同,是以繼續分類,輸出形狀:一般三角形,等腰三角形,等邊三角形,不構成三角形
---------------------------------------------------
有效等價類的要求:
題目顯示要求:整數,三邊,
每邊大于0(隐性需求)
兩邊之和大于第三邊(隐性需求):{一般三角:三邊不相等;等腰三角:兩邊相等;等邊三角:三邊相等}
得出最後的有效等價類
整數
存在三邊
三邊都大于0
兩邊之和大于第三邊,且三邊不相等(一般三角形)
兩邊之和大于第三邊,且僅兩邊相等(等腰三角形)
三邊相等(因為三邊相等,是以兩邊之和必定大于第三邊)(等邊三角形)
無效等價的要求à根據有效等價來确定
存在非整數
不滿足三邊
存在邊小于等于0
兩邊之和小于等于第三邊
---------------------------------------------------------
得出最後的無效等價類
存在非整數:{一邊非整數,兩邊非整數,三邊非整數}
不滿足三邊:{a,b,c僅少1個,僅少2個}
邊存在小于0:{一邊小于0,兩邊小于0,三邊都小于0}
邊存在等于0:{一邊等于0,兩邊等于0,三邊等于0}
兩邊之和小于第三邊:{a+b,a+c,b+c}
兩邊之和等于第三邊:{a+b,a+c,b+c}
得出最有無效等價類
a為非整數,b,c整數
b為非整數,a,c整數
c為非整數,a,b整數
a&b為非整數,c整數
a&c為非整數,b整數
c&b為非整數,a整數
隻給a
隻給b
隻給c
……
等價類劃分圖
用例設計
覆寫有效等價類的測試用例:
a b c 覆寫等價類号碼
3 4 5 (1)--(4)
4 4 5 (1)--(3),(5)
5 4 5 (1)--(3),(6)
5 4 4 (1)--(3),(7)
4 4 4 (1)--(3),(8)
覆寫無效等價類的測試用例:
2.設有一個檔案管理系統,要求使用者輸入以年月表示的日期。假設日期限定在1990年1月~2049年12月,并規定日期由6位數字字元組成,前4位表示年,後2位表示月。現用等價類劃分法設計測試用例,來測試程式的"日期檢查功能"。
1)劃分等價類并編号,下表等價類劃分的結果
輸入等價類
有效等價類
無效等價類
日期的類型及長度
①6位數字字元
②有非數字字元
③少于6位數字字元
④多于6位數字字元
年份範圍
⑤在1990~2049之間
⑥小于1990
⑦大于2049
月份範圍
⑧在01~12之間
⑨等于00
⑩大于12
2)設計測試用例,以便覆寫所有的有效等價類在表中列出了3個有效等價類,編号分别為①、⑤、⑧,設計的測試用例如下(用盡可能少的用例盡可能多的覆寫每個有效效等價類):
測試資料 期望結果 覆寫的有效等價類
200211 輸入有效 ①、⑤、⑧
3)為每一個無效等價類設計一個測試用例,設計結果如下:
測試資料 期望結果 覆寫的無效等價類
95June 無效輸入 ②
20036 無效輸入 ③
2001006 無效輸入 ④
198912 無效輸入 ⑥
200401 無效輸入 ⑦
200100 無效輸入 ⑨
200113 無效輸入 ⑩
等價類劃分法細分又可以分為弱健壯等價類,強健壯等價類,見例3
3.NextDate 函數包含三個變量:month 、 day 和 year ,函數的輸出為輸入日期後一天的日期。 例如,輸入為 2006年3月7日,則函數的輸出為 2006年3月8日 。要求輸入變量 month 、 day 和 year 均為整數值,并且滿足下列條件:
①1≤month≤12
②1≤day≤31
③1920≤year≤2050
1)有效等價類為:
M1={月份:1≤月份≤12}
D1={日期:1≤日期≤31}
Y1={年:1920≤年≤2050}
2)若條件 ① ~ ③中任何一個條件失效,則 NextDate 函數都會産生一個輸出,指明相應的變量超出取值範圍,比如"month 的值不在 1-12 範圍當中 " 。顯然還存在着大量的 year 、 month 、 day 的無效組合, NextDate 函數将這些組合作統一的輸出: " 無效輸入日期 " 。其無效等價類為:
M2={月份:月份<1}
M3={月份:月份>12}
D2={日期:日期<1}
D3={日期:日期>31}
Y2={年:年<1920}
Y3={年:年>2050}
弱一般等價類測試用例
月份 日期 年 預期輸出
6 15 1912 1912年6月16日
強一般等價類測試用例同弱一般等價類測試用例
注:
弱--單缺陷假設;
強--多缺陷假設,無效等價類和有效等價類的笛卡爾乘積
健壯--考慮了無效值
(一)弱健壯等價類測試[包含有效和無效等價類]
用例ID 月份 日期 年 預期輸出
WR1 6 15 1912 1912年6月16日
WR2 -1 15 1912 月份不在1~12中
WR3 13 15 1912 月份不在1~12中
WR4 6 -1 1912 日期不在1~31中
WR5 6 32 1912 日期不在1~31中
WR6 6 15 1811 年份不在1812~2012中
WR7 6 15 2013 年份不在1812~2012中
(二)強健壯等價類測試[包含有效和無效等價類]
用例ID 月份 日期 年 預期輸出
SR1 -1 15 1912 月份不在1~12中
SR2 6 -1 1912 日期不在1~31中
SR3 6 15 1811 年份不在1812~2012中
SR4 -1 -1 1912 兩個無效一個有效
SR5 6 -1 1811 兩個無效一個有效
SR6 -1 15 1811 兩個無效一個有效
SR7 -1 -1 1811 三個無效
對輸入或輸出的邊界值進行測試的一種黑盒測試方法。通常邊界值分析法是作為對等價類劃分法的補充,這種情況下,其測試用例來自等價類的邊界。
2.與等價劃分的差別
1)邊界值分析不是從某等價類中随便挑一個作為代表,而是使這個等價類的每個邊界都要作為測試條件。
2)邊界值分析不僅考慮輸入條件,有時還要考慮輸出空間産生的測試情況。
3.邊界值分析方法的考慮:
長期的測試工作經驗告訴我們,大量的錯誤是發生在輸入或輸出範圍的邊界上,而不是發生在輸入輸出範圍的内部。是以針對各種邊界情況設計測試用例,可以查出更多的錯誤。
使用邊界值分析方法設計測試用例,首先應确定邊界情況。通常輸入和輸出等價類的邊界,就是應着重測試的邊界情況。應當選取正好等于,剛剛大于或剛剛小于邊界的值作為測試資料,而不是選取等價類中的典型值或任意值作為測試資料。
4.常見的邊界值
1)對16-bit 的整數而言 32767 和-32768 是邊界[最高位符号位 2^15-1]
2)螢幕上光标在最左上、最右下位置
3)報表的第一行和最後一行
4)數組元素的第一個和最後一個
5)循環的第 0 次、第 1 次和倒數第 2 次、最後一次
5.邊界值分析
例:測試計算平方根的函數
--輸入:實數
--輸出:實數
--規格說明:當輸入一個0或比0大的數的時候,傳回其正平方根;當輸入一個小于0的數時,顯示錯誤資訊"平方根非法-輸入值小于0"并傳回0;庫函數Print-Line可以用來輸出錯誤資訊。
1)劃分等價類
劃分等價類的目的在于查找邊界
假設輸入實數為 i:
a)i<0;
b)
i>=0
2)查找邊界值:
根據劃分的等價類查找邊界值
根據a)等價類,得出邊界為最小負實數和0;根據b)等價類,得出邊界為0和最大正實數;
由此得到以下測試用例:
a、輸入 {最小負實數}----小于邊界的最左側
b、輸入 {絕對值很小的負數}----剛剛小于邊界的值
c、輸入 0----正好等于邊界的值
d、輸入 {絕對值很小的正數}----剛剛大于邊界的值
e、輸入 {最大正實數}----大于邊界的最右側
總結:針對線性等價類劃分,邊界值取值方法:
a、小于邊界的最左側
b、剛剛小于邊界的值
c、正好等于邊界的值
d、剛剛大于邊界的值
e、大于邊界的最右側
6.内部邊界值分析:
在多數情況下,邊界值條件是基于應用程式的功能設計而需要考慮的因素,可以從軟體的規格說明或常識中得到,也是最終使用者可以很容易發現問題的。然而,在測試用例設計過程中,某些邊界值條件是不需要呈現給使用者的,或者說使用者是很難注意到的,但同時确實屬于檢驗範疇内的邊界條件,稱為内部邊界值條件或子邊界值條件。
内部邊界值條件主要有下面幾種:
a)數值的邊界值檢驗:計算機是基于二進制進行工作的,是以,軟體的任何數值運算都有一定的範圍限制。
項
範圍或值
位(bit)
0 或 1
位元組(byte)
0 ~ 255
字(word)
0~65535(單字)或 0~4294967295(雙字)
千(K)
1024
兆(M)
1048576
吉(G)
1073741824
b)字元的邊界值檢驗:在計算機軟體中,字元也是很重要的表示元素,其中ASCII和Unicode是常見的編碼方式。下表中列出了一些常用字元對應的ASCII碼值。
字元
ASCII碼值
空 (null)
A
65
空格 (space)
32
a
97
斜杠 (
/ )
47
Z
90
48
z
122
冒号 (
: )
58
單引号 (
‘ )
96
@
64
c)其它邊界值檢驗
7.基于邊界值分析方法選擇測試用例的原則
1)如果輸入條件規定了值的範圍,則應取剛達到這個範圍的邊界的值,以及剛剛超越這個範圍邊界的值作為測試輸入資料。
例如,如果程式的規格說明中規定:"重量在10公斤至50公斤範圍内的郵件,其郵費計算公式為……"。作為測試用例,我們應取10及50,還應取10.01,
9.99,49.99及50.01等。
2)如果輸入條件規定了值的個數,則用最大個數,最小個數,比最小個數少一,比最大個數多一的數作為測試資料。
比如,一個輸入檔案應包括1~255個記錄,則測試用例可取1和255,還應取0及256等。
3)将規則1)和2)應用于輸出條件,即設計測試用例使輸出值達到邊界值及其左右的值。
例如一程式屬于情報檢索系統,要求每次"最少顯示1條、最多顯示4條情報摘要",這時我們應考慮的測試用例包括1和4,還應包括0和5等。
4)如果程式的規格說明給出的輸入域或輸出域是有序集合,則應選取集合的第一個元素和最後一個元素作為測試用例。
5)如果程式中使用了一個内部資料結構,則應當選擇這個内部資料結構的邊界上的值作為測試用例。
6)分析規格說明,找出其它可能的邊界條件。
是一種利用圖解法分析輸入的各種組合情況,進而設計測試用例的方法,它适合于檢查程式輸入條件的各種組合情況。
2.因果圖法産生的背景:
等價類劃分法和邊界值分析方法都是着重考慮輸入條件,但沒有考慮輸入條件的各種組合、輸入條件之間的互相制約關系。這樣雖然各種輸入條件可能出錯的情況已經測試到了,但多個輸入條件組合起來可能出錯的情況卻被忽視了。
如果在測試時必須考慮輸入條件的各種組合,則可能的組合數目将是天文數字,是以必須考慮采用一種适合于描述多種條件的組合、相應産生多個動作的形式來進行測試用例的設計,這就需要利用因果圖(邏輯模型)。
3.因果圖介紹
1) 4種符号分别表示了規格說明中向4種因果關系。
2) 因果圖中使用了簡單的邏輯符号,以直線聯接左右結點。左結點表示輸入狀态(或稱原因),右結點表示輸出狀态(或稱結果)。
3) Ci表示原因,通常置于圖的左部;ei表示結果,通常在圖的右部。Ci和ei均可取值0或1,0表示某狀态不出現,1表示某狀态出現。
4. 因果圖概念
1) 關系
①恒等:若ci是1,則ei也是1;否則ei為0。
②非:若ci是1,則ei是0;否則ei是1。
③或:若c1或c2或c3是1,則ei是1;否則ei為0。“或”可有任意個輸入。
④與:若c1和c2都是1,則ei為1;否則ei為0。“與”也可有任意個輸入。
前面兩者①,②,考慮的是單個輸入(原因)和輸出(結果)之間的關系:也就是輸入為真(假)時,輸出的值為真還是假的對應關系,很自然的,我們很容易想到有兩種情況:一種和輸入同真同假,一種和輸入相反。
後面兩者③,④,考慮的是多個輸入之間的組合輸入和輸出之間的關系:我們也很容易想到:一種是組合關系為或(or),一種組合關系為組合(and),滿足這種組合關系得出的輸出才為真,否則為假
2) 限制
輸入狀态互相之間還可能存在某些依賴關系,稱為限制。例如, 某些輸入條件本身不可能同時出現。輸出狀态之間也往往存在限制。在因果圖中,用特定的符号标明這些限制。
A.輸入條件的限制有以下4類:
① E限制(異):a和b中至多有一個可能為1,即a和b不能同時為1。
② I限制(或):a、b和c中至少有一個必須是1,即 a、b 和c不能同時為0。
③ O限制(唯一):a和b必須有一個,且僅有1個為1。
④ R限制(要求):a是1時,b必須是1,即不可能a是1時b是0。
B.輸出條件限制類型
輸出條件的限制隻有M限制(強制):若結果a是1,則結果b強制為0。
5. 采用因果圖法設計測試用例的步驟
1)分析軟體規格說明描述中, 哪些是原因(即輸入條件或輸入條件的等價類), 哪些是結果(即輸出條件), 并給每個原因和結果賦予一個辨別符。
2)分析軟體規格說明描述中的語義,找出原因與結果之間, 原因與原因之間對應的關系,根據這些關系,畫出因果圖。
3)由于文法或環境限制, 有些原因與原因之間,原因與結果之間的組合情況不可能出現,為表明這些特殊情況, 在因果圖上用一些記号表明限制或限制條件。
4)把因果圖轉換為判定表。
5)把判定表的每一列拿出來作為依據,設計測試用例。
1.某軟體規格說明書包含這樣的要求:第一列字元必須是A或B,第二列字元必須是一個數字,在此情況下進行檔案的修改,但如果第一列字元不正确,則給出資訊L;如果第二列字元不是數字,則給出資訊M。
1) 找出原因(輸入)和結果(輸出):
原因:
C1.第一列字元為A?;
C2.第一列字元為B?;
C3.第二列字元為數字?
技巧:如上,查找原因時将輸入有效等價類和輸入無效等價類看作是同一個原因的正反面取值,即查找有效等價類,然後加上問号
結果:
e1.修改檔案
e2.給出資訊L
e3.給出資訊M
2) 其對應的因果圖如下:
考慮到原因1和原因2不可能同時為1,是以在因果圖上施加E限制。
注意,學習添加中間結果節點
3) 根據因果圖建立判定表。
表中,C1和C2是不可能同時為1的,即不可能同時出現,是以應排除這兩種情況。
4)用例設計
針對每一條規則(C,D列除外)設計一條用例
2.有一個處理單價為5角錢的飲料的自動售貨機軟體測試用例的設計。其規格說明如下:若投入5角錢或1元錢的硬币,押下〖橙汁〗或〖啤酒〗的按鈕,則相應的飲料就送出來。若售貨機沒有零錢找,則一個顯示〖零錢找完〗的紅燈亮,這時在投入1元硬币并押下按鈕後,飲料不送出來而且1元硬币也退出來;若有零錢找,則顯示〖零錢找完〗的紅燈滅,在送出飲料的同時退還5角硬币。
1) 分析這一段說明,列出原因和結果
C1:投入1元錢?
C2:投入5角錢?
C3: 押下橙汁?
C4:押下啤酒?
C5:售貨機有零錢找?
C6:中間結果,按下按鈕?
C7:中間結果,找錢成功?
e1:送出橙汁
e2:送出啤酒
e3:高亮【零錢找完】的紅燈
e4:退出1元硬币
e5: 熄滅【零錢找完】的紅燈
e6:退出5角硬币
2)畫出因果圖
說明:因果圖需要對需求和邏輯了解很透徹,不同的了解畫出的因果圖不同,自然設計難易程度也就不一樣,個人建議少用因果圖,多用場景法,因為相比之下,場景法設計用例實施起來會比較容易
3)轉換為判定表
4)簡化判定表
5)用例設計
分析和表達多個邏輯條件下執行不同操作的情形的工具。
2.判定表的優點
能夠将複雜的問題按照各種可能的情況全部列舉出來,簡明并避免遺漏。
在一些資料處理問題當中,某些操作的實施依賴于多個邏輯條件的組合,即:針對不同邏輯條件的組合值,分别執行不同的操作。判定表很适合于處理這類問題。
3.判定表形式
1)條件樁:列出所有邏輯條件。通常給出的邏輯條件之間與排列次序無關。
2)動作樁:列出與條件樁對應的可能操作。同上,操作之間與排列次序無關。
3)條件項:列出條件樁的所有取值,每個條件項可能是多個邏輯條件取值的組合。
4)動作項:列出動作樁的所有取值,即與條件項對應的可能操作。
4.規則及規則合并
1)規則:把垂直方向上,由一個條件項及其對應動作項構成的列稱為一條規則。
2)規則合并:合并有兩條或多條具有相同的動作,并且其條件項之間極為相似的的規則。
5.例子,“閱讀指南”判定表
6.規則及規則合并舉例
如下圖左端,兩規則動作項一樣,條件項類似,在條件1、2分别取Y、N時,無論條件3取何值,都執行同一操作,即要執行的動作與條件3無關。是以,可合并,“-”表示與取值無關。
化簡後的讀書指南判定表
7.判定表的建立步驟:
1)确定規則的個數。
2)列出所有的條件樁和動作樁。
3)填入條件項。
4)填入動作項。等到初始判定表。
5)簡化判定表。