摘要:測試順序是面向對象軟件集成測試中的一個重要問題。本文提出使用擴展對象關系圖作為測試模型研究面向對象軟件集成測試順序問題,并給出計算測試順序的算法以及設計測試用例的策略。
關鍵詞:擴展對象關系圖;集成測試;測試順序;多態
中圖分類號:TP311文獻標識碼:A文章編號:1009-3044(2008)14-20938-02
1 引言
面向對象軟件特有的封裝、繼承、多態和動態綁定等特征產生了傳統語言根本不存在的錯誤類型,因此傳統的軟件測試技術不能直接應用到面向對象軟件測試中來。面向對象軟件測試相對于面向對象軟件分析、設計和編程來說還沒有引起足夠的重視,尤其是多態對面向對象軟件集成測試的影響還需要進一步研究。多態是面向對象軟件特有的特征,凡是父類對象出現的地方都可以用子類對象進行替換的多態稱為對象多態;同一個消息可以被不同對象接受而產生不同行為的多態稱為消息多態。
測試順序(Test Order)是面向對象軟件集成測試研究的一個重要問題。文獻[1-4]提出利用對象關系圖(Object-Oriented Graph)研究測試順序,但是這些文獻都沒有涉及到多態對測試順序的影響。文獻[5]在對象關系圖上增加因消息多態引起的動態依賴信息,構成擴展對象關系圖(Extended Object-Oriented Graph),作為研究測試順序的測試模型,但是該文沒有考慮對象多態對交互測試的影響以及沒有給出哪些類之間需要進行兩兩交互測試以及它們之間的測試順序。本文在文獻[5]的基礎之上,在擴展對象關系圖中增加對象多態信息,并設計算法計算哪些類之間需要進行交互測試以及它們之間的測試順序。
2 擴展對象關系圖
對象關系圖在文獻[1]中首次作為面向對象回歸測試的測試模型。程序P的對象關系圖是一個有向圖,其中的結點表示程序P中的類,有向邊表示程序P中類間的依賴關系。繼承、聚集和關聯關系是面向對象模型中三種最為廣泛使用的類間依賴關系。繼承意味著基類中定義的特性可以自動在所有的子類中定義;聚集意味著一個對象是另一個對象的一個組成部分;關聯意味著兩個對象之間存在著更一般的關系,A關聯B表示A會存取B中的數據成員或A會向B傳遞消息。
定義2.1 G=(V,L,E)表示邊上加標簽的有向圖,其中V={V1,V2,…,Vn}是結點的有限集合,L={L1,L2,…,Lk}是標簽的有限集合,邊集E#8838;V×V×L是帶標簽的邊的有限集合。
定義2.2 面向對象程序P的對象關系圖是一個邊上加標簽的有向圖ORG=(V,L,E),其中集合V中的結點表示程序P中的類,標簽集L={I,Ag,As}中的元素表示邊上的標簽集合,邊集E=EI∪EAg∪EAs的定義如下:
定義2.3 EI#8838;V×V×L是一個有向邊的集合,EI中的有向邊反映的是P中類之間的繼承關系。
定義2.4 EAg#8838;V×V×L是一個有向邊的集合,EAg中的有向邊反映的是P中類之間的聚集關系。
定義2.5 EAs#8838;V×V×L是一個有向邊的集合,EAs中的有向邊反映的是P中類之間的關聯關系。
定義2.6 如果一個類在對象關系圖中既沒有被其它類包含又不是其它類的子類,則稱該類為主類。例如,圖1中類A和類F是主類。
定義2.7 設D1(X)是類X靜態依賴的所有類構成的集合。
類X靜態依賴類Y當且僅當在對象關系圖中存在一條從類X到類Y的有向路徑。例如,圖1中的D1(A)={B,C,D,F,G,H}。
定義2.8 設D2 (X)是類X靜態和動態依賴的所有類構成的集合。
動態依賴關系可以從靜態關系中推導出來。如果類Y是類X的服務類,則在程序執行的時候,類X及其所有直接或間接子類動態依賴Y及其所有直接或間接子類。例如,圖1中的D2(A)={B,C,D,F,G,H,F1,F2}。如果在對象關系圖中用虛邊表示動態依賴信息,則構成的對象關系圖稱為擴展對象關系圖。圖2是圖1加上動態依賴信息之后形成的擴展對象關系圖。
3 測試順序
測試順序是面向對象軟件集成測試研究的一個重要問題。在面向對象軟件集成測試階段,構造一個類對象或類成員函數的測試樁的代價非常昂貴。因此,假如使用已經測試過的組件去測試將要被測試的組件,則可以減少構造測試樁的工作量。這個策略的基本思想就是首先測試獨立的組件,然后根據依賴關系測試有依賴關系的組件。例如,如果測試人員首先測試服務類,然后再測試客戶類,則可以減少構造測試樁的工作量。拓撲排序可以用來計算無環對象關系圖的測試順序。例如,圖1的測試順序為B-C-G-H-F-F1-F2 -D-A-E-A1-A2。如果對象關系圖有環,則可以采用某種策略臨時刪除某些關聯邊使之變成無環的對象關系圖,然后再應用拓撲排序計算相應的測試順序。
測試順序解決的是類的測試順序問題,而沒有解決哪些類之間需要進行兩兩交互測試以及它們之間的測試順序。例如,圖2中需要進行交互測試的有AB,AC,AD,FG,FH,DF,AF,A1E,A1B,A2F,A1F,A1F1,A1F2,A2F1,……,其中AD應該在DF之后測試。下面給出計算需要進行兩兩交互測試的類及其順序的算法。其中,假設對象關系圖中沒有環(對應的擴展對象關系圖中可能有環),并且算法從對象關系圖中的主類開始遍歷整個擴展對象關系圖。
步驟1:如果(V,Vi)之間有一條聚集邊,則遞歸處理Vi,遞歸返回時將(V,Vi)插入到測試順序隊列中;
步驟2:如果(V,Vi)之間有一條關聯邊,則遞歸處理Vi,遞歸返回時將(V,Vi)插入到測試順序隊列中;
步驟3:如果(V,Vi)之間有一條動態關聯邊,則將(V,Vi)插入到測試順序隊列中;
步驟4:如果(Vi,V)之間有一條繼承邊,則遞歸處理Vi 。
根據上述算法可知,如果從圖2中的主類A開始遍歷,則得到的兩兩交互測試及其測試順序為AB-AC-FG-FH-DF-DF1-DF2-AD-AF-AF1-AF2-A1E-A1B -A1F-A1F1-A1F2-A2F-A2F1-A2F2。
4 設計交互測試用例
確定好哪些類之間需要進行兩兩交互測試以及它們之間的測試順序之后便可以設計交互測試用例。
步驟1:確定每個類的設計狀態。例如,隊列有空、非空和滿三種設計狀態;
步驟2:根據交互對象的狀態組合設計交互測試用例;
步驟3:如果某個交互測試的測試用例數量太大,則可以使用某種啟發式策略減少測試用例的設計數量。
5 結束語
測試順序是面向對象軟件集成測試的一個重要問題,并給出計算集成測試順序的算法以及設計測試用例的策略。本文提出利用擴展對象關系圖作為測試模型研究集成測試問題。本文只解決了兩個類間的交互測試及其順序問題,多個類間的交互測試及其順序問題還需要進一步研究。
參考文獻:
[1] KUNG D C, GAO J, HSIA P, et al. Class firewall, test order, and regression testing of object-oriented programs[J]. Journal of Object-Oriented Programming, 1995, 8(2): 239-244.
[2] TAI K C, DANIELS F J. Test order for inter-class integration testing of object-oriented software[C]. Proceedings of the CompsAC'97-21st International Computer Software and Applications conference, 1997: 602-607.
[3] TRAON Y L, JéRON T, JéZéQUEL J M, et al. Efficient object-oriented integration and regression testing [J]. IEEE Transactions on Reliability, 2000, 49(1):12-25.
[4] MAO Ying-Cheng, LU Yan-Sheng. An improved algorithm for planning inter-class test order[C]. Proceedings of the Fifth International Conference on Computer and Information Technology (CIT'05), 2005: 927-931.
[5] LABICHE Y, THEVENOD P, WAESELYNCK H, etc. Testing levels for object-oriented software[C]. Proceeding of the 22nd IEEE International Conference on Software Engineering (ICSE), Limerick (Ireland), IEEE Computer Society, 2000:136-154.
注:本文中所涉及到的圖表、注解、公式等內容請以PDF格式閱讀原文