杜慶峰 李瓏
摘要:針對測試過程中對子類方法測試不充分的問題,結(jié)合面向?qū)ο箝_發(fā)技術(shù)的繼承特性,提出了一種新的測試模型。在父類已被充分測試的前提下,分析子類在父類的基礎(chǔ)上新增加的方法、修改繼承于父類的方法。對于新增加的方法,按定義的規(guī)則生成測試用例;對于修改繼承于父類的方法,獲取以XML格式存儲的父類測試用例集,根據(jù)測試模型提出的方法確定可重用的測試用例。這樣,子類的測試用例集已確定,執(zhí)行測試用例集,即完成對子類的測試。通過實例驗證,該測試方法是有效的,極大地提高了子類的測試效率問題。
關(guān)鍵詞:繼承;測試用例集;測試模型;XML格式;復(fù)用測試用例
中圖分類號:TP311 文獻標(biāo)識碼:A 文章編號:1009-3044(2017)07-0236-04
1概述
1.1課題研究背景
從計算機問世以來,程序的編制與測試就同時擺在人們面前,但測試在軟件開發(fā)中的作用并沒有受到應(yīng)有的重視。但是,就目前軟件工程發(fā)展的現(xiàn)狀而言,軟件測試仍然是較為薄弱的一方面。不僅測試理論,已有的測試方法也不能滿足當(dāng)前軟件開發(fā)的實際需求。
軟件測試是保證系統(tǒng)質(zhì)量的重要手段,軟件測試中一般包括單元測試,集成測試,系統(tǒng)測試等階段。以面向?qū)ο蠹夹g(shù)開發(fā)的系統(tǒng)其測試過程也包括這些階段,但是由于面向?qū)ο蠹夹g(shù)本身的特點,如繼承、封裝、多態(tài)等,使得在對面向?qū)ο蠹夹g(shù)開發(fā)的系統(tǒng)進行測試時提出了新的要求,尤其是面向?qū)ο蟮膯卧獪y試。在面向?qū)ο蟮膯卧獪y試中由于存在繼承(可能有多重繼承)關(guān)系,在將類看成單元的情況下,對類進行單元測試提出了挑戰(zhàn)。假設(shè),不考慮類的繼承關(guān)系而將每個類分別看成一個獨立的單元和傳統(tǒng)的單元一樣單獨的進行測試,將耗費大量的時間,同時也不能保證繼承了父類的屬性及方法在子類中的正確性。
傳統(tǒng)的單元測試是針對程序的函數(shù)、過程或完成某一特定功能的程序塊。面向?qū)ο箝_發(fā)的特性使得其單元測試不完全等同于傳統(tǒng)的單元測試。尤其是繼承特性,雖然在編程階段使得子類的編寫效率有所提高,但在對子類進行測試時所出現(xiàn)的問題是在傳統(tǒng)測試中從未遇見的。因此,在對面向?qū)ο蟪绦蜻M行單元測試時,除了繼承傳統(tǒng)的技術(shù)之外,還必須研究相適應(yīng)的新的測試方法。
1.2問題的提出
當(dāng)子類繼承父類時,子類在父類的基礎(chǔ)上進行了擴充,即增加方法和修改方法。所以對子類進行測試時,可以在其父類充分測試的基礎(chǔ)上,利用父類的測試用例集,分析子類繼承父類的關(guān)系,進行對子類的測試。
針對繼承特性帶來的影響,在父類已經(jīng)進行了充分的測試的前提下,若要對其子類進行測試,應(yīng)考慮如下問題:
1)子類中添加的方法該如何測試
2)子類中隱式繼承父類的方法是否不再重新測試
3)子類中對繼承父類的方法進行修改后該如何測試
只有充分覆蓋了以上可能出現(xiàn)的三種情況,對子類的測試才能在一定程度上滿足要求,確保子類功能的實現(xiàn),從而保證整個系統(tǒng)的軟件質(zhì)量。
2子類測試模型思想
在問題提出中已經(jīng)提到對子類的測試是在父類的基礎(chǔ)之上,也就是實際上子類的測試分為兩步,先分析子類與父類的繼承關(guān)系,再對子類進行測試。其實這兩步就是兩個子步驟,下面將對測試過程中用到的一些定義進行說明,其中主要包括類繼承關(guān)系的定義和測試用例集的定義。
2.1測試過程相關(guān)定義
定義1:根基類集合
假設(shè)系統(tǒng)中存在一系列類,這一系列類的共同特性是:該類不存在父類,則稱具有這一特性的類為系統(tǒng)的根基類。根基類抽象出了系統(tǒng)中某些共同的功能,利用面向?qū)ο蟮睦^承特性,使其子類根據(jù)不同的需求實現(xiàn)具體的細節(jié)。記系統(tǒng)的根基類為Pi,系統(tǒng)中所有的根基類只組成一個根基類集合Root={Pi},其中i>0。
定義2:非根基類元素
系統(tǒng)中的類除了根基類,剩下的是非根基類。即非根基類是通過繼承根基類或其他非根基類而得到的一系列類。非根基類一定有其對應(yīng)的父類,可以有其對應(yīng)的子類。記系統(tǒng)的非根基類為Si。
定義3:方法間調(diào)用關(guān)系
假設(shè)任意一個類Pi,其方法列表PM中有方法mi和mj,并且i≠j。若方法mi在執(zhí)行過程中用到方法%的執(zhí)行結(jié)果,則稱方法mi調(diào)用了方法mj,記mi→mj。那么任意一個類Pi的方法間調(diào)用關(guān)系可用二維數(shù)組PMCi表示為:
二維數(shù)組元素mij?。?,1)其中的一個值。若mik=0表示mi沒有調(diào)用mj;若mij=1表示mi調(diào)用了mi,即mi→mj。二維數(shù)組中的非零元素的個數(shù)定義了調(diào)用關(guān)系的數(shù)量。
定義4:XML格式的類結(jié)構(gòu)
XML(Extensible Markup Language),可擴展標(biāo)記語言,是一種允許用戶對自己的標(biāo)記語言進行定義的源語言,具有快速存儲和讀取的特性。本文結(jié)合XML設(shè)計和結(jié)構(gòu)的優(yōu)勢,利用其定義類的結(jié)構(gòu),定義結(jié)構(gòu)如下:
其中,具體標(biāo)簽含義分別定義如下:
1.
2.
3.
4.
5.
系統(tǒng)中的每一個類都對應(yīng)一個xml文件,定義該xml文件的命名規(guī)則為“類名.xml”。
定義5:類差異腳本文件
假設(shè)系統(tǒng)中的兩個類A和B,其對應(yīng)的x打d文件分別為A.xml和Bxml。對比A.xml和B.xml,用差異腳本記錄類A在類B基礎(chǔ)上的變化,其定義如下:
其中,具體的標(biāo)簽含義定義如下;
1.
2.子標(biāo)簽
3.
4.子標(biāo)簽
5.子標(biāo)簽
類差異腳本文件記錄了類A不同于類B之處,定義該文件的命名規(guī)則為“A_diff_B.xml”。
定義6:基于xml格式的測試用例庫
測試用例(Test Case)是為某個特殊目標(biāo)而編制的一組測試輸入、執(zhí)行條件以及預(yù)期結(jié)果,以便測試某個程序路徑或核實是否滿足某個特定需求。測試用例庫(Test Case Library)就是這樣一系列測試用例的集合。結(jié)合xml輕量級的數(shù)據(jù)存取特點,利用其存儲測試用例,有利于生成測試用例時的存儲和執(zhí)行測試用例時的讀取。通用的測試用例結(jié)構(gòu)定義如下;
其中,具體的標(biāo)簽含義定義如下:
1.
2.
3.子標(biāo)簽
4.子標(biāo)簽
5.子標(biāo)簽標(biāo)識測試輸入;
6.子標(biāo)簽
7.子標(biāo)簽
8.子標(biāo)簽
系統(tǒng)所有測試用例存儲在一個xml文件中,組成測試用例庫,該測試用例庫的命名規(guī)則為“TC_Library.xml”。
2.2子類測試策略模型
2.2.1測試策略模型思想
根據(jù)3.1節(jié)中的相關(guān)定義,本節(jié)給出具體的測試策略。
假設(shè)給定系統(tǒng)中的任意一個類Ci,現(xiàn)要對Ci進行測試,基于以上的分析,測試策略的邏輯如下:
步驟一:根據(jù)定義1,在集合Roots={Pi}中查詢類Ci,若Ci存在于集合Roots中,說明被測類Ci為一個根基類。首先生成類Ci對應(yīng)的方法間調(diào)用關(guān)系PMCi和xml格式的類結(jié)構(gòu)Ci.xml文件。
步驟二;由定義可知,Ci.xml結(jié)構(gòu)中
步驟三:根據(jù)步驟一,若不存在于集合Roots中,說明被測類Ci為一個非根基類。首先生成類Ci對應(yīng)的方法間調(diào)用關(guān)系PMCi和xml格式的類結(jié)構(gòu)Ci.xml文件。分析Ci.xml結(jié)構(gòu)中
步驟四:根據(jù)定義7中定義的類差異腳本文件的具體結(jié)構(gòu),分別可獲得子類Ci在父類Cj的基礎(chǔ)上新增加的屬性、新增加的方法以及修改繼承父類的方法。
步驟五;針對類Ci中新增加的每一個方法,為其設(shè)計一組測試用例,并按照測試用例模板填充,添加到測試用例庫中。針對類Ci中修改的父類方法mj,在測試用例庫中找到其對應(yīng)的測試用例。若父類Cj的測試用例不能全為Ci所用,如圖1:
其中集合X表示父類Cj中對該方法設(shè)計的測試用例集,集合y表示子類Ci中修改后mj對應(yīng)的測試用例,則陰影部分為子類Ci可復(fù)用父類CI的測試用例集。除去陰影部分,還應(yīng)為mj設(shè)計額外的測試用例;若父類Cj對應(yīng)的測試用例能全為Ci所用,如圖2:
但集合X的測試用例集并不能完全覆蓋mi的功能,所以除了復(fù)用父類已有的測試用例集,還應(yīng)為mj設(shè)計額外的測試用例集;若父類Cj對應(yīng)的測試用例全不能為Ci所用,如圖3:
集合X與集合y的交集為空,類Ci中修改的方法mj需重新設(shè)計測試用例集;若父類Cj對應(yīng)的測試用例能全為Si所用,如圖4;
則mj能完全復(fù)用父類的測試用例集,極大了提高了測試效率。
步驟六:分析類Ci對應(yīng)的方法間調(diào)用關(guān)系PMCi并根據(jù)步驟五的結(jié)果,為子類Co設(shè)計的測試用例已確定,根據(jù)定義8填寫測試用例,并添加到測試用例庫中。
步驟七;執(zhí)行測試用例庫中針對類Ci的測試用例,最后記錄下測試結(jié)果并分析測試結(jié)果。整個類Ci的測試過程到此結(jié)束。
3算法實現(xiàn)
3.1測試策略算法實現(xiàn)
根據(jù)3.2節(jié)中根據(jù)3.1中測試策略模型思想的邏輯,本節(jié)將算法予以實現(xiàn)。
對于給定的任意一個類,通過類名在類名.xml文件中獲取其對應(yīng)的xml類結(jié)構(gòu)。根據(jù)定義6中對xml格式的定義,分析
在得到的子類_diff_父類.xml文件中,根據(jù)定義7中定義的格式,分析
對于子類中修改父類的方法,根據(jù)步驟五中的描述,若父類Cj的測試用例不能全為Ci所用,除去父類已有的測試用例部分,還應(yīng)設(shè)計額外的測試用例;若父類Cj對應(yīng)的測試用例能全為Ci所用,但不能完全覆蓋mj的功能,所以除了復(fù)用父類已有的測試用例,還應(yīng)為mj設(shè)計額外的測試用例;若父類Cj對應(yīng)的測試用例全不能為Ci所用,類Ci中修改的方法mj需重新設(shè)計測試用例集;若父類Cj對應(yīng)的測試用例能全為Si所用,則mj能完全復(fù)用父類的測試用例集,極大地提高了測試效率。
3.2算法復(fù)雜度分析
由2.1中定義1,定義4,定義5,定義6,定義7以及2.2.1中測試策略模型以及3.1中對測試算法的實現(xiàn),對測試算法存在如下結(jié)論:
若被測子類為一級繼承根基類,其中,被測子類包含M個屬性,N個方法,即M個屬性為子類新增加的屬性,N為子類新增加的方法和繼承父類方法的總和,則對測試策略算法的時間復(fù)雜度分析有如下結(jié)論;
測試策略算法對被測子類進行操作:獲取子類的屬性ai和方法mi,并生成對應(yīng)的child.xml文件;獲取子類對應(yīng)的父類并運用相同的方法生成對應(yīng)的parent.xml文件,比較兩個XML文件,并生成對應(yīng)的child_diff_parent xml。根據(jù)定義2.1中對差異腳本的定義,標(biāo)簽的多少取決于子類不同于父類的程度,標(biāo)簽越多,說明子類在父類的基礎(chǔ)上改變的越多。根據(jù)步驟五復(fù)用父類測試用例的描述,將任何一種可能的情況與其匹配。其算法時間復(fù)雜度為T(n)=o(n)(其中n=MM)。
所以測試策略算法的時間復(fù)雜度為T(n)=o(n)(其中n=MM)。
4模型算法驗證
4.1算法驗證環(huán)境及數(shù)據(jù)準(zhǔn)備
本文的實驗是搭建在Windows7平臺的Java環(huán)境上,由于本文算法模型主要是對系統(tǒng)中子類的測試,所以選取測試數(shù)據(jù)時應(yīng)盡量選取系統(tǒng)中的子類而不是父類。但本文算法執(zhí)行的前提是父類已充分測試,而該算法同樣適用于對父類的測試,所以父類的測試也可以用該算法實現(xiàn)。
由于系統(tǒng)中類內(nèi)方法之間存在著相互調(diào)用的關(guān)系,算法模型的可靠性很大程度上和方法之間調(diào)用的復(fù)雜度相關(guān),因此為了對模型可靠性驗證,系統(tǒng)中類的數(shù)量及類內(nèi)方法之間的調(diào)用關(guān)系復(fù)雜度應(yīng)該由簡單到復(fù)雜的驗證過程。
其次,由于需要驗證算法的效率,需要比較在沒有運用算法對某一系統(tǒng)中的子類進行測試的時間和運用算法后測試時間的對比?;谝陨戏治觯疚牡臄?shù)據(jù)信息如下:
4.2驗證結(jié)果及結(jié)果分析
通過對算法執(zhí)行與否測試時間的對比,以及算法作用于不同類型的系統(tǒng)的分析,模型能夠良好地對系統(tǒng)中的子類進行測試,且具有較高的測試效率。
實驗結(jié)果的準(zhǔn)確性通過對系統(tǒng)測試覆蓋率的分析,算法效率通過比較算法執(zhí)行與否對某一具體類測試的執(zhí)行時間。
5結(jié)論與展望
實驗結(jié)果表明,本文測試算法對系統(tǒng)中子類的測試有較高的測試效率,提高了單獨測試子類的時間和效率,有很大的應(yīng)用價值。
可以得出以下結(jié)論:
1)算法較好地利用了子類與父類的繼承關(guān)系,實驗證明該方法是可行的。
2)對比算法簡單,且讀取和解析文件速度很快。
3)在分析子類與父類的關(guān)系之后,再對子類進行測試的速度明顯快于單獨測試子類。
對于該測試算法的應(yīng)用前景,提出以下展望;
1)目前實驗數(shù)據(jù)還不足夠,可能存在沒有覆蓋到的情況,需要不斷實驗補充。
2)測試覆蓋率在一定程度上需要進一步提高。