宋艷++王煒
摘 要:程序特征定位是成功實(shí)施動(dòng)態(tài)演化意圖的前提條件,其核心是識(shí)別代碼集合與特征之間的映射關(guān)系。將程序運(yùn)行時(shí)有規(guī)律的消息傳遞模式抽象為規(guī)則,通過規(guī)則獲取和注釋識(shí)別了程序特征與代碼集合之間的映射關(guān)系,提出了規(guī)則空間用于刻畫程序特征間存在的大小和層次等粒度屬性,并基于此實(shí)現(xiàn)了對(duì)復(fù)雜程序特征的層次化理解,完成了特征定位。通過對(duì)Eclipse3.0的45個(gè)測試用例(含4822個(gè)對(duì)象)進(jìn)行分析,在置信度和支持度設(shè)置為75%和30%的情況下,生成了645條規(guī)則和規(guī)則空間,實(shí)現(xiàn)了特征定位。其平均準(zhǔn)確率為34.33%,這證明該方法是可行的。
關(guān)鍵詞:軟件動(dòng)態(tài)演化;程序特征;行為規(guī)則;特征定位
中圖分類號(hào):TP311.5 文獻(xiàn)標(biāo)識(shí)碼:A DOI:10.15913/j.cnki.kjycx.2015.12.001
特征定位(Feature Location)是指構(gòu)建程序特征與軟件代碼之間映射關(guān)系的過程,它將來自系統(tǒng)問題域的特征映射到了系統(tǒng)實(shí)現(xiàn)域的代碼實(shí)體(Source Code Entities)。IEEE 829認(rèn)為,程序的特征是“一個(gè)軟件項(xiàng)目的顯著特點(diǎn)”,例如功能、可移植性或性能特性。文獻(xiàn)2中指出,在長生命周期軟件系統(tǒng)中,50%~75%的系統(tǒng)成本和相關(guān)費(fèi)用用于軟件維護(hù),其中1/2以上的工作量用于特征定位。
各國研究人員針對(duì)特征定位開展了廣泛而深入的研究,提出了靜態(tài)、動(dòng)態(tài)和基于文本的特征定位方法。其中,由于動(dòng)態(tài)方法具有比較高的查準(zhǔn)率,所以,其被廣泛應(yīng)用于特征定位領(lǐng)域。1995年,Wilde提出了最早的動(dòng)態(tài)特征定位方法——軟件偵測技術(shù)。該方法關(guān)注獲取特征與代碼實(shí)體之間的特定追蹤關(guān)系。對(duì)每個(gè)需要定位的特征設(shè)計(jì)兩組測試用例,一組測試用例的執(zhí)行展示該特征,而另外一組測試用例的執(zhí)行不會(huì)涉及這個(gè)系統(tǒng)的特征。兩組測試用例所對(duì)應(yīng)的執(zhí)行跡之差便是特征所對(duì)應(yīng)的代碼。程序切片技術(shù)可以應(yīng)用于動(dòng)態(tài)特征定位,而程序切片是指影響程序中某個(gè)興趣點(diǎn)變量取值的所有語句和控制謂詞組成的一個(gè)程序子集。Wong、張迎周、徐寶文等學(xué)者基于程序切片技術(shù)提出了各自的程序理解方法。Eisenberg基于特征跡(Dynamic Feature Traces)方法進(jìn)行特征定位研究。該方法賦予了執(zhí)行跡中的成對(duì)調(diào)用關(guān)系一個(gè)權(quán)值,利用這個(gè)權(quán)值確定了該執(zhí)行跡屬于某個(gè)程序特征的程度。此方法在3個(gè)Java系統(tǒng)上進(jìn)行了測試,結(jié)果表明,該方法的效率比軟件偵測效率高。Safyallah和Sartipi提出了一種將數(shù)據(jù)挖掘技術(shù)運(yùn)用到執(zhí)行跡抽取的方法。Bohnet等人提出了一種將執(zhí)行信息可視化的技術(shù),依靠該技術(shù)可以完成觀察特征的實(shí)現(xiàn)。劉奕明結(jié)合領(lǐng)域建模方法提出了一種基于本體的動(dòng)態(tài)軟件特征建模方法,并給出了其元模型和基于推理的模型一致性驗(yàn)證方法。開發(fā)者可以對(duì)動(dòng)態(tài)軟件系統(tǒng)的業(yè)務(wù)邏輯共性、運(yùn)行時(shí)業(yè)務(wù)邏輯的可變性和這些可變性之間的約束關(guān)系建模,從而為動(dòng)態(tài)軟件系統(tǒng)提供高層次、抽象的軟件演化業(yè)務(wù)邏輯視圖。Eisenbarth等人基于概念格(Concept Lattice)進(jìn)行了特征定位研究。該方法對(duì)場景、測試用例與代碼實(shí)體間的二元關(guān)系進(jìn)行了形式化的概念分析,為其建立了一個(gè)概念格結(jié)構(gòu),并將其可視化。
雖然各國學(xué)者從不同角度提出了動(dòng)態(tài)特征定位方法,但是,當(dāng)前的研究成果大多都著眼于建立用例與代碼間的映射關(guān)系。然而,任何一個(gè)用例都是由一個(gè)或多個(gè)軟件功能組成的,因此,傳統(tǒng)的動(dòng)態(tài)特征定位方法無法實(shí)現(xiàn)軟件功能與代碼之間的映射關(guān)系。另外,在進(jìn)行特征定位時(shí),一個(gè)測試用例往往對(duì)應(yīng)著大量的執(zhí)行跡,而現(xiàn)有的方法無法量化表示上述執(zhí)行跡間的因果關(guān)系,所以,后續(xù)分析無從下手。
針對(duì)上述2個(gè)缺陷,本文基于行為規(guī)則提出了動(dòng)態(tài)特征定位方法。
1 方法綜述
如圖1所示,本文采用的方法可以分為3個(gè)部分:①產(chǎn)生測試用例,并收集程序執(zhí)行跡;②生成行為規(guī)則集;③構(gòu)造行為規(guī)則空間,實(shí)現(xiàn)特征定位。
圖1 基于行為規(guī)則的軟件特征理解方法流程
1.1 產(chǎn)生測試用例并收集程序執(zhí)行跡
動(dòng)態(tài)特征定位的基礎(chǔ)是執(zhí)行跡。執(zhí)行跡的獲取有以下4個(gè)步驟:①編寫測試用例,測試用例應(yīng)覆蓋軟件的所有功能點(diǎn)或執(zhí)行路徑;②在源代碼中,設(shè)置檢查點(diǎn)(Check Point),用來觀察程序運(yùn)行時(shí)的狀態(tài)信息,并編譯帶有檢查點(diǎn)的代碼,從而形成可執(zhí)行文件;③執(zhí)行測試用例,觀測并收集與測試用例相關(guān)的數(shù)據(jù);④建立執(zhí)行跡與測試用例之間的映射關(guān)系。
實(shí)現(xiàn)特征定位首先要生成測試用例。
定義1:有限非空集合U={u1,u2,…,un},n∈N為一個(gè)測試用例集合。二元組ui=(IDi,BDi)是一個(gè)測試用例,其中,IDi定義為該測試用例的標(biāo)示符,有限非空集合BDi包含了對(duì)該測試用例的描述。
通過對(duì)含有檢查點(diǎn)的可執(zhí)行文件執(zhí)行測試用例,可以獲取對(duì)應(yīng)的執(zhí)行跡。執(zhí)行跡不僅是刻畫程序運(yùn)行時(shí)代碼實(shí)體間消息傳遞關(guān)系的載體,同時(shí),它還反映了程序功能單元的實(shí)現(xiàn)過程。
定義2:有限非空集合T={t1,t2,…,tn},n∈N是程序的執(zhí)行跡集合。其中,ti是與測試用例ui相對(duì)應(yīng)的執(zhí)行跡。
定義3:執(zhí)行跡可以描述為一個(gè)三元組,即ti=(Oi,
當(dāng)前,有多種工具可以完成對(duì)執(zhí)行跡的獲取,例如Flat3 等。表1給出使用Flat31獲取的一個(gè)執(zhí)行跡片段示例。
表1 執(zhí)行跡片段示例
0:0:46:26 mouseEntered -- org.gjt.sp.jedit.textarea.Gutter$MouseHandler
0:0:46:26 mouseExited -- org.gjt.sp.jedit.textarea.Gutter$MouseHandler