概念:通過分析組件或系統的測試依據文檔,而不是其內部結構獲取和選擇測試用例的一種方法。
為黑盒技術
基於規格說明測試的共同特點:
① 利用正式或非正式的模型來描述待解決的問題、軟件或其組件
② 根據模型系統地獲取測試用例
基於規格說明的測試可幫助測試人員選擇合適測試用例。
基於規格說明的測試通常由以下步驟組成:
① 分析規格說明。
② 根據規格說明選擇有效的輸入以確定測試對象是否可正確地實現需求,也需選擇無效的輸入確定測試對象以正確地處理它們。
③ 根據輸入數據確定系統的期望輸出。
④ 執行測試用例。
⑤ 將測試執行得到的實際結果與期望結果進行比較。
⑥ 確定測試對象的實現是否符合規格說明。
3.1 等價類划分
作用:用來減少測試用例數目,並保證合理的測試覆蓋率。
概念:將輸入域輸出域划分為不同的等價類,其中的任何值都能使組件或系統產生相同的響應結果。
對於等價類划分技術而言,只要測試等價類中的一個代表值就足夠。
不僅需測試有效的等價類(指合理且有意義的數據構成的集合);還需測試無效的等價類(指不合理且錯誤的數據構成的集合)
等價類划分技術的對象即可是輸入,也可是輸出
3.1.1 識別等價類
不同的輸入類型需要不同的等價類划分
① 若輸入是連續數值。通常有一個有效等價類和兩個無效等價類,兩個無效等價類的其中一個為高於有效值的范圍;另一個為低於有效值的范圍。
② 若輸入是離散數值。通常有一個有效等價類和兩個無效等價類。
③ 若輸入是一組選項,並且測試對象對這組選項中每個值執行相同處理,那么可為輸入創建一個有效等價類(該組選項中的任一數值)和一個無效等價類(所有不在該組選項中的值)。
④ 若輸入是一組選項,並且測試對象對這組選項中每個值執行不同處理,那么可將該組選項中的每個輸入都划分一個有效等價類,然后單獨划分一個無效等價類(不在該組選項中的任何其他選項)。
⑤ 若規定了輸入數據必須遵守某些規則,那么可划分一個有效等價類(滿足所以規則)個若干無效等價類(從不同角度違反規則)
⑥ 若輸入數據是布爾變量,可划分一個有效等價類和一個無效等價類
⑦ 在已划分的等價類中元素這程序中處理方式不同時,需將該等價類進一步划分為更小的等價類。
3.1.2 創建測試用例
由於測試資源的限制,通常情況下測試人員需創建一個測試用例同時驗證多個輸入數據的等價類。
基於等價類划分技術設計測試用例時需為每個參數賦予一個輸入值,為此必須確定如何組合這些等價類的代表值使其成為一組有效的輸入數據。
相應等價類的輸入可根據下面原則組合:
① 所有有效等價類的代表值的組合都需要集成到測試用例中,即覆蓋有效等價類的所有組合。
② 無效等價類的代表值只和其他有效等價類的代表值組合,有效等價類代表值的選擇可以隨意。
根據上述組合原則,可得有效測試用例(正面測試用例)的個數等於每個輸入參數的有效等價類個數的乘積;而無效測試用例(負面測試用例)的個數為無效等價類的個數。
上述原則所需測試用例仍然過多,故采用如下規則減少測試用例的數目。
① 根據輸入參數的代表值組合而成的有效測試用例和無效測試用例按照測試用例的使用頻率和重要程度排序,為每個測試用例設置不同優先級。有針對地選擇要執行的測試用例。
② 優先選擇包含邊界值或邊界值組合的測試用例
③ 將一個等價類的每個代表值和其他等價類的每個代表值組合設計測試用例(雙向組合代替完全組合)
④ 保證滿足最小原則,即一個等價類的每個代表值至少在一個測試用例中出現
3.1.3 覆蓋率准則
等價類划分技術的測試准則可定義如下:
等價類划分覆蓋率=(執行的等價類數量/總的等價類數量)×100%
3.1.4 案例分析:LACP參數等價類測試
① 案例描述
如圖為LACP圖形配置界面
Index取值范圍10001~10006,整型
ActorKey取值范圍1~65535,整型
AggregatorSize取值范圍1~8,整型
AggregatorName必須由字母組成,長度不超過8
測試人員的目標:
(1) 識別案例中不同參數輸入域的等價類
(2) 細分等價類。
(3) 根據得到的等價類創建相應的測試用例。
(4) 分校相關的覆蓋率准則
② 識別等價類
下表為LACP相關參數的有效等價類和無效等價類
③ 細分等價類
測試對象的需求規格說明或者功能規格說明不僅是等價類划分的基礎,還需對其進行分析以發現其中的漏洞。分析過程可對前面定義的等價類進一步細化。若同時考慮規格說明中每個輸入參數的所有條件,並結合測試人員的經驗知識,就可認為完成了等價類的划分。
經過分析,Index、ActorKey和AggregatorSize參數還需增加“非整數”無效等價類,最終生成16個等價類,包括4個有效等價類和12個無效等價類。
LACP輸入參數的等價類和代表值
④ 創建測試用例
根據有效等價類的原則,可以得到有效測試用例數目為1(1×1×1×1=1)
根據無效等價類的原則,可以得到無效測試用例數目為12(3+3+3+3=12)
因此從16個等價類得到了13個測試用例,如下:
在選擇測試用例的輸入后,還需為每個測試用例確定期望的結果。
⑤ 覆蓋率准則
根據等價類划分技術的覆蓋率准則,即執行的等價類數量與總的等價類數量的比值可以得到針對LACP功能的等價類覆蓋率。
對於本例,輸入參數等價類總數共16個,測試用例數目為13個。只要執行13個測試用例,就可以覆蓋16個等價類,即實現100%的等價類覆蓋率。
若沒執行ID為13的測試用例,只執行了其他12個測試用例,對應只覆蓋了15個等價類,等價覆蓋率為93.75%
3.2 邊界值分析
邊界值分析是種測試軟件邊界值的技術,是等價類划分技術的有效補充。
出現邊界值錯誤的主要原因:
① 測試對象規格說明中沒有明確定義輸入域的邊界值。
② 開發人員容易對邊界值產生誤解。
邊界值分析技術適用於等價類中有明確邊界值的情況。針對每個參數的邊界,需測試邊界值和兩個鄰近的值。因此需要在邊界值的兩邊,以最小的步長分別取值,步長的定義依賴於參數的單位和類型。
邊界值分析技術的步驟如下:
① 識別測試對象中參數的等價類
② 識別每個等價類的邊界值
③ 創建邊界值相關測試用例
④ 定義邊界值分析技術的覆蓋率
3.2.1 識別等價類
詳細參加3.1節
3.2.2 識別邊界值
① 若輸入是連續數值,必須考慮邊界值和邊界值鄰近的上下兩個數值。
② 若輸入是離散數值,同樣考慮邊界值和邊界值鄰近的上下兩個數值。
③ 對於有序集合,集合元素的第1個和最后1個是測試感興趣的對象
④ 若是復雜的數據結構作為輸入或輸出,那么一個空的列表或0矩陣可以作為邊界值
⑤ 對無效等價類,只有其內部值可以觸發測試對象不同的異常處理時邊界的分析才有意義
⑥ 對於列表和表格,空列表和滿列表以及列表的第1個元素和最后1個元素都應作為分析的對象,因為對其測試常常可發現由於編程錯誤而導致的失效。
⑦ 應盡量選擇龐大的數據結構、列表和表格等作為邊界值分析的數據,如能導致內存溢出、文件和數據存儲達到邊界的數據,以檢查測試對象在這種極端情形下的行為。
常見邊界值類型:
① 對16bit整數而言,邊界值32767和-32768
② 屏幕上光標和左上和右下位置
③ 數組元素的第1個和最后1個
3.2.3 創建測試用例
類似用等價類划分技術設計測試用例,有效等價類范圍內的有效邊界值也需在測試用例中組合,無效邊界值在測試用例中單獨驗證。
3.2.4 覆蓋率准則
類似於等價類划分技術完成准則,邊界值分析技術的覆蓋率定義如下:
邊界值覆蓋率=(執行的邊界值的數量/總的邊界值的數量)×100%
注意邊界值數量必須考慮邊界值上限和下限的臨近數值的數量。
臨近等價類的重疊數據作為一個邊界值看待,此時只有一個測試用例與之相對應。
3.2.5 案例分析:LACP參數邊界值測試
邊界值分析技術是等價類划分技術的有效補充。
下仍采用3.1.4節中案例1
① 識別等價類
識別出的等價類參見3.1.4節的內容
② 識別邊界值
得到LACP輸入參數后,需識別每個參數的等價類的邊界值。根據前面提到的邊界值分析的有關建議,得到相應的邊界值如下:
參數Aggregator Name定義了有效邊界值和無效邊界值,它是基於長度展開的。若條件允許,也可針對Aggregator Name中字母組成規則定義邊界值。
上表所示參數的有效邊界值即包括有效等價類的邊界,也包括有效等價類中與邊界值相鄰的值。實際應用中可根據測試資源情況,決定對邊界是否補充。下表為只包括最直接的邊界值,共得到16個邊界值,其中有效邊界值為8個,無效邊界值8個。
③ 創建測試用例
類似等價划分技術
根據上表可知,基於有效邊界值分析得到的測試用例數目為16個(2×2×2×2=16)
無效測試用例數目為8(2+2+2+2=8),故從16個邊界值得到24個測試用例。
在選擇測試用例的輸入后,需為每個測試用例確定期望的結果,如下表所示。
④ 覆蓋率准則
類似等價類划分的覆蓋率准則,同樣邊界值覆蓋率也可作為測試出口准則之一。
注意,邊界值的數量必須考慮邊界值上限的鄰近數值和下限的鄰近數值的數量,具體數量只針對不相等的輸入值。對於鄰近等價類的重疊數據作為一個邊界值來看待,因為此時只有一個測試用例與之對應。
3.3 決策表測試
決策表可方便獲取特定的系統需求並記錄測試對象的內部實現,可記錄測試對象的各種復雜規則,並有效地指導測試用例的設計。
決策表是分析和表達多邏輯條件下執行不同操作的表格,能夠將復雜的問題按照各種可能的情況全部列舉出來,以避免遺漏測試需求,故利用決策表可設計出比較完整的測試用例集合。決策表測試技術特別適用於針對不同邏輯條件的組合,測試對象需執行不同操作的場景。
決策表由4部分組成:
① 條件樁。列出測試對象的所以條件。一般情況下,列出的條件次序不影響測試對象的動作。
② 動作樁。列出測試對象所有可能執行的操作。一般情況下,這些執行的操作沒有先后順序約束。
③ 條件項。列出針對特定條件的取值,即條件的真假值。
④ 動作項。列出在不同條件項的各種取值組合情況下測試對象應執行的動作。
其格式如下
規則 | 規則1 | 規則2 | …… | 規則p | |
條件樁 | 條件1 | ||||
條件2 | |||||
…… | |||||
條件m | |||||
動作樁 | 動作1 | ||||
動作2 | |||||
…… | |||||
動作n |
條件樁中條件1、2到m表示測試對象的各種輸入條件;動作樁中動作1、2到n表示測試對象根據不同輸入條件的組合需要執行的操作。規則1、2到p定義了不同條件組合下測試對象需要執行的操作。
決策表測試的主要步驟:
① 列出所有條件樁和動作樁
② 確定規則的數目。若有n個條件,每個條件有兩個取值(0或1),則共有2n個規則。
③ 填入條項和動作項得到初始的決策表。
④ 簡化相似的規則得到優化的決策表。
⑤ 每列規則設計一個測試用例
下利用案例進行介紹
案例2 判斷三角形類型
輸入3個整數值a、b和c,判斷三角形類型
3.3.1 確定條件樁和動作樁
首先分析測試對象,確定測試對象的輸入個數(條件的數目)和輸入個數(動作的數目),並且確定決策表規則的數量。
經分析,可得到如下4個條件(並不唯一):
① C1:a、b和c構成三角形?
② C2:a=b?
③ C3:a=c?
④ C4:b=c?
當條件樁中條件數目為n時,可的初始決策表的規則數目為2n個。
本案例共16個規則。
本案例最終確定的動作樁如下:
① A1:非三角形
② A2:不規則三角形
③ A3:等腰三角形
④ A4:等邊三角形
⑤ A5:不符合邏輯
3.3.2 初始決策表
三角形初始決策表如下所示。
3.3.3 優化決策表
檢查上表,可看出有的動作對應一個規則,有的動作對應多個規則,因此需要優化。將具有相同動作且條件項之間存在相似關系的規則進行合並,相關條件項置位“不關心”,用“-”表示。例如,當條件“C1:a、b和c構成三角形?”的取值為N時,后面幾個條件的判斷沒有意義,結果都是“A1:非三角形”;同時刪除初始決策表中不符合邏輯的規則,優化的決策表如下:
決策表優化可從以下幾個方面進行:
① 引入“不關心”的條件。在初始的決策表中規則9至16中C2、C3和C4是不用關心的條件
② 檢查決策表中是否存在不一致處,如相同的規則產生不一致的動作,此時需要嚴格分析:
(1)重新分析測試對象,確定是否是測試人員分析和理解有誤導致決策表設計錯誤。
(2)重新分析測試對象,確定是否由於測試對象的規格說明本身有誤造成決策表設計錯誤。
③ 簡化決策表,刪除冗余規則。判斷決策表是否冗余,可為決策表的每個規則引入規則計數器
(1)若規則內沒有包含“不關心”條件,規則計數器為1.
(2)若規則中出現一個“不關心”條件,規則計數器乘2。出現n個,計數器為2n
(3)若決策表的規則計數器綜合大於2n(此處n為樁中條件的數目),則決策表內有冗余項。
3.3.4 創建測試用例
針對優化后的決策表,把其條件項組合作為輸入,動作項作為輸出,每條規則可得一個測試用例。
本案例結果如下所示
3.3.5 覆蓋率准則
決策表測試也可以明確定義覆蓋率准則,基本要求是決策表的每一列(規則)至少要有一個測試用例覆蓋
3.3.6 因果圖和決策表
除了決策表,也可基於因果圖技術得到測試用例,或通過因果圖得到決策表,再得測試用例。
因果圖中的“因”:一個明確的輸入條件或輸入條件的等價類。“果”:一個輸出條件或輸出動作。
將“因”和“果”通過布爾圖連接成因果圖,其基本符號如下:
= ! || &&
每個節點值為0或1,0表示不存在,1表示存在。
決策表和因果圖可相互轉換。
① 決策表轉換為因果圖
(1) 羅列決策表條件樁中的所有條件,作為因果圖的“因”
(2) 羅列決策表動作樁中的所有動作,作為因果圖的“果”
(3) 根據決策表中的每個規則,確定哪些條件的組合可得相關的動作,並通過因果圖符號連接。
② 因果圖轉換為決策表
(1) 將因果圖的所有條件(因)填入決策表的條件樁中。
(2) 將因果圖的所有動作(果)填入決策表的動作樁中。
(3) 根據因果圖確定各條件組合對應的動作,並確定決策表各個規則的條件項和動作項,在需要時優化決策表。
3.3.7 案例分析:ATM取款的決策表測試
① 案例3:ATM取款
ATM取款需滿足如下條件
(1) 銀行卡有效
(2) 密碼正確
(3) 若密碼錯誤。最多輸入3次
(4) 銀行卡賬號有錢
ATM可能動作
(1) 拒絕銀行卡
(2) 要求重輸密碼
(3) 吞卡
(4) 要求重輸入取款金額
(5) 輸入要求數目的現金
根據描述,采用決策表測試技術,目標如下
(1) 根據案例中提供的條件或動作獲取測試對象的因果圖
(2) 將得到的因果圖轉換為響應的決策表
(3) 優化決策表
(4) 根據優化的決策表得到相關測試用例表
② 因果圖
③ 初始決策表
④ 優化決策表
去除不相關和冗余
⑤ 創建測試用例
每條規則可設計一個測試用例
3.4 狀態轉換測試
3.4.1 狀態轉換圖
狀態轉換圖描述了測試對象和數據之間的關系。
測試對象的輸出和行為不僅和當前輸入數據有關,且與測試對象當前狀態有關。
狀態轉換圖是設計狀態轉換測試用例的基礎,基於狀態轉換圖進行的測試就是狀態轉換測試。
測試對象從初始狀態可轉換到不同的狀態,狀態轉換圖中的各個狀態通過不同的事件驅動,如函數調用:除初始狀態之外,還有一個特殊的狀態是結束狀態。
下舉例介紹
案例4 某航空公司的訂票系統
訂票系統轉換圖如下
① 狀態:以圓圈表示,狀態可反映系統以前的時間,並決定系統可能發生的事件的反應。
② 轉換:以箭頭表示,轉換指的是由於事件的驅動,系統從一個狀態到另一個狀態
③ 事件:和特定的轉換相關聯,以具體的時間名稱表示。事件可驅動狀態的轉換或其他動作,通常來說,事件由系統的相關接口觸發,也可來自系統內部,如計時器超時。事件可以是獨立的,也可是相互關聯的,如事件A必須在事件B之后發生。
④ 活動:以“/”形式表示,活動由狀態轉換觸發,如出票(Ticket)。通常活動得到的結果會作為系統的輸出。活動一般在狀態轉換過程中發生。
⑤ 條件:以“[]”表示,可以是True或False,說明狀態轉換只有在滿足這個條件之后才能進行。
⑥ 特殊狀態:開始狀態和結束狀態
3.4.2 測試用例
狀態轉換測試經常利用狀態轉換樹或狀態轉換表設計測試用例。
① 狀態轉換樹
將可能具有無限多狀態循環的狀態轉化圖轉換為不含循環的具有一定數目狀態的狀態轉換樹。
轉換過程需覆蓋所有狀態,並包含狀態轉換圖中的所有轉換。
轉換步驟如下(針對0-Switch):
(1) 將初始狀態或開始狀態作為狀態轉換樹的根,根在整個狀態轉換樹中的層次是1。
(2) 假設當前生成狀態轉換樹的層次為K,那么從左到右檢查所有層次為K的節點。將該節點對應的所有下一個可能狀態作為其子節點,狀態之間的轉換作為兩個狀態的邊。
(3) 重復(2),直到一個位於層次K上的節點出現在層次J上,且J≤K。這個節點成為最終的葉節點,無須繼續生成其子節點。或節點的狀態是結束狀態,也不需要針對該節點繼續進行狀態轉換。
案例4的狀態轉換圖轉為的狀態轉換樹的結構如下:
生成狀態轉換樹后即可根據不同的測試強度得到如下測試用例列表:
(1) 至少覆蓋所有狀態一次:3個測試用例即可滿足該覆蓋率要求。
(2) 至少覆蓋所有事件一次:3個測試用例就能覆蓋所有事件。
本案例中覆蓋所有事件和所有狀態的測試用例相同,如下圖所示
(3) 至少覆蓋所有的狀態轉換一次:需5個測試用例覆蓋所有事件。
這個級別的測試可以提供較好的測試覆蓋率,也可確保生產的測試用例數目不是很龐大,這是狀態轉換測試技術最常用的覆蓋率
(4) 至少覆蓋所有路徑一次:這個級別的覆蓋率最高,但經常是不現實的。若狀態轉換圖中有循環的情形,那么可能的路徑是無窮的。例如AB可以相互轉換
A→B→A→B→A。。。
這樣路徑是無窮的。但覆蓋這樣循環的測試用例對於發現一些累計的計算錯誤或資源方面的缺陷非常重要,如內存泄露。
除了設計測試用例覆蓋所有的狀態、事件和路徑之外,還需檢查再不同狀態情況下錯誤調用函數的測試用例。
② 狀態轉換表
由狀態轉換圖可得相應狀態轉換表,如下表所示。
狀態轉換表優點是羅列了所有可能的狀態轉換組合,且不僅僅是有效的狀態轉換
利用狀態轉換表可發現測試對象實現方面的問題,如實現了無效或不希望的狀態轉換路徑。
狀態轉換表缺點是當測試對象的狀態和事件增加時,它會快速增加;另外表格很多多余或空白單元格。
上表中灰色條目是所有有效的狀態轉換,最終生成有效狀態轉換的測試用例如下表所示。
編號ID | 當前狀態 | 事件 | 活動 | 后續狀態 |
1 | null | GiveInfo | StartPayTimer | Made |
2 | Made | PayMoney | -- | Paid |
3 | Made | Cancel | -- | CancelledByCustmer |
4 | Made | PayTimerExpires |
-- | CancelledByNonPay |
5 | Paid | Ticket | Ticketed | |
6 | Paid | Cancel | Refund | CancelledByCustmer |
7 | Ticketed | GiveTicket | -- | Used |
8 | Ticketed | Cancel | Refund | CancelledByCustmer |
選擇有效狀態轉換后,可根據測試對象的風險選擇部分無效的狀態轉換,確定測試對象是否實現了某些不該實現的無效狀態轉換
3.4.3 N-Switch
定義:程序圖中長度為n+1的連續的邊或弧線(通常在狀態圖中表示循環)的序列。
單獨的一條邊就是一個0-Switch,兩條連續邊的序列就是1-Switch
下圖為狀態機
根據0-Switch定義,其狀態轉化圖如圖
根據1-Switch定義,該狀態機所有1-Switch為ab、ac、bb、bc、cd、ce、dd、de、ea、ef、fd和fe。1-Switch狀態樹的生成規則是在0-Switch狀態樹的基礎上再增加一個層次,即針對0-Switch狀態樹的所有葉節點,把每個葉節點可能的下一個狀態作為該節點的子節點。注意只需增加一個層次。
3.4.4 覆蓋率准則
如3.4.2所述,狀態轉換測試有如下測試強度,即覆蓋率准則。
① 狀態覆蓋:每個狀態至少執行一次
② 事件覆蓋:每個事件至少執行一次
③ 狀態轉換覆蓋:每個狀態轉換至少執行一次
④ 路徑覆蓋:每個路徑至少執行一次
3.4.5 案例5分析:堆棧的狀態轉換測試
① 案例5描述
堆棧的狀態轉換圖如圖
根據堆棧狀態轉換圖,測試人員可采用以下方法獲得測試用例列表
(1) 根據狀態轉換圖獲取0-Switch的狀態轉換表,並得到滿足0-Switch覆蓋率的測試用例列表
(2) 根據0-Switch的狀態轉換表獲取擴展的0-Switch的狀態轉換表,並得到相關的測試用例列表
(3) 根據0-Switch的狀態轉換圖獲取1-Switch的狀態轉換圖,並得到滿足1-Switch覆蓋率的測試用例列表
② 狀態轉換樹(0-Switch)
可看出一共8個葉節點,所以從堆棧的根節點到最后的葉節點共可產生8條不同的路徑,每條路徑代表一個測試用例就可實現所有路徑的覆蓋率(0-Switch覆蓋)。此時可保證每種狀態至少到達一次,並且根據測試對象的規格說明在每個狀態中調用相關函數。測試用例如表所示
若需檢查堆棧對函數的異常處理,那么可增加健壯性測試來確認是否會出現不應該出現的狀態轉換。擴展狀態轉換樹如下圖所示,使每個節點都盡可能多地調用函數,即對每個狀態盡量執行所有的函數。
總共12條路徑,所以還需增加4個健壯性測試用例
③ 狀態轉換樹(1-Switch)
若要求得到的覆蓋率達到1-Switch,需擴展0-Switch的狀態轉換樹