專利名稱:一種基于遺傳算法的mc/dc測(cè)試數(shù)據(jù)自動(dòng)生成方法
技術(shù)領(lǐng)域:
本發(fā)明屬于軟件測(cè)試技術(shù)領(lǐng)域,具體涉及一種基于遺傳算法的MC/DC測(cè)試數(shù)據(jù)自動(dòng)生成方法,特別涉及工程測(cè)試中滿足MC/DC覆蓋(修正條件判定覆蓋)的測(cè)試數(shù)據(jù)自動(dòng)生成方法。
背景技術(shù):
測(cè)試數(shù)據(jù)自動(dòng)生成技術(shù)是指通過(guò)特定的算法依據(jù)軟件的規(guī)約或者程序結(jié)構(gòu)自動(dòng)構(gòu)造測(cè)試輸入數(shù)據(jù),其目的在于減輕測(cè)試人員所必須付出的大量勞動(dòng),降低手工測(cè)試的高額成本,同時(shí)提高測(cè)試過(guò)程的可信賴程度。遺傳算法是一種模擬生物進(jìn)化過(guò)程和機(jī)制求解極值問(wèn)題的自適應(yīng)人工智能技術(shù),在解決大空間、非線性等高復(fù)雜度問(wèn)題時(shí)具有獨(dú)特的優(yōu)勢(shì)。動(dòng)態(tài)執(zhí)行程序生成測(cè)試數(shù)據(jù)的思想最初由Miller和Spooner提出,后來(lái)的學(xué)者做了大量的進(jìn)一步研究。1992年,Xanthakis首先將遺傳算法應(yīng)用于測(cè)試用例生成,它采用編碼技術(shù)將D映射到基因空間G,并通過(guò)選擇、交叉、變異等遺傳操作和優(yōu)勝劣汰的自然選擇確定搜索方向。交叉和變異操作為種群引入新的信息,從而更有利于找到全局最優(yōu)解,避免了以往算法往往容易陷入局部極值的問(wèn)題,能夠生成滿足所有分支判定準(zhǔn)則的測(cè)試數(shù)據(jù)。 在國(guó)內(nèi),1996到1998年,莢偉、高仲儀等發(fā)表多篇論文,討論將遺傳算法應(yīng)用于基于路徑覆蓋的Ada軟件結(jié)構(gòu)測(cè)試數(shù)據(jù)的自動(dòng)生成,并得出遺傳算法比爬山法和隨機(jī)法生成測(cè)試數(shù)據(jù)的效率高的結(jié)論。2001年,汪浩等給出了遺傳算法的形式化的表示和一個(gè)基于此算法的測(cè)試數(shù)據(jù)生成系統(tǒng)原型。2003年,景志遠(yuǎn)從數(shù)學(xué)的角度分析了將MGA和遺傳K均值等改進(jìn)的算法應(yīng)用于測(cè)試用例的自動(dòng)生成。2006年,程燁在學(xué)位論文將遺傳算法用于路徑覆蓋測(cè)試數(shù)據(jù)自動(dòng)生成,并開(kāi)發(fā)了相應(yīng)的工具模型。2008年,呂珊珊在她的學(xué)位論文中使用神經(jīng)網(wǎng)絡(luò)和遺傳算法生成基于輸入域的測(cè)試數(shù)據(jù)??偟膩?lái)說(shuō),現(xiàn)在國(guó)內(nèi)外的研究學(xué)者多采用遺傳算法或者遺傳算法的改進(jìn)算法作為核心算法來(lái)生成測(cè)試數(shù)據(jù)。但上述均是選擇邏輯結(jié)構(gòu)相對(duì)簡(jiǎn)單的語(yǔ)句覆蓋或分支覆蓋生成測(cè)試用例,使其在實(shí)際的工程領(lǐng)域無(wú)法得到廣泛的應(yīng)用。
發(fā)明內(nèi)容
針對(duì)現(xiàn)有技術(shù)中存在的問(wèn)題,本發(fā)明提出一種基于遺傳算法的MC/DC測(cè)試數(shù)據(jù)自動(dòng)生成方法。針對(duì)遺傳算法中傳統(tǒng)適應(yīng)度函數(shù)僅依靠控制流圖中節(jié)點(diǎn)間的控制依賴關(guān)系, 沒(méi)有考慮被測(cè)程序內(nèi)部的數(shù)據(jù)依賴關(guān)系的缺陷,提出使用鏈接法思想收集直接或者通過(guò)數(shù)據(jù)依賴間接影響問(wèn)題節(jié)點(diǎn)遍歷的控制節(jié)點(diǎn),并將其與表征控制依賴關(guān)系見(jiàn)長(zhǎng)的傳統(tǒng)適應(yīng)度函數(shù)相結(jié)合,構(gòu)造一個(gè)新的適應(yīng)度函數(shù),以此來(lái)克服傳統(tǒng)的適應(yīng)度函數(shù)因忽略程序內(nèi)部的數(shù)據(jù)依賴關(guān)系而造成的引導(dǎo)信息缺乏、搜索退化的問(wèn)題。在此基礎(chǔ)上設(shè)計(jì)實(shí)現(xiàn)了基于遺傳算法的滿足MC/DC準(zhǔn)則的測(cè)試數(shù)據(jù)自動(dòng)生成方法。MC/DC準(zhǔn)則強(qiáng)調(diào)單個(gè)變量對(duì)于最后表達(dá)式真假的影響的能力,要求每一個(gè)條件都要獨(dú)立的影響判定表達(dá)式的結(jié)果,對(duì)邏輯關(guān)系復(fù)雜且安全性要求較高的軟件系統(tǒng)進(jìn)行測(cè)試時(shí)具有很大的實(shí)用價(jià)值。
本發(fā)明提出一種基于遺傳算法的MC/DC測(cè)試數(shù)據(jù)自動(dòng)生成方法,具體包括以下幾個(gè)步驟步驟一對(duì)被測(cè)程序進(jìn)行靜態(tài)分析,產(chǎn)生控制流圖、數(shù)據(jù)流圖、抽象語(yǔ)法樹(shù)和抽象分析樹(shù)。步驟二 生成MC/DC測(cè)試用例預(yù)期結(jié)果集。步驟2. 1 從抽象分析樹(shù)中提出條件節(jié)點(diǎn),這些條件節(jié)點(diǎn)構(gòu)成了抽象分析樹(shù)的葉子,每一個(gè)葉子就是一個(gè)變量,用N表示提取的葉子變量的個(gè)數(shù)。步驟2. 2 構(gòu)建真值表,對(duì)N個(gè)葉子變量,有2n種排列組合。步驟2.3 用數(shù)字0和1填充真值表。步驟2. 4 針對(duì)真值表中的每一行步驟2. 5. 1 將真值表當(dāng)前行中的布爾值對(duì)應(yīng)分配給抽象分析樹(shù)的每一個(gè)葉子變量;步驟2. 4. 2 自底向上評(píng)價(jià)各個(gè)條件節(jié)點(diǎn)的布爾值,直到抽象分析樹(shù)的頂端,最終所得的抽象分析樹(shù)的頂端的條件節(jié)點(diǎn)的布爾值就是這個(gè)判定語(yǔ)句的輸出結(jié)果值;步驟2. 4. 3 用輸出結(jié)果值填充真值表的輸出列。步驟2. 5 針對(duì)每一個(gè)葉子變量,尋找其測(cè)試用例,并添加到每個(gè)葉子變量的MC/ DC測(cè)試用例集中步驟2. 5. 1 為每一個(gè)葉子變量建立一對(duì)空的MC/DC測(cè)試用例集;步驟2. 5. 2 在真值表中,尋找其他葉子變量值固定,只有目標(biāo)葉子變量改變的兩行;步驟2. 5. 3 比較步驟2. 5. 2中的兩行的輸出結(jié)果值,如果兩行的輸出結(jié)果值不同,則這兩行就是目標(biāo)葉子變量的一對(duì)測(cè)試用例,將這兩行以成對(duì)的形式添加到步驟2. 5. 1 中建立的MC/DC測(cè)試用例集中。步驟2. 6 將每一個(gè)葉子變量的MC/DC測(cè)試用例集合并,得到測(cè)試用例集,并最小化測(cè)試用例集。步驟三對(duì)被測(cè)程序進(jìn)行代碼插樁。首先遍歷抽象語(yǔ)法樹(shù)找到插樁的位置,判斷是否是插樁點(diǎn),如果不是插樁點(diǎn),返回繼續(xù)遍歷抽象語(yǔ)法樹(shù)尋找找到插樁位置;如果是插樁點(diǎn),則植入檢查語(yǔ)句,然后直接在抽象語(yǔ)法樹(shù)上以子樹(shù)的形式植入代碼的語(yǔ)法樹(shù)片段,判斷插樁是否完成,如已完成,則被測(cè)程序編譯運(yùn)行;如未完成,返回繼續(xù)遍歷抽象語(yǔ)法樹(shù)找到插樁的位置,直至完成插樁。步驟四構(gòu)造適應(yīng)度函數(shù)。步驟4. 1 建立控制依賴關(guān)系適應(yīng)度函數(shù)步驟4. 1. 1 通過(guò)被測(cè)程序的控制流圖,獲得每一個(gè)判定的控制依賴關(guān)系集合;控制依賴用來(lái)描述一個(gè)目標(biāo)節(jié)點(diǎn)y的執(zhí)行關(guān)于其前面分支節(jié)點(diǎn)輸出的依賴性,當(dāng)每一條從目標(biāo)節(jié)點(diǎn)y到出口節(jié)點(diǎn)e的路徑都包含節(jié)點(diǎn)ζ時(shí),稱節(jié)點(diǎn)ζ被目標(biāo)節(jié)點(diǎn)y后置控制;任意節(jié)點(diǎn) χ,兩個(gè)節(jié)點(diǎn)(y,χ)之間可以構(gòu)成一個(gè)分支路徑,當(dāng)每一條從目標(biāo)節(jié)點(diǎn)y到出口節(jié)點(diǎn)e的通過(guò)(y,x)分支路徑都包括節(jié)點(diǎn)ζ時(shí),稱節(jié)點(diǎn)ζ后置控制一個(gè)分支(y,x);當(dāng)節(jié)點(diǎn)ζ后置控制 y的一個(gè)分支,且節(jié)點(diǎn)ζ不后置控制節(jié)點(diǎn)y,稱節(jié)點(diǎn)ζ控制依賴于目標(biāo)節(jié)點(diǎn)y,控制依賴關(guān)系是從結(jié)構(gòu)關(guān)系角度衡量當(dāng)前輸入測(cè)試數(shù)據(jù)距離抵達(dá)目標(biāo)的逼近程度,通過(guò)控制流圖中目標(biāo)與執(zhí)行偏離條件節(jié)點(diǎn)間的關(guān)鍵節(jié)點(diǎn)計(jì)算得到。步驟4. 1. 2 建立控制依賴關(guān)系適應(yīng)度函數(shù)控制依賴關(guān)系適應(yīng)度函數(shù)包含了控制依賴關(guān)系集合中各分支節(jié)點(diǎn)的目標(biāo)函數(shù),建立控制依賴關(guān)系適應(yīng)度函數(shù)為
ControlDqps^tta d e ρ ef n s e(1)其中,d印endentde。isi。n為目標(biāo)的控制依賴關(guān)系集合中的控制節(jié)點(diǎn)數(shù); executeddecisions表示以當(dāng)前測(cè)試數(shù)據(jù)為輸入;ControlD印Fittestdata表示控制依賴關(guān)系適應(yīng)度函數(shù);如果控制依賴關(guān)系適應(yīng)度函數(shù)值為0,則測(cè)試數(shù)據(jù)能夠到達(dá)目標(biāo)判定;如果控制依賴關(guān)系適應(yīng)度函數(shù)值大于0,則測(cè)試數(shù)據(jù)在某處偏離了目標(biāo)節(jié)點(diǎn),通過(guò)控制依賴關(guān)系適應(yīng)度函數(shù)的值,得到偏離節(jié)點(diǎn)divergecLde ;步驟4. 2 建立數(shù)據(jù)依賴關(guān)系適應(yīng)度函數(shù)定義pn為問(wèn)題節(jié)點(diǎn),S為用來(lái)儲(chǔ)存一個(gè)給定節(jié)點(diǎn)的依賴關(guān)系的集合,以pn和S作為獲取數(shù)據(jù)依賴關(guān)系適應(yīng)度函數(shù)方法的輸入,DepSets用來(lái)儲(chǔ)存當(dāng)前搜集到的存在依賴關(guān)系的節(jié)點(diǎn)集合,PV用來(lái)存儲(chǔ)問(wèn)題節(jié)點(diǎn)使用的變量,S和DepSets被初始化為空集,獲取一個(gè)節(jié)點(diǎn)S的依賴關(guān)系適應(yīng)度函數(shù)的方法為步驟4. 2. 1 獲取問(wèn)題節(jié)點(diǎn)pn的控制依賴關(guān)系集合ControlD印(pn)賦給S,并將 pn使用的變量UsedVariables (pn)加到PV中;步驟4. 2. 2 對(duì)于PV中的每一個(gè)變量pv,獲取pv的最后定義集合IastDefs ;(a)對(duì)于IastDefs中每一個(gè)最后定義ld,獲取Id的控制依賴關(guān)系集合 ControlDep (Id),并將其與S合并,得到擴(kuò)展的S,然后將Id使用的變量UsedVariables (Id) 添加到一個(gè)新建的PVnew中;(b)對(duì)于ControlD印(Id)中的每一個(gè)控制節(jié)點(diǎn)cd,獲取它使用的變量 UsedVariables (Id),并添加到步驟4. 2. 2 (a)建立的PVnew集合中;步驟4. 2. 3 對(duì)于PV中的每一個(gè)變量pv,迭代獲取PV依賴關(guān)系集S (Id),首先獲得PV中的第一個(gè)變量,獲取其依賴關(guān)系集S (Id),返回步驟4. 2. 2,然后獲取PV中的下一個(gè)變量,直至完成PV中所有的變量,結(jié)束迭代,并將S (Id)添加到DepSets中;步驟4. 2. 4 建立用于定義適應(yīng)度函數(shù)的依賴關(guān)系集合定義D印Fit為適應(yīng)度函數(shù)依賴關(guān)系集合,對(duì)于D印Sets中的每一個(gè)子集Si (a)添加 Si 到 D印Fit 中;(b)判斷D印Sets中每一個(gè)非Si的子集Sj,與Si是否存在theruelse的分支沖突, 如果不存在,則合并兩個(gè)子集Si、Sj,得到新的子集Siij,并將Siij添加到D印Fit中;如果存在then、else的分支沖突則不能合并,將Si、Sj都添加到D印Fit中;步驟4. 2. 5 建立數(shù)據(jù)依賴關(guān)系適應(yīng)度函數(shù)建立數(shù)據(jù)依賴關(guān)系集合后,用計(jì)算控制依賴關(guān)系適應(yīng)度函數(shù)的方法得到數(shù)據(jù)依賴關(guān)系適應(yīng)度函數(shù)。步驟4. 3 建立分支適應(yīng)度函數(shù)當(dāng)測(cè)試數(shù)據(jù)抵達(dá)目標(biāo)時(shí),用分支距離來(lái)度量測(cè)試數(shù)據(jù)是否滿足期望測(cè)試用例,通過(guò)計(jì)算分支距離度量測(cè)試數(shù)據(jù)距離期望測(cè)試用例的逼近程度,如果測(cè)試數(shù)據(jù)到達(dá)目標(biāo)判定,但是不滿足任一個(gè)MC/DC測(cè)試用例,那么每一個(gè)測(cè)試數(shù)據(jù)的接近水平都為0,但分支距離不為0 ;如果測(cè)試抵達(dá)目標(biāo)并實(shí)現(xiàn)一個(gè)測(cè)試用例,那么它的分支距離和接近水平都為0 ; 計(jì)算出來(lái)的分支距離的大小用來(lái)評(píng)價(jià)哪一個(gè)測(cè)試數(shù)據(jù)更接近于滿足期望的分支測(cè)試用例。步驟五在MC/DC測(cè)試用例、適應(yīng)度函數(shù)公式和執(zhí)行插樁代碼的基礎(chǔ)上,隨機(jī)產(chǎn)生測(cè)試數(shù)據(jù),并在這些測(cè)試數(shù)據(jù)上執(zhí)行插樁后的被測(cè)程序,獲得適應(yīng)度值,同時(shí)檢驗(yàn)是否滿足預(yù)期執(zhí)行的路徑;如果滿足,則進(jìn)入步驟七;否則進(jìn)入步驟六。計(jì)算接近水平適應(yīng)度函數(shù) ApproachLevelFitness,如果 ApproachLevelFitness 為0,則測(cè)試數(shù)據(jù)到達(dá)目標(biāo);然后在目標(biāo)判定處,計(jì)算分支距離BranchFitness,如果 ApproachLevelFitness和BranchFitness都為0,則測(cè)試數(shù)據(jù)達(dá)到MC/DC測(cè)試目標(biāo),否貝>J,iiJi式β白勺;SlSiSMlM,^" ApproachLevelFitness+normalized(BranchFitness), normalized(BranchFitness)表示對(duì)分支距離BranchFitness的標(biāo)準(zhǔn)化,具體的計(jì)算過(guò)程為步驟5. 1 按照步驟二的方法生成MC/DC測(cè)試用例預(yù)期結(jié)果集。步驟5. 2 按照步驟4. 1和步驟4. 2的方法獲得依賴關(guān)系集合,包括控制依賴集和數(shù)據(jù)依賴集。步驟5. 3 針對(duì)每一個(gè)目標(biāo)判定,隨機(jī)生成測(cè)試數(shù)據(jù)Ta和測(cè)試數(shù)據(jù)Tb。步驟5. 4 按照步驟4. 1中的計(jì)算方法,根據(jù)依賴關(guān)系集合,分別計(jì)算測(cè)試數(shù)據(jù)Ta 和測(cè)試數(shù)據(jù)Tb的控制依賴適應(yīng)度函數(shù)和數(shù)據(jù)依賴適應(yīng)度函數(shù)。步驟5. 5 按照步驟4. 3中的計(jì)算方法,分別計(jì)算測(cè)試數(shù)據(jù)Ta和測(cè)試數(shù)據(jù)Tb的分支距離;步驟5. 6 進(jìn)行分支距離的標(biāo)準(zhǔn)化BranchFitness (Ta)normalised,計(jì)算公式為
BvcifichFitness (T)BranchFitnessiTa )normaUsed = --—-γ——
Brancnh itness (Ia) + Brancnh itness (Ib)其中,BranchFitness (Ta)表示測(cè)試數(shù)據(jù)Ta的分支距離,BranchFitness (Tb)表示測(cè)試數(shù)據(jù)Tb的分支距離。步驟5. 7 總適應(yīng)度函數(shù)值Fitness⑴為Fitness (T) = ApproachLevelFitness (T)+BranchFitness (T)normalized其中,ApproachLevelFitness (T)表示測(cè)試數(shù)據(jù)T的接近水平適應(yīng)度函數(shù); BranchFitness(T)normalized表示測(cè)試數(shù)據(jù)T的分支距離的標(biāo)準(zhǔn)化值。步驟5. 8 根據(jù)總適應(yīng)度函數(shù)值比較這兩個(gè)測(cè)試數(shù)據(jù)哪個(gè)更接近于達(dá)到判定目標(biāo)。步驟5. 9 若ApproachLevelFitness 和 BranchFitness 都為 0,則測(cè)試數(shù)據(jù)達(dá)到 MC/DC 測(cè)試目標(biāo),進(jìn)入步驟七,否則,進(jìn)入步驟六。步驟六根據(jù)得到的適應(yīng)度值,使用遺傳算法的選擇、交叉、變異等遺傳操作,生成新的測(cè)試數(shù)據(jù),并返回步驟五,計(jì)算新生成的測(cè)試數(shù)據(jù)的適應(yīng)度值。步驟6. 1 選擇編碼策略,把參數(shù)集合X和域轉(zhuǎn)換為位串結(jié)構(gòu)空間S。采用整型和實(shí)型混合的方式編碼染色體,問(wèn)題的參數(shù)直接轉(zhuǎn)換為染色體上的基因,參數(shù)的個(gè)數(shù)轉(zhuǎn)換為染色體長(zhǎng)度,各參數(shù)的取值區(qū)間映射為各基因的取值范圍,具體過(guò)程如下設(shè)求解問(wèn)題包含η個(gè)輸入變量X1, X2,. . .,Χη,首先,用等價(jià)類劃分和邊界值分析方法處理參數(shù)的值域,其中Yi(l < i < η)表示參數(shù)Xi (1 ^n)可以取值的有限離散點(diǎn)的集合,IYiI表示集合的大小,建立問(wèn)題解空間和染色體空間的映射關(guān)系,染色體表示為X = (X1, X2, . . . , Xn) -C= (C1, C2, ... , Cn) (2)其中,C為染色體空間解空間中的解,X為問(wèn)題空間的解;步驟6.2 設(shè)計(jì)和選擇遺傳操作,包括種群大小,選擇、交叉、變異方法,以及確定交叉概率P。和變異概率Pm等遺傳參數(shù)。步驟6. 2. 1 執(zhí)行排序選擇策略和精英保留策略執(zhí)行排序選擇策略的具體過(guò)程為(a)根據(jù)適應(yīng)值的大小,降序排列種群中的所有個(gè)體;(b)設(shè)計(jì)概率分配表,根據(jù)適應(yīng)值大小,升序分配每個(gè)個(gè)體的概率值;(c)每個(gè)個(gè)體被遺傳到下一代的概率由步驟(b)中分配的概率值決定,再基于這些概率值,用輪盤(pán)賭選擇法選擇被淘汰和被復(fù)制的染色體;經(jīng)過(guò)一輪排序選擇策略后,會(huì)得到一個(gè)新的種群,然后在這個(gè)新的種群基礎(chǔ)上再執(zhí)行精英保留策略,具體過(guò)程為(a)根據(jù)適應(yīng)度函數(shù)值的大小從經(jīng)過(guò)排序選擇策略后得到的新種群即當(dāng)前種群中獲取最佳個(gè)體和最差個(gè)體;(b)如果當(dāng)前種群的最佳個(gè)體的適應(yīng)度高于此前獲得的出現(xiàn)的最佳個(gè)體的適應(yīng)度,則用當(dāng)前群體的最佳個(gè)體替換此前出現(xiàn)的最佳個(gè)體;(c)保持迄今出現(xiàn)的最佳個(gè)體狀態(tài)不變,將其完整的遺傳到下一代種群中。步驟6. 2. 2 交叉操作和變異操作采用自適應(yīng)的交叉概率ρ。和變異概率pm,根據(jù)群體平均適應(yīng)值及當(dāng)前群體最優(yōu)個(gè)體適應(yīng)值來(lái)自動(dòng)調(diào)整交叉概率P。和變異概率Pm ;fmax表示某一代種群中最優(yōu)個(gè)體的適應(yīng)度, Favg表示該代群體的平均適應(yīng)度,最優(yōu)個(gè)體的適應(yīng)度與該代群體的平均適應(yīng)度的差值Δ = f__Favg,則當(dāng)△越小,表示種群個(gè)體之間的適應(yīng)度差別越小,說(shuō)明種群此時(shí)達(dá)到局部最優(yōu)的可能性較大,過(guò)早收斂的可能性也越大;當(dāng)Δ越大,表示個(gè)體之間的適應(yīng)度差別越大,交叉概率P。和變異概率Pm由Δ來(lái)決定,pc和pm的計(jì)算公式為pc = V Δ (3)pm = k2/ Δ (4)其中,Ic1和k2分別為交叉概率調(diào)整系數(shù)和變異概率調(diào)整系數(shù)。
步驟6. 3 隨機(jī)初始化生成種群P。步驟6. 4 計(jì)算種群P中個(gè)體位串解碼后的適應(yīng)度值。步驟6. 5 按照遺傳策略,將步驟6. 2中設(shè)計(jì)的各遺傳操作作用于種群,經(jīng)過(guò)選擇、 交叉和變異后,形成了新一代種群。步驟6. 6 帶著新產(chǎn)生的染色體即測(cè)試數(shù)據(jù)返回步驟五,計(jì)算其適應(yīng)度值,判斷其性能是否滿足指標(biāo),或者是否已完成預(yù)定迭代次數(shù),若不滿足并且沒(méi)有完成迭代次數(shù),則進(jìn)入步驟6. 1,遺傳算法從編碼操作開(kāi)始,對(duì)新產(chǎn)生的種群重新進(jìn)行選擇復(fù)制、交叉和變異,不斷迭代;若滿足指標(biāo)或已完成迭代次數(shù)則直接進(jìn)入步驟七。
步驟七運(yùn)行結(jié)束,得到合適的測(cè)試數(shù)據(jù)。本發(fā)明具有的優(yōu)點(diǎn)在于1、本發(fā)明提出一種基于遺傳算法的MC/DC測(cè)試數(shù)據(jù)自動(dòng)生成方法,針對(duì)遺傳算法中傳統(tǒng)適應(yīng)度函數(shù)僅依靠控制流圖中節(jié)點(diǎn)間的控制依賴關(guān)系,沒(méi)有考慮被測(cè)程序內(nèi)部的數(shù)據(jù)依賴關(guān)系的缺陷,提出使用鏈接法思想收集直接或者通過(guò)數(shù)據(jù)依賴間接影響問(wèn)題節(jié)點(diǎn)遍歷的控制節(jié)點(diǎn),并將其與表征控制依賴關(guān)系見(jiàn)長(zhǎng)的傳統(tǒng)適應(yīng)度函數(shù)相結(jié)合,構(gòu)造一個(gè)新的適應(yīng)度函數(shù),以此來(lái)克服傳統(tǒng)的適應(yīng)度函數(shù)因忽略程序內(nèi)部的數(shù)據(jù)依賴關(guān)系而造成的引導(dǎo)信息缺乏、搜索退化的問(wèn)題。2、本發(fā)明提出一種基于遺傳算法的MC/DC測(cè)試數(shù)據(jù)自動(dòng)生成方法,實(shí)現(xiàn)了基于遺傳算法的滿足MC/DC準(zhǔn)則的測(cè)試數(shù)據(jù)自動(dòng)生成方法,對(duì)邏輯關(guān)系復(fù)雜且安全性要求較高的軟件系統(tǒng)進(jìn)行測(cè)試時(shí)具有很大的實(shí)用價(jià)值。
圖1本發(fā)明提出的基于遺傳算法的MC/DC測(cè)試數(shù)據(jù)自動(dòng)生成方法的流程圖
圖2本發(fā)明中抽象語(yǔ)法樹(shù)的生成過(guò)程流程圖3本發(fā)明中抽象分析樹(shù)的生成過(guò)程流程圖4本發(fā)明中MC/DC測(cè)試用例預(yù)期結(jié)果集生成流程圖5本發(fā)明中代碼插樁流程圖6本發(fā)明中建立控制依賴關(guān)系適應(yīng)度函數(shù)所應(yīng)用的某一程序片段;
圖7本發(fā)明中遺傳算法基本流程圖。
具體實(shí)施例方式下面將結(jié)合附圖對(duì)本發(fā)明進(jìn)行詳細(xì)說(shuō)明。本發(fā)明提出一種基于遺傳算法的MC/DC測(cè)試數(shù)據(jù)自動(dòng)生成方法,該包括抽象語(yǔ)法樹(shù)的生成、抽象分析樹(shù)的生成、MC/DC測(cè)試用例預(yù)期結(jié)果集的生成、代碼插樁、適應(yīng)度函數(shù)的構(gòu)造、遺傳算法設(shè)計(jì)等關(guān)鍵內(nèi)容,具體流程如圖1所示,具體包括以下幾個(gè)步驟步驟一對(duì)被測(cè)程序進(jìn)行靜態(tài)分析,產(chǎn)生控制流圖、數(shù)據(jù)流圖、抽象語(yǔ)法樹(shù)和抽象分析樹(shù)等信息;被測(cè)程序是指將要執(zhí)行測(cè)試的軟件代碼。借助解析工具(如測(cè)試工具Testbed)對(duì)被測(cè)程序進(jìn)行詞法分析、語(yǔ)法分析和語(yǔ)義分析,生成抽象語(yǔ)法樹(shù)。抽象語(yǔ)法樹(shù)是編譯程序在經(jīng)過(guò)語(yǔ)法分析以后得到的源程序的另外一種表示。每一個(gè)語(yǔ)法規(guī)則對(duì)應(yīng)一個(gè)相應(yīng)的處理函數(shù),并作為抽象語(yǔ)法樹(shù)的一個(gè)節(jié)點(diǎn)掛在抽象語(yǔ)法樹(shù)上,提供對(duì)外的接口,它能夠?yàn)橄乱徊降拇a插樁工作做準(zhǔn)備。抽象語(yǔ)法樹(shù)的生成過(guò)程如圖2所示,首先對(duì)被測(cè)程序代碼進(jìn)行詞法分析和語(yǔ)法分析。詞法分析提供了抽象語(yǔ)法樹(shù)所需要的符號(hào)結(jié)點(diǎn),如常量和名字;語(yǔ)法分析則提供了含有代表相應(yīng)語(yǔ)法結(jié)構(gòu)的中間結(jié)點(diǎn)的抽象語(yǔ)法樹(shù);然后對(duì)被測(cè)程序代碼進(jìn)行語(yǔ)義分析,對(duì)名字、 符號(hào)等進(jìn)行的處理,將語(yǔ)法樹(shù)轉(zhuǎn)變?yōu)橐环N包括表示類型信息和符號(hào)表的標(biāo)準(zhǔn)形式,并將它們連接成樹(shù)形結(jié)構(gòu),最終得到抽象語(yǔ)法樹(shù)。在代碼解析過(guò)程中,借助于工具Flex和Bison 完成被測(cè)程序代碼的抽象語(yǔ)法樹(shù)的建立過(guò)程。通過(guò)訪問(wèn)已建立的抽象語(yǔ)法樹(shù),收集判定語(yǔ)句子樹(shù),同時(shí),用大寫(xiě)字母表示關(guān)系表達(dá)式,新生成的子樹(shù)被稱為抽象分析樹(shù)。每一個(gè)判定都有一個(gè)表示其邏輯結(jié)構(gòu)的抽象分析樹(shù)。解析工具在生成抽象分析樹(shù)后自動(dòng)生成控制流圖和數(shù)據(jù)流圖。被測(cè)程序片段為“if (χ > y&&x >z||x> y+z)”;圖2為被測(cè)程序片段生成的抽象語(yǔ)法樹(shù);圖3表示從抽象語(yǔ)法樹(shù)中提取出來(lái)的抽象分析樹(shù),其中,AND和OR為條件節(jié)點(diǎn), A、B、C稱為抽象分析樹(shù)的葉子。步驟二 生成MC/DC測(cè)試用例預(yù)期結(jié)果集;抽象分析樹(shù)構(gòu)成了生成MC/DC測(cè)試用例預(yù)期結(jié)果集的輸入。抽象分析樹(shù)中的每一個(gè)節(jié)點(diǎn)都會(huì)被分配一個(gè)布爾值和一個(gè)布爾變量評(píng)價(jià),用布爾變量評(píng)價(jià)來(lái)識(shí)別是否已經(jīng)計(jì)算過(guò)該節(jié)點(diǎn)的布爾值。以被測(cè)程序片段“if (χ > y&&x >z||x> y+z)”為范例,介紹MC/DC 測(cè)試用例預(yù)期結(jié)果集的生成過(guò)程,如圖4。具體步驟如下步驟2. 1 從抽象分析樹(shù)中提出條件節(jié)點(diǎn),這些條件節(jié)點(diǎn)構(gòu)成了抽象分析樹(shù)的葉子。每一個(gè)葉子就是一個(gè)變量,用N表示提取的葉子變量的個(gè)數(shù);如圖5,程序片段if(x > y&&x > ζ I I χ > y+z)葉子變量為 3,即 N = 3。步驟2. 2 構(gòu)建真值表,對(duì)N個(gè)葉子變量,有2n種排列組合;如圖5,被測(cè)程序片段 "if (x > y&&x > ζ |χ> y+z),,的真值表有8種組合方式。步驟2. 3 用數(shù)字0和1填充真值表;步驟2. 4 針對(duì)真值表中的每一行步驟2. 4. 1 將真值表當(dāng)前行中的布爾值對(duì)應(yīng)分配給抽象分析樹(shù)的每一個(gè)葉子變量;如圖5中,真值表中第四行A = 0,B= UC= 1,將其分別分配給抽象分析樹(shù)的葉子變量。步驟2. 4. 2 自底向上評(píng)價(jià)各個(gè)條件節(jié)點(diǎn)的布爾值,直到抽象分析樹(shù)的頂端。最終所得的抽象分析樹(shù)的頂端的條件節(jié)點(diǎn)的布爾值就是這個(gè)判定語(yǔ)句的輸出結(jié)果值;如圖5, 真值表中第五行A = 0,B = 1、C = 1,則A&&B為真,A&&B | | C為真,因此,該行判定的最終輸出為真。(3)用輸出結(jié)果值填充真值表的輸出列。通過(guò)以上步驟,完成某一給定判定語(yǔ)句(被測(cè)程序)的真值表的建立。然后開(kāi)始提取測(cè)試用例??紤]到MC/DC的特點(diǎn),針對(duì)每一個(gè)葉子變量,需要尋找能體現(xiàn)葉子變量獨(dú)立影響判定結(jié)果的兩行。步驟2. 5 針對(duì)每一個(gè)葉子變量,尋找其測(cè)試用例,并添加到每個(gè)葉子變量的MC/ DC測(cè)試用例集中步驟2. 5. 1 為每一個(gè)葉子變量建立一對(duì)空的MC/DC測(cè)試用例集;步驟2. 5. 2 在真值表中,尋找其他葉子變量值固定,只有目標(biāo)葉子變量改變的兩個(gè)行,如圖5,當(dāng)目標(biāo)葉子變量為A時(shí),取葉子變量B和C變量值固定的兩行,可取第三行和第七行,其中葉子變量B和C固定,只有目標(biāo)葉子變量A改變;步驟2. 5. 3 比較步驟2. 5. 2中的兩行的輸出結(jié)果值(由各自行的條件節(jié)點(diǎn)的輸出結(jié)果值組成),如果兩行的輸出結(jié)果值不同,則這兩行就是目標(biāo)葉子變量的一對(duì)測(cè)試用例,并且該測(cè)試用例是有效的,因?yàn)樗鼈冿@示了目標(biāo)葉子變量的影響作用,將這兩行以成對(duì)的形式添加到步驟(1)中建立的MC/DC測(cè)試用例集中。如圖4,目標(biāo)變量為A時(shí),第三行為(010),第七行為(110),由真值表可知,第三行的輸出為0,第七行的輸出為1,比較這兩行的輸出值,不相同,則(010)和(110)就是變量A 的一對(duì)測(cè)試用例,并且該測(cè)試用例是有效的,已成對(duì)的形式,添加到葉子變量A的測(cè)試用例集中。其他葉子變量作為目標(biāo)葉子變量,尋找其測(cè)試用例的方法與上述的葉子變量A作為目標(biāo)葉子變量的尋找方法相同,并添加到每個(gè)葉子變量的MC/DC測(cè)試用例集中。步驟2.6 將每一個(gè)葉子變量的MC/DC測(cè)試用例集合并,得到測(cè)試用例集,并最小化測(cè)試用例集。該測(cè)試用例集就是使用遺傳算法搜索所要實(shí)現(xiàn)的目標(biāo)用例集。如圖4,葉子變量A、B、C的測(cè)試用例集分別為(010,110),(100,110),(000,001, 010,011,100,101),最小化該測(cè)試用例集,得到(010,100,110,101),這組測(cè)試用例集滿足每一個(gè)葉子變量的MC/DC測(cè)試用例集覆蓋要求。步驟三對(duì)被測(cè)程序進(jìn)行代碼插樁;程序插樁是測(cè)試數(shù)據(jù)自動(dòng)生成過(guò)程的步驟之一。在測(cè)試過(guò)程中,測(cè)試結(jié)果數(shù)據(jù)的獲取和記錄都是通過(guò)程序插樁完成的。主要過(guò)程是在保持被測(cè)程序原有邏輯完整性的基礎(chǔ)上插入檢查語(yǔ)句,當(dāng)被測(cè)程序運(yùn)行時(shí),通過(guò)檢查語(yǔ)句的執(zhí)行采集程序的運(yùn)行特征數(shù)據(jù)。分析這些特征數(shù)據(jù),可以獲得程序的邏輯覆蓋等動(dòng)態(tài)信息,并由此完成個(gè)體適應(yīng)值的計(jì)算。其具體過(guò)程如圖5,抽象語(yǔ)法樹(shù)(AST)生成后,首先遍歷抽象語(yǔ)法樹(shù)(AST)找到插樁的位置,判斷是否是插樁點(diǎn),如果不是插樁點(diǎn),返回繼續(xù)遍歷抽象語(yǔ)法樹(shù)尋找找到插樁位置;如果是插樁點(diǎn),則植入檢查語(yǔ)句(探針),然后直接在抽象語(yǔ)法樹(shù)上以子樹(shù)的形式植入代碼的語(yǔ)法樹(shù)片段,判斷插樁是否完成,如已完成,則被測(cè)程序編譯運(yùn)行;如未完成,返回繼續(xù)遍歷抽象語(yǔ)法樹(shù)(AST)找到插樁的位置,直至完成插樁。步驟四構(gòu)造適應(yīng)度函數(shù);適應(yīng)度函數(shù)是遺傳算法與實(shí)際問(wèn)題的唯一接口,是種群中個(gè)體優(yōu)劣的一種量化反映,它的構(gòu)造直接影響問(wèn)題求解的效率。傳統(tǒng)的適應(yīng)度函數(shù)f(X)由兩個(gè)部分組成f(χ) = approachlevel+branchdistance第一部分approachlevel體現(xiàn)的是控制依賴關(guān)系,通常被稱為接近水平。第二部分branchdistance被稱為分支距離,它克服了只使用接近水平進(jìn)行適應(yīng)評(píng)價(jià)的局限性,分支距離衡量了在當(dāng)前輸入測(cè)試數(shù)據(jù)的基礎(chǔ)上距離滿足目標(biāo)或是滿足偏離分支的逼近程度。在MC/DC測(cè)試數(shù)據(jù)的生成這一實(shí)際問(wèn)題上,本發(fā)明的目標(biāo)是最終找到滿足指定目標(biāo)的MC/DC的測(cè)試數(shù)據(jù)。本發(fā)明充分利用鏈接法在表征測(cè)試數(shù)據(jù)依賴關(guān)系方面的優(yōu)勢(shì),使用鏈接法思想收集直接或者通過(guò)測(cè)試數(shù)據(jù)依賴間接影響問(wèn)題條件節(jié)點(diǎn)遍歷的控制節(jié)點(diǎn),并將其與表征控制依賴關(guān)系見(jiàn)長(zhǎng)的傳統(tǒng)適應(yīng)度函數(shù)相結(jié)合,構(gòu)造新的適應(yīng)度函數(shù),以此來(lái)克服傳統(tǒng)的適應(yīng)度函數(shù)因忽略程序內(nèi)部的數(shù)據(jù)依賴關(guān)系而造成的引導(dǎo)信息缺乏、搜索退化的問(wèn)題。具體來(lái)說(shuō),構(gòu)造適應(yīng)度函數(shù)從建立控制依賴關(guān)系適應(yīng)度函數(shù)、數(shù)據(jù)依賴關(guān)系適應(yīng)度和分支適應(yīng)度三點(diǎn)因素對(duì)適應(yīng)度函數(shù)三個(gè)方面進(jìn)行設(shè)計(jì)。步驟4. 1 建立控制依賴關(guān)系適應(yīng)度函數(shù)步驟4. 1. 1 通過(guò)被測(cè)程序的控制流圖,獲得每一個(gè)判定的控制依賴關(guān)系集合;控制依賴用來(lái)描述一個(gè)目標(biāo)節(jié)點(diǎn)y的執(zhí)行關(guān)于其前面分支節(jié)點(diǎn)輸出的依賴性,當(dāng)每一條從目標(biāo)節(jié)點(diǎn)y到出口節(jié)點(diǎn)e的路徑都包含節(jié)點(diǎn)ζ時(shí),稱節(jié)點(diǎn)ζ被目標(biāo)節(jié)點(diǎn)y后置控制;設(shè)χ為一個(gè)任意節(jié)點(diǎn),兩個(gè)節(jié)點(diǎn)(y,x)之間可以構(gòu)成一個(gè)分支路徑,當(dāng)每一條從目標(biāo)節(jié)點(diǎn)y到出口節(jié)點(diǎn)e的通過(guò)分支(y,X)的路徑都包括節(jié)點(diǎn)Z時(shí),稱節(jié)點(diǎn)Z后置控制一個(gè)分支(y,X);當(dāng)節(jié)點(diǎn) Z后置控制y的一個(gè)分支,并且Z不后置控制y,則稱節(jié)點(diǎn)Z控制依賴于目標(biāo)節(jié)點(diǎn)y。控制依賴關(guān)系是從結(jié)構(gòu)關(guān)系角度衡量當(dāng)前輸入測(cè)試數(shù)據(jù)距離抵達(dá)目標(biāo)的逼近程度,它是通過(guò)控制流圖中目標(biāo)與執(zhí)行偏離條件節(jié)點(diǎn)間的關(guān)鍵節(jié)點(diǎn)計(jì)算得到。如某被測(cè)程序片段的控制流圖如圖6所示。從圖中可以看出,第16行的判定依賴于第12行的判定取真和第13行的判定取假,由此認(rèn)為16行的目標(biāo)判定依賴于經(jīng)過(guò)12、 13行的控制流,這些節(jié)點(diǎn)被稱為臨界分支,因?yàn)樗麄儧Q定控制流流向或者遠(yuǎn)離目標(biāo)。因此, 第16行判定的控制依賴關(guān)系集包含第12、13行的判定,也就是說(shuō),為達(dá)到目標(biāo)節(jié)點(diǎn),必須依次執(zhí)行這些分支節(jié)點(diǎn),并且這些節(jié)點(diǎn)的輸出必須是特定的??梢缘玫娇刂埔蕾囮P(guān)系集 ControlDep (16) = {12,-13},正數(shù)表示需要執(zhí)行真分支,負(fù)數(shù)表示需要執(zhí)行假分支。步驟4. 1. 2 建立控制依賴關(guān)系適應(yīng)度函數(shù)。建立起控制依賴關(guān)系集合后,搜索判斷哪一個(gè)測(cè)試用例執(zhí)行了最多的控制節(jié)點(diǎn)數(shù)目,例如圖6中,一個(gè)在13行偏離的測(cè)試數(shù)據(jù)比一個(gè)在12行偏離的測(cè)試數(shù)據(jù)更接近于目標(biāo)。這時(shí)就需要一個(gè)評(píng)價(jià)函數(shù)用來(lái)判斷哪一個(gè)測(cè)試數(shù)據(jù)能使執(zhí)行流更接近于目標(biāo),這樣就建立控制依賴關(guān)系適應(yīng)度函數(shù)??刂埔蕾囮P(guān)系適應(yīng)度函數(shù)包含了控制依賴關(guān)系集合中各分支節(jié)點(diǎn)的目標(biāo)函數(shù)。建立控制依賴關(guān)系適應(yīng)度函數(shù)如下式所示。
ControlDqps^tta d e ρ ef n s e(1)其中,dependentdecision為目標(biāo)的控制依賴關(guān)系集合中的控制節(jié)點(diǎn)數(shù); executeddecisions表示以當(dāng)前測(cè)試數(shù)據(jù)為輸入;ControlD印Fittestdata表示控制依賴關(guān)系適應(yīng)度函數(shù)。如果控制依賴關(guān)系適應(yīng)度函數(shù)值為0,則說(shuō)明測(cè)試數(shù)據(jù)能夠到達(dá)目標(biāo)判定;如果控制依賴關(guān)系適應(yīng)度函數(shù)值大于0,就說(shuō)明測(cè)試數(shù)據(jù)在某處偏離了目標(biāo)節(jié)點(diǎn),可以通過(guò)控制依賴關(guān)系適應(yīng)度函數(shù)的值,精確地得到是在目標(biāo)判定前的哪一個(gè)控制節(jié)點(diǎn)偏離出去的,稱該點(diǎn)為偏離節(jié)點(diǎn)divergecLp以圖6為例,某輸入數(shù)據(jù)使執(zhí)行流在12行偏離,則有控制依賴關(guān)系適應(yīng)度函數(shù)值為2-0 = 2 ;但如果在12行執(zhí)行真分支,而在13行偏離,那么控制依賴關(guān)系適應(yīng)度函數(shù)值就為2-1 = 1。這樣,根據(jù)測(cè)試數(shù)據(jù)各自相對(duì)于目標(biāo)判定的接近水平, 就能夠?qū)ζ溥M(jìn)行區(qū)分,并且將搜索引導(dǎo)向最為接近的測(cè)試數(shù)據(jù)。步驟4. 2 建立數(shù)據(jù)依賴關(guān)系適應(yīng)度函數(shù)在計(jì)算依賴關(guān)系上,本發(fā)明的重點(diǎn)在于通過(guò)插入控制依賴關(guān)系和數(shù)據(jù)依賴關(guān)系來(lái)改進(jìn)由接近水平適應(yīng)度向搜索提供的引導(dǎo)。這種對(duì)接近水平的擴(kuò)展,包含了數(shù)據(jù)依賴關(guān)系, 將搜索向更有希望的搜索區(qū)域的搜索引導(dǎo)。本發(fā)明旨在克服謂詞中使用flag變量或者代碼謂詞間有強(qiáng)烈的數(shù)據(jù)依賴關(guān)系時(shí)存在的引導(dǎo)缺乏和平面搜索的問(wèn)題。獲取數(shù)據(jù)依賴關(guān)系適應(yīng)度函數(shù)方法步驟如下定義pn為問(wèn)題節(jié)點(diǎn),S為用來(lái)儲(chǔ)存一個(gè)給定節(jié)點(diǎn)的依賴關(guān)系的集合,以pn和S作為獲取數(shù)據(jù)依賴關(guān)系適應(yīng)度函數(shù)方法的輸入。DepSets用來(lái)儲(chǔ)存當(dāng)前搜集到的存在依賴關(guān)系的節(jié)點(diǎn)集合,PV用來(lái)存儲(chǔ)問(wèn)題節(jié)點(diǎn)使用的變量。S和DepSets被初始化為空集。獲取一個(gè)節(jié)點(diǎn)S的依賴關(guān)系適應(yīng)度函數(shù)的方法如下
步驟4. 2. 1 獲取問(wèn)題節(jié)點(diǎn)pn的控制依賴關(guān)系集合ControlD印(pn)賦給S,并將 pn使用的變量UsedVariables (pn)加到PV中;步驟4. 2. 2 對(duì)于PV中的每一個(gè)變量pv,獲取pv的最后定義集合IastDefs ;(a)對(duì)于IastDefs中每一個(gè)最后定義ld,獲取Id的控制依賴關(guān)系集合 ControlDep (Id),并將其與S合并,得到擴(kuò)展的S,然后將Id使用的變量UsedVariables (Id) 添加到一個(gè)新建的PVnew中;(b)對(duì)于ControlD印(Id)中的每一個(gè)控制節(jié)點(diǎn)cd,獲取它使用的變量 UsedVariables (Id),并添加到步驟(a)中建立的PVnew集合中。步驟4. 2. 3 對(duì)于PV中的每一個(gè)變量pv,迭代獲取PV依賴關(guān)系集S (Id)。首先獲得PV中的第一個(gè)變量,獲取其依賴關(guān)系集S (Id),返回步驟4. 2. 2,然后獲取PV中的下一個(gè)變量,直至完成PV中所有的變量,結(jié)束迭代,并將S(Id)添加到D印Sets中。步驟4. 2. 4 建立一個(gè)用于定義適應(yīng)度函數(shù)的依賴關(guān)系集合定義D印Fit為適應(yīng)度函數(shù)依賴關(guān)系集合,對(duì)于D印Sets中的每一個(gè)子集Si (a)添加 Si 到 D印Fit 中;(b)判斷D印Sets中每一個(gè)非Si的子集Sj,與Si是否存在then、else的分支沖突,如果不存在則合并兩個(gè)子集Si、Sj,得到新的子集Siij,并將Siij添加到D印Fit中;如果存在then、else的分支沖突則不能合并,將Si、Sj都添加到D印Fit中。步驟4. 2. 5 建立數(shù)據(jù)依賴關(guān)系適應(yīng)度函數(shù)建立起數(shù)據(jù)依賴關(guān)系集合后,用計(jì)算控制依賴關(guān)系適應(yīng)度函數(shù)的方法得到數(shù)據(jù)依賴關(guān)系適應(yīng)度函數(shù),其計(jì)算方法與計(jì)算控制依賴關(guān)系適應(yīng)度函數(shù)的方法相同。步驟4.3 計(jì)算分支距離當(dāng)測(cè)試數(shù)據(jù)抵達(dá)目標(biāo)時(shí),用分支距離來(lái)度量測(cè)試數(shù)據(jù)是否滿足測(cè)試用例,即通過(guò)計(jì)算分支距離度量測(cè)試數(shù)據(jù)距離期望測(cè)試用例的逼近程度。如果測(cè)試數(shù)據(jù)到達(dá)目標(biāo)判定, 但是不滿足任一個(gè)MC/DC測(cè)試用例,那么每一個(gè)測(cè)試數(shù)據(jù)的接近水平都為0,但分支距離不為O ;如果測(cè)試抵達(dá)目標(biāo)并實(shí)現(xiàn)一個(gè)測(cè)試用例,那么它的分支距離和接近水平都為O ;計(jì)算出來(lái)的分支距離的大小用來(lái)評(píng)價(jià)哪一個(gè)測(cè)試數(shù)據(jù)更接近于滿足期望的分支測(cè)試用例。一個(gè)判定的分支距離是基于這個(gè)判定的結(jié)構(gòu)來(lái)計(jì)算的(1)若判定的結(jié)構(gòu)中含有a = = b表達(dá)式,當(dāng)a = = b為真時(shí),分支距離的計(jì)算公式為abs(a-b);當(dāng)a== b為假時(shí),分支距離的計(jì)算公式為a== b k:0 ;(2)若判定的結(jié)構(gòu)中含有a Φ b表達(dá)式,當(dāng)a興b為真時(shí),分支距離的計(jì)算公式為 a ! = b ? k:0;當(dāng)a乒b為假時(shí),分支距離的計(jì)算公式為a ! = b ? abs(a-b) :0 ;(3)若判定的結(jié)構(gòu)中含有a < b表達(dá)式,當(dāng)a < b為真時(shí),分支距離的計(jì)算公式為 a<b ? 0:a-b+k;當(dāng)a<b為假時(shí),分支距離的計(jì)算公式為a<b ? a-b+k:0 ;(4)若判定的結(jié)構(gòu)中含有a < = b表達(dá)式,當(dāng)a < = b為真時(shí),分支距離的計(jì)算公式為a<=b 0:a-b ;當(dāng)a<=b為假時(shí),分支距離的計(jì)算公式為a<=b ? a-b+k:0 ;(5)若判定的結(jié)構(gòu)中含有a > b表達(dá)式,當(dāng)a > b為真時(shí),分支距離的計(jì)算公式為 a>b ? 0:a-b;當(dāng)a>b為假時(shí),分支距離的計(jì)算公式為a>b a-b+k:0 ;(6)若判定的結(jié)構(gòu)中含有a > = b表達(dá)式,當(dāng)a > = b為真時(shí),分支距離的計(jì)算公式為a>=b 0:a-b ;當(dāng)a>=b為假時(shí),分支距離的計(jì)算公式為a>=b ? a-b+k:0 ;
(7)若判定的結(jié)構(gòu)中含有a| |b表達(dá)式,當(dāng)a| |b為真時(shí),分支距離的計(jì)算公式為 min[fit(a),fit(b)];當(dāng)a | | b為假時(shí),分支距離的計(jì)算公式為fit (a)+fit (b);(8)若判定的結(jié)構(gòu)中含有a&&b表達(dá)式,當(dāng)a&&b為真時(shí),分支距離的計(jì)算公式為 fit (a)+fit (b);當(dāng)a&&b為假時(shí),分支距離的計(jì)算公式為max [fit (a),fit (b)];在嘗試達(dá)到測(cè)試用例時(shí),需要比較接近于完成測(cè)試用例的測(cè)試數(shù)據(jù)的逼近程度, 而不是測(cè)試數(shù)據(jù)本身,所以分支距離經(jīng)常是一個(gè)正值。在嘗試達(dá)到測(cè)試用例時(shí),比較接近于完成測(cè)試用例的測(cè)試數(shù)據(jù)的逼近程度,而不是測(cè)試數(shù)據(jù)本身。因此,一個(gè)負(fù)的適應(yīng)的函數(shù)值不會(huì)給搜索增加任何有價(jià)值的信息,所以返回一個(gè)函數(shù)值的絕對(duì)值??偟姆种Ь嚯x為判定中每一個(gè)條件的分支距離的累加。步驟五在有效的MC/DC測(cè)試用例、適應(yīng)度函數(shù)公式和執(zhí)行插樁代碼的基礎(chǔ)上,隨機(jī)產(chǎn)生測(cè)試數(shù)據(jù),并在這些測(cè)試數(shù)據(jù)上執(zhí)行插樁后的被測(cè)程序,獲得適應(yīng)度值,同時(shí)檢驗(yàn)是否滿足預(yù)期執(zhí)行的目標(biāo)路徑(即指測(cè)試數(shù)據(jù)是否到達(dá)目標(biāo));如果是,則進(jìn)入步驟七;否則進(jìn)入步驟六;計(jì)算接近水平適應(yīng)度函數(shù) ApproachLevelFitness,如果 ApproachLevelFitness 為0,則測(cè)試數(shù)據(jù)到達(dá)目標(biāo);然后在目標(biāo)判定處,計(jì)算分支距離BranchFitness。如果 ApproachLevelFitness和BranchFitness都為0,則測(cè)試數(shù)據(jù)達(dá)到MC/DC測(cè)試目標(biāo)。否貝>J,iiJi式β白勺;SlSiSMlM,^" ApproachLevelFitness+normalized(BranchFitness), normalized (BranchFitness)表示對(duì)分支距離BranchFitness的標(biāo)準(zhǔn)化,它的值在O至Ij 1之間。具體的計(jì)算過(guò)程包括以下幾個(gè)步驟步驟5. 1 按照步驟二的方法生成MC/DC測(cè)試用例預(yù)期結(jié)果集;步驟5. 2 按照步驟4. 1和步驟4. 2的方法獲得依賴關(guān)系集合,包括控制依賴集和數(shù)據(jù)依賴集;步驟5. 3 針對(duì)每一個(gè)目標(biāo)判定,隨機(jī)生成2個(gè)測(cè)試數(shù)據(jù)Ta和Tb ;步驟5.4 按照步驟4. 1中的計(jì)算方法,根據(jù)依賴關(guān)系集合,分別計(jì)算2個(gè)測(cè)試數(shù)據(jù)的控制依賴適應(yīng)度函數(shù)和數(shù)據(jù)依賴適應(yīng)度函數(shù);步驟5.5 按照步驟4.3中的計(jì)算方法,分別計(jì)算2個(gè)測(cè)試數(shù)據(jù)的分支距離;步驟5.6 進(jìn)行分支距離的標(biāo)準(zhǔn)化BranchFitness (Ta)nmialised,計(jì)算公式為
權(quán)利要求
1. 一種基于遺傳算法的MC/DC測(cè)試數(shù)據(jù)自動(dòng)生成方法,其特征在于包括以下幾個(gè)步驟步驟一對(duì)被測(cè)程序進(jìn)行靜態(tài)分析,產(chǎn)生控制流圖、數(shù)據(jù)流圖、抽象語(yǔ)法樹(shù)和抽象分析樹(shù);步驟二 生成MC/DC測(cè)試用例預(yù)期結(jié)果集;步驟2. 1 從抽象分析樹(shù)中提出條件節(jié)點(diǎn),這些條件節(jié)點(diǎn)構(gòu)成了抽象分析樹(shù)的葉子,每一個(gè)葉子就是一個(gè)變量,用N表示提取的葉子變量的個(gè)數(shù); 步驟2. ·2 構(gòu)建真值表,對(duì)N個(gè)葉子變量,有2n種排列組合; 步驟2. 3 用數(shù)字0和1填充真值表; 步驟2. 4 針對(duì)真值表中的每一行步驟2. 4. 1 將真值表當(dāng)前行中的布爾值對(duì)應(yīng)分配給抽象分析樹(shù)的每一個(gè)葉子變量; 步驟2. 4. 2 自底向上評(píng)價(jià)各個(gè)條件節(jié)點(diǎn)的布爾值,直到抽象分析樹(shù)的頂端,最終所得的抽象分析樹(shù)的頂端的條件節(jié)點(diǎn)的布爾值就是這個(gè)判定語(yǔ)句的輸出結(jié)果值; 步驟2. 4. 3 用輸出結(jié)果值填充真值表的輸出列;步驟2. 5 針對(duì)每一個(gè)葉子變量,尋找其測(cè)試用例,并添加到每個(gè)葉子變量的MC/DC測(cè)試用例集中步驟2. 5. 1 為每一個(gè)葉子變量建立一對(duì)空的MC/DC測(cè)試用例集; 步驟2. 5. 2 在真值表中,尋找其他葉子變量值固定,只有目標(biāo)葉子變量改變的兩行; 步驟2. 5. 3 比較步驟2. 5. 2中的兩行的輸出結(jié)果值,如果兩行的輸出結(jié)果值不同,則這兩行就是目標(biāo)葉子變量的一對(duì)測(cè)試用例,將這兩行以成對(duì)的形式添加到步驟2. 5. 1中建立的MC/DC測(cè)試用例集中;步驟2. 6 將每一個(gè)葉子變量的MC/DC測(cè)試用例集合并,得到測(cè)試2.用例集,并最小化測(cè)試用例集;步驟三對(duì)被測(cè)程序進(jìn)行代碼插樁;首先遍歷抽象語(yǔ)法樹(shù)找到插樁的位置,判斷是否是插樁點(diǎn),如果不是插樁點(diǎn),返回繼續(xù)遍歷抽象語(yǔ)法樹(shù)尋找找到插樁位置;如果是插樁點(diǎn),則植入檢查語(yǔ)句,然后直接在抽象語(yǔ)法樹(shù)上以子樹(shù)的形式植入代碼的語(yǔ)法樹(shù)片段,判斷插樁是否完成,如已完成,則被測(cè)程序編譯運(yùn)行;如未完成,返回繼續(xù)遍歷抽象語(yǔ)法樹(shù)找到插樁的位置,直至完成插樁; 步驟四構(gòu)造適應(yīng)度函數(shù); 步驟4. 1 建立控制依賴關(guān)系適應(yīng)度函數(shù)步驟4. 1. 1 通過(guò)被測(cè)程序的控制流圖,獲得每一個(gè)判定的控制依賴關(guān)系集合;控制依賴用來(lái)描述一個(gè)目標(biāo)節(jié)點(diǎn)y的執(zhí)行關(guān)于其前面分支節(jié)點(diǎn)輸出的依賴性,當(dāng)每一條從目標(biāo)節(jié)點(diǎn)y到出口節(jié)點(diǎn)e的路徑都包含節(jié)點(diǎn)ζ時(shí),稱節(jié)點(diǎn)ζ被目標(biāo)節(jié)點(diǎn)y后置控制;任意節(jié)點(diǎn)χ, 兩個(gè)節(jié)點(diǎn)(y,χ)之間可以構(gòu)成一個(gè)分支路徑,當(dāng)每一條從目標(biāo)節(jié)點(diǎn)y到出口節(jié)點(diǎn)e的通過(guò) (y,χ)分支路徑都包括節(jié)點(diǎn)ζ時(shí),稱節(jié)點(diǎn)ζ后置控制一個(gè)分支(y,χ);當(dāng)節(jié)點(diǎn)ζ后置控制y 的一個(gè)分支,且節(jié)點(diǎn)ζ不后置控制節(jié)點(diǎn)1,稱節(jié)點(diǎn)ζ控制依賴于目標(biāo)節(jié)點(diǎn)1,控制依賴關(guān)系是從結(jié)構(gòu)關(guān)系角度衡量當(dāng)前輸入測(cè)試數(shù)據(jù)距離抵達(dá)目標(biāo)的逼近程度,通過(guò)控制流圖中目標(biāo)與執(zhí)行偏離條件節(jié)點(diǎn)間的關(guān)鍵節(jié)點(diǎn)計(jì)算得到;步驟4. 1. 2 建立控制依賴關(guān)系適應(yīng)度函數(shù)控制依賴關(guān)系適應(yīng)度函數(shù)包含了控制依賴關(guān)系集合中各分支節(jié)點(diǎn)的目標(biāo)函數(shù),建立控制依賴關(guān)系適應(yīng)度函數(shù)為ControlD 兮 pj志 tta depe^ smns e(1)其中,cbpendent—為目標(biāo)的控制依賴關(guān)系集合中的控制節(jié)點(diǎn)數(shù);eXeCutedde。isi。ns 表示以當(dāng)前測(cè)試數(shù)據(jù)為輸入;ControlD印Fittestdata表示控制依賴關(guān)系適應(yīng)度函數(shù);如果控制依賴關(guān)系適應(yīng)度函數(shù)值為0,則測(cè)試數(shù)據(jù)能夠到達(dá)目標(biāo)判定;如果控制依賴關(guān)系適應(yīng)度函數(shù)值大于0,則測(cè)試數(shù)據(jù)在某處偏離了目標(biāo)節(jié)點(diǎn),通過(guò)控制依賴關(guān)系適應(yīng)度函數(shù)的值,得到偏離節(jié)點(diǎn)ClivergecLde ;步驟4. 2 建立數(shù)據(jù)依賴關(guān)系適應(yīng)度函數(shù)定義Pn為問(wèn)題節(jié)點(diǎn),S為用來(lái)儲(chǔ)存一個(gè)給定節(jié)點(diǎn)的依賴關(guān)系的集合,以pn和S作為獲取數(shù)據(jù)依賴關(guān)系適應(yīng)度函數(shù)方法的輸入,DepSets用來(lái)儲(chǔ)存當(dāng)前搜集到的存在依賴關(guān)系的節(jié)點(diǎn)集合,PV用來(lái)存儲(chǔ)問(wèn)題節(jié)點(diǎn)使用的變量,S和DepSets被初始化為空集,獲取一個(gè)節(jié)點(diǎn) S的依賴關(guān)系適應(yīng)度函數(shù)的方法為步驟4. 2. 1 獲取問(wèn)題節(jié)點(diǎn)pn的控制依賴關(guān)系集合ControlDep (pn)賦給S,并將pn使用的變量UsedVariables (pn)加到PV中;步驟4. 2. 2 對(duì)于PV中的每一個(gè)變量pv,獲取pv的最后定義集合IastDefe ;(a)對(duì)于IastDefs中每一個(gè)最后定義ld,獲取Id的控制依賴關(guān)系集合 ControlDep (Id),并將其與S合并,得到擴(kuò)展的S,然后將Id使用的變量UsedVariables (Id) 添加到一個(gè)新建的PVnew中;(b)對(duì)于Contr0IDep(Id)中的每一個(gè)控制節(jié)點(diǎn)cd,獲取它使用的變量 UsedVariables (Id),并添加到步驟4. 2. 2 (a)建立的PVnew集合中;步驟4. 2. 3 對(duì)于PV中的每一個(gè)變量pv,迭代獲取PV依賴關(guān)系集S (Id),首先獲得PV 中的第一個(gè)變量,獲取其依賴關(guān)系集S (Id),返回步驟4. 2. 2,然后獲取PV中的下一個(gè)變量, 直至完成PV中所有的變量,結(jié)束迭代,并將S (Id)添加到D印Sets中; 步驟4. 2. 4 建立用于定義適應(yīng)度函數(shù)的依賴關(guān)系集合 定義D印Fit為適應(yīng)度函數(shù)依賴關(guān)系集合,對(duì)于D印Sets中的每一個(gè)子集Si (a)添加Si到D印Fit中;(b)判斷D印Sets中每一個(gè)非Si的子集~,與Si是否存在then、else的分支沖突,如果不存在,則合并兩個(gè)子集Si、Sj,得到新的子集Siij,并將Siij添加到D印Fit中;如果存在 then、else的分支沖突則不能合并,將Si、Sj都添加到D印Fit中;步驟4. 2. 5 建立數(shù)據(jù)依賴關(guān)系適應(yīng)度函數(shù)建立數(shù)據(jù)依賴關(guān)系集合后,用計(jì)算控制依賴關(guān)系適應(yīng)度函數(shù)的方法得到數(shù)據(jù)依賴關(guān)系適應(yīng)度函數(shù);步驟4. 3 建立分支適應(yīng)度函數(shù)當(dāng)測(cè)試數(shù)據(jù)抵達(dá)目標(biāo)時(shí),用分支距離來(lái)度量測(cè)試數(shù)據(jù)是否滿足期望測(cè)試用例,通過(guò)計(jì)算分支距離度量測(cè)試數(shù)據(jù)距離期望測(cè)試用例的逼近程度,如果測(cè)試數(shù)據(jù)到達(dá)目標(biāo)判定,但是不滿足任一個(gè)MC/DC測(cè)試用例,那么每一個(gè)測(cè)試數(shù)據(jù)的接近水平都為0,但分支距離不為 O ;如果測(cè)試抵達(dá)目標(biāo)并實(shí)現(xiàn)一個(gè)測(cè)試用例,那么它的分支距離和接近水平都為O ;計(jì)算出來(lái)的分支距離的大小用來(lái)評(píng)價(jià)哪一個(gè)測(cè)試數(shù)據(jù)更接近于滿足期望的分支測(cè)試用例;步驟五在MC/DC測(cè)試用例、適應(yīng)度函數(shù)公式和執(zhí)行插樁代碼的基礎(chǔ)上,隨機(jī)產(chǎn)生測(cè)試數(shù)據(jù),并在這些測(cè)試數(shù)據(jù)上執(zhí)行插樁后的被測(cè)程序,獲得適應(yīng)度值,同時(shí)檢驗(yàn)是否滿足預(yù)期執(zhí)行的路徑;如果滿足,則進(jìn)入步驟七;否則進(jìn)入步驟六;計(jì)算接近水平適應(yīng)度函數(shù) ApproachLevelFitness,如果 ApproachLevelFitness 為0,則測(cè)試數(shù)據(jù)到達(dá)目標(biāo);然后在目標(biāo)判定處,計(jì)算分支距離BranchFitness,如果 ApproachLevelFitness和BranchFitness都為0,則測(cè)試數(shù)據(jù)達(dá)到MC/DC測(cè)試目標(biāo),否貝>J,iiJi式β白勺;SlSiSMlM,^" ApproachLevelFitness+normalized(BranchFitness), normalized(BranchFitness)表示對(duì)分支距離BranchFitness的標(biāo)準(zhǔn)化,具體的計(jì)算過(guò)程為步驟5. 1 按照步驟二的方法生成MC/DC測(cè)試用例預(yù)期結(jié)果集; 步驟5. 2 按照步驟4. 1和步驟4. 2的方法獲得依賴關(guān)系集合,包括控制依賴集和數(shù)據(jù)依賴集;步驟5. 3 針對(duì)每一個(gè)目標(biāo)判定,隨機(jī)生成測(cè)試數(shù)據(jù)Ta和測(cè)試數(shù)據(jù)Tb ; 步驟5. 4 按照步驟4. 1中的計(jì)算方法,根據(jù)依賴關(guān)系集合,分別計(jì)算測(cè)試數(shù)據(jù)Ta和測(cè)試數(shù)據(jù)Tb的控制依賴適應(yīng)度函數(shù)和數(shù)據(jù)依賴適應(yīng)度函數(shù);步驟5. 5 按照步驟4. 3中的計(jì)算方法,分別計(jì)算測(cè)試數(shù)據(jù)Ta和測(cè)試數(shù)據(jù)Tb的分支距罔;步驟5. 6 進(jìn)行分支距離的標(biāo)準(zhǔn)化BranchFitness (Ta)normalised,計(jì)算公式為
全文摘要
本發(fā)明公開(kāi)了一種基于遺傳算法的MC/DC測(cè)試數(shù)據(jù)自動(dòng)生成方法,包括對(duì)被測(cè)程序進(jìn)行靜態(tài)分析,產(chǎn)生控制流圖、數(shù)據(jù)流圖、抽象語(yǔ)法樹(shù)和抽象分析樹(shù);生成MC/DC測(cè)試用例預(yù)期結(jié)果集;對(duì)被測(cè)程序進(jìn)行代碼插樁;構(gòu)造適應(yīng)度函數(shù);隨機(jī)產(chǎn)生測(cè)試數(shù)據(jù),檢驗(yàn)是否滿足預(yù)期執(zhí)行的路徑;使用遺傳算法的選擇、交叉、變異等遺傳操作,得到合適的測(cè)試數(shù)據(jù)。本發(fā)明在適應(yīng)度函數(shù)的構(gòu)造上,結(jié)合鏈接法思想,以傳統(tǒng)適應(yīng)度函數(shù)為基礎(chǔ),提出以獲取直接或者通過(guò)數(shù)據(jù)依賴間接影響問(wèn)題節(jié)點(diǎn)遍歷的控制節(jié)點(diǎn)的方法來(lái)優(yōu)化接近水平適應(yīng)評(píng)價(jià)。本發(fā)明對(duì)邏輯關(guān)系復(fù)雜的系統(tǒng)進(jìn)行測(cè)試時(shí)具有很大的實(shí)用價(jià)值。
文檔編號(hào)G06F11/36GK102323906SQ20111026519
公開(kāi)日2012年1月18日 申請(qǐng)日期2011年9月8日 優(yōu)先權(quán)日2011年9月8日
發(fā)明者劉廠, 李剛, 趙玉新, 高峰 申請(qǐng)人:哈爾濱工程大學(xué)