欧美在线观看视频网站,亚洲熟妇色自偷自拍另类,啪啪伊人网,中文字幕第13亚洲另类,中文成人久久久久影院免费观看 ,精品人妻人人做人人爽,亚洲a视频

一種基于函數(shù)調(diào)用路徑的覆蓋率動(dòng)態(tài)跟蹤方法及裝置制造方法

文檔序號(hào):6509147閱讀:258來源:國知局
一種基于函數(shù)調(diào)用路徑的覆蓋率動(dòng)態(tài)跟蹤方法及裝置制造方法
【專利摘要】本發(fā)明涉及一種基于函數(shù)調(diào)用路徑的覆蓋率動(dòng)態(tài)跟蹤方法及裝置,實(shí)現(xiàn)方案為:對被測源代碼進(jìn)行插樁預(yù)處理,得到函數(shù)對象列表和控制關(guān)鍵字對象列表;得到源代碼的函數(shù)調(diào)用基本路徑集;執(zhí)行測試用例,并運(yùn)行插樁后的源代碼,獲得由源代碼的執(zhí)行路徑的樁點(diǎn)數(shù)據(jù)流組成的動(dòng)態(tài)路徑;對動(dòng)態(tài)路徑進(jìn)行拆分,得到測試用例所覆蓋的函數(shù)調(diào)用路徑子集;將函數(shù)調(diào)用路徑子集與函數(shù)調(diào)用基本路徑集進(jìn)行匹配;將所有函數(shù)調(diào)用路徑子集作為一個(gè)動(dòng)態(tài)路徑集,優(yōu)化該動(dòng)態(tài)路徑集;計(jì)算優(yōu)化后的動(dòng)態(tài)路徑集占函數(shù)調(diào)用基本路徑集的比率,得到覆蓋率。本發(fā)明將路徑覆蓋粒度由語句擴(kuò)展到函數(shù)級(jí)別,避免了傳統(tǒng)路徑覆蓋路徑集龐大而無法完全測試每條路徑的問題。
【專利說明】—種基于函數(shù)調(diào)用路徑的覆蓋率動(dòng)態(tài)跟蹤方法及裝置
【技術(shù)領(lǐng)域】
[0001]本發(fā)明涉及軟件測試的覆蓋分析【技術(shù)領(lǐng)域】,特別是涉及一種基于函數(shù)調(diào)用路徑的覆蓋率動(dòng)態(tài)跟蹤方法及裝置。
【背景技術(shù)】
[0002]以下是本領(lǐng)域中的一些名詞解釋,其使用范圍僅限于本發(fā)明:
[0003]函數(shù)調(diào)用關(guān)系:函數(shù)調(diào)用關(guān)系是以函數(shù)為基本單位,通過分析源程序里函數(shù)之間的邏輯關(guān)系得來的。
[0004]函數(shù)調(diào)用基本路徑集:是源代碼按照函數(shù)調(diào)用關(guān)系進(jìn)行分析得到的全部函數(shù)調(diào)用路徑的集合,也就是函數(shù)調(diào)用關(guān)系圖G中的所包含的所有函數(shù)調(diào)用路徑,表示為B (S,O = IP1, P2,…,PJ,其中S是源代碼,C是函數(shù)調(diào)用關(guān)系準(zhǔn)則,Pi是函數(shù)調(diào)用路徑。
[0005]插樁:是指在靜態(tài)測試階段,借助向被測程序中插入操作來實(shí)現(xiàn)測試目的的方法,其基本原理是被測程序在保持原有邏輯完整性基礎(chǔ)上在程序中插入一些探針,這些探針的本質(zhì)是進(jìn)行信息采集的代碼段,可以是賦值語句或采集覆蓋信息的函數(shù)調(diào)用。插樁技術(shù)的應(yīng)用是為了記錄軟件運(yùn)行時(shí)代碼的執(zhí)行路徑,從而了解代碼的執(zhí)行情況,利用插樁信息分析軟件代碼的覆蓋率。
[0006]執(zhí)行路徑:源代碼的執(zhí)行路徑是指輸入?yún)?shù)后編譯運(yùn)行源代碼所得到的函數(shù)之間的執(zhí)行順序。
[0007]動(dòng)態(tài)路徑:動(dòng)態(tài)路徑是指輸入測試數(shù)據(jù)、編譯運(yùn)行經(jīng)過預(yù)處理的源代碼所獲得的路徑,其中包含了函數(shù)之間的執(zhí)行順序和控制關(guān)鍵字。動(dòng)態(tài)路徑是由一系列的樁點(diǎn)數(shù)據(jù)流組成的,包含函數(shù)的起始樁點(diǎn)、結(jié)束樁點(diǎn)和控制邏輯關(guān)鍵字的真假樁點(diǎn)值。
[0008]覆蓋率:覆蓋率是用來度量測試完整性的一個(gè)手段,通過覆蓋率數(shù)據(jù),可以知道測試工作是否充分,測試的弱點(diǎn)在哪些方面,進(jìn)而指導(dǎo)設(shè)計(jì)能夠增加覆蓋率的測試用例,有效地提高測試質(zhì)量。覆蓋率中最常見的是代碼覆蓋率,而路徑覆蓋是代碼覆蓋方法里一種非常嚴(yán)格的覆蓋準(zhǔn)則。
[0009]在實(shí)際代碼測試中,一個(gè)較為復(fù)雜的程序包含的路徑數(shù)目是相當(dāng)龐大的,要完全達(dá)到路徑覆蓋是不可行的,實(shí)現(xiàn)自動(dòng)化路徑覆蓋也是困難的。傳統(tǒng)路徑覆蓋方法涉及的路徑集龐大,且其針對每條路徑至少測試一次的測試方法只停留在理論階段,存在很大缺陷,無法完全測試出每條路徑的問題。
[0010]為解決上述問題,文檔《基于函數(shù)調(diào)用的路徑覆蓋生成技術(shù)研究》(張志華,牟永敏.基于函數(shù)調(diào)用的路徑覆蓋生成技術(shù)研究[J].電子學(xué)報(bào),2010,38(8):1808-1811)提出了基于函數(shù)調(diào)用路徑思想,文中給出了靜態(tài)、動(dòng)態(tài)分析函數(shù)調(diào)用路徑覆蓋率的大體思路,但是并未對具體實(shí)現(xiàn)做詳細(xì)的說明。本發(fā)明繼承了函數(shù)調(diào)用路徑思想,提出了一種適用于白盒回歸測試的動(dòng)態(tài)跟蹤、分析測試用例覆蓋率的方法及裝置。

【發(fā)明內(nèi)容】
[0011]本發(fā)明所要解決的技術(shù)問題是提供一種基于函數(shù)調(diào)用路徑的覆蓋率動(dòng)態(tài)跟蹤方法及裝置,用于解決傳統(tǒng)路徑覆蓋方法的路徑集龐大且無法完全測試每條路徑的問題。
[0012]本發(fā)明解決上述技術(shù)問題的技術(shù)方案如下:一種基于函數(shù)調(diào)用路徑的覆蓋率動(dòng)態(tài)跟蹤方法,包括:
[0013]步驟1,對被測源代碼進(jìn)行插樁預(yù)處理,得到函數(shù)對象列表和控制關(guān)鍵字對象列表;
[0014]步驟2,獲取源代碼的函數(shù)調(diào)用基本路徑集;
[0015]步驟3,執(zhí)行測試用例,并運(yùn)行經(jīng)步驟I插樁后的源代碼,獲得由源代碼的執(zhí)行路徑的樁點(diǎn)數(shù)據(jù)流組成的動(dòng)態(tài)路徑;
[0016]步驟4,根據(jù)函數(shù)對象列表和控制關(guān)鍵字對象列表提供的信息,對步驟3獲得的動(dòng)態(tài)路徑進(jìn)行拆分,得到測試用例所覆蓋的函數(shù)調(diào)用路徑子集;
[0017]步驟5,將函數(shù)調(diào)用路徑子集與函數(shù)調(diào)用基本路徑集進(jìn)行匹配,確保函數(shù)調(diào)用路徑子集是屬于函數(shù)調(diào)用基本路徑集的子集;
[0018]步驟6,將所有函數(shù)調(diào)用路徑子集作為一個(gè)動(dòng)態(tài)路徑集,優(yōu)化該動(dòng)態(tài)路徑集;
[0019]步驟7,計(jì)算優(yōu)化后的動(dòng)態(tài)路徑集占函數(shù)調(diào)用基本路徑集的比率,得到覆蓋率。
[0020]本發(fā)明的有益效果是:本發(fā)明提出了基于函數(shù)調(diào)用的路徑覆蓋生成技術(shù),將路徑覆蓋粒度由語句擴(kuò)展到函數(shù)級(jí)別,避免路徑的爆炸式增長,在保證充分單元測試的前提下,避免了傳統(tǒng)路徑覆蓋路徑集龐大而無法完全測試每條路徑的問題,有利于提高自動(dòng)化測試的可行性。同時(shí),本發(fā)明對動(dòng)態(tài)路徑集進(jìn)行了優(yōu)化,再得出測試用例基于函數(shù)調(diào)用路徑的覆蓋率,基于覆蓋率分析出未被覆蓋的函數(shù)調(diào)用路徑集,有利于指導(dǎo)測試人員針對未被覆蓋的函數(shù)調(diào)用路徑設(shè)計(jì)測試用例。
[0021]在上述技術(shù)方案的基礎(chǔ)上,本發(fā)明還可以做如下改進(jìn)。
[0022]進(jìn)一步,所述步驟I具體包括:
[0023]步驟11,選擇插樁點(diǎn);
[0024]步驟12,設(shè)計(jì)樁函數(shù),并將樁函數(shù)插入到選擇的插樁點(diǎn)中;
[0025]步驟13,存放插入樁函數(shù)后生成的插樁信息,包括函數(shù)對象列表信息和控制關(guān)鍵字對象列表信息。
[0026]采用上述進(jìn)一步方案的有益效果是:根據(jù)函數(shù)調(diào)用路徑的特點(diǎn)在完成插樁點(diǎn)的選擇、樁函數(shù)的設(shè)計(jì)以及插樁信息存放后,完成了對源代碼的插樁預(yù)處理,其只是在源代碼內(nèi)添加了樁函數(shù),而樁函數(shù)并不會(huì)影響源代碼原有的功能,插樁后的源代碼仍然能夠正常編譯運(yùn)行。上述方法易于實(shí)現(xiàn),便于獲得源代碼在運(yùn)行時(shí)的動(dòng)態(tài)路徑的相關(guān)信息。
[0027]進(jìn)一步,所述步驟11具體包括:基于塊結(jié)構(gòu)劃分源代碼,以源代碼所包括的每個(gè)函數(shù)作為一個(gè)塊結(jié)構(gòu),再針對每個(gè)塊結(jié)構(gòu),將函數(shù)起始點(diǎn)、控制邏輯關(guān)鍵字所在點(diǎn)和函數(shù)結(jié)束點(diǎn)作為插樁點(diǎn)。
[0028]采用上述進(jìn)一步方案的有益效果是:通過函數(shù)的起始點(diǎn)和結(jié)束點(diǎn)可以唯一的標(biāo)識(shí)一個(gè)函數(shù)及標(biāo)識(shí)函數(shù)的當(dāng)前狀態(tài)。選擇控制關(guān)鍵字作為插樁點(diǎn)表明了標(biāo)識(shí)出函數(shù)之間的執(zhí)行順序是基于何種函數(shù)調(diào)用關(guān)系的。這樣既能保證樁點(diǎn)的緊湊精干,又能保證收集的信息全面無冗余。
[0029]進(jìn)一步,所述步驟4中對動(dòng)態(tài)路徑進(jìn)行拆分具體包括:[0030]步驟41,分別讀入動(dòng)態(tài)路徑、函數(shù)對象列表及控制邏輯關(guān)鍵字對象列表;
[0031]步驟42,將動(dòng)態(tài)路徑包含的每個(gè)樁點(diǎn)值存放到ArrayList數(shù)組里,將函數(shù)對象列表和控制邏輯關(guān)鍵字對象列表的信息分別存放到哈希表中;
[0032]步驟43,將動(dòng)態(tài)路徑里的樁點(diǎn)值分別與函數(shù)對象列表和控制關(guān)鍵字對象列表進(jìn)行比較,根據(jù)樁點(diǎn)值類型的不同對動(dòng)態(tài)路徑進(jìn)行不同的拆分處理。
[0033]采用上述進(jìn)一步方案的有益效果是:動(dòng)態(tài)路徑是無法直接與函數(shù)調(diào)用基本路徑集進(jìn)行匹配,因此需對動(dòng)態(tài)路徑進(jìn)行拆分,上述拆分方法結(jié)合了函數(shù)調(diào)用路徑和動(dòng)態(tài)路徑的特點(diǎn),易于實(shí)現(xiàn),且保證了拆分的準(zhǔn)確性。
[0034]進(jìn)一步,所述步驟5中將函數(shù)調(diào)用路徑子集與函數(shù)調(diào)用基本路徑集進(jìn)行匹配具體包括:
[0035]步驟51,將函數(shù)調(diào)用基本路徑集里的函數(shù)調(diào)用路徑存放到ArrayList數(shù)組中;
[0036]步驟52,遍歷ArrayList數(shù)組,將函數(shù)調(diào)用基本路徑集里的函數(shù)調(diào)用路徑構(gòu)建成樹形結(jié)構(gòu);
[0037]步驟53,在函數(shù)調(diào)用基本路徑集的樹形結(jié)構(gòu)中查找是否存在函數(shù)調(diào)用路徑子集的函數(shù)調(diào)用路徑,當(dāng)且僅當(dāng)一個(gè)函數(shù)調(diào)用路徑子集中的所有函數(shù)調(diào)用路徑都存在于樹形結(jié)構(gòu)中時(shí),該函數(shù)調(diào)用路徑子集能成功匹配函數(shù)調(diào)用基本路徑集,否則匹配不成功,需重新對動(dòng)態(tài)路徑進(jìn)行拆分。
[0038]采用上述進(jìn)一步方案的有益效果是:驗(yàn)證了拆分算法的正確性,保證了拆分后的函數(shù)調(diào)用路徑子集是否是函數(shù)調(diào)用基本路徑集的子集,且相比于低效的數(shù)組元素匹配方式,樹形結(jié)構(gòu)能提供更為高效的路徑查找方式。
[0039]進(jìn)一步,所述步驟6中優(yōu)化動(dòng)態(tài)路徑集包括兩個(gè)方面:一是基于動(dòng)態(tài)路徑集本身進(jìn)行的優(yōu)化,二是基于動(dòng)態(tài)路徑集中的各函數(shù)調(diào)用路徑子集間的包含關(guān)系進(jìn)行的優(yōu)化;
[0040]所述基于動(dòng)態(tài)路徑集本身進(jìn)行的優(yōu)化具體包括:在將動(dòng)態(tài)路徑添加到動(dòng)態(tài)路徑集之前,判斷動(dòng)態(tài)路徑集中是否已存在該條動(dòng)態(tài)路徑,若存在,則說明該條動(dòng)態(tài)路徑是重復(fù)的動(dòng)態(tài)路徑,將其舍棄,同時(shí)將對應(yīng)的測試數(shù)據(jù)也一并舍棄;若不存在,則將該條動(dòng)態(tài)路徑添加到動(dòng)態(tài)路徑集中。
[0041]所述基于動(dòng)態(tài)路徑集中的各函數(shù)調(diào)用路徑子集間的包含關(guān)系進(jìn)行的優(yōu)化具體包括:計(jì)算出函數(shù)調(diào)用基本路徑集中的函數(shù)調(diào)用路徑被動(dòng)態(tài)路徑覆蓋的條數(shù),記為Ti,以及每條動(dòng)態(tài)路徑覆蓋函數(shù)調(diào)用路徑的條數(shù),記為Ri ;挑選出所有必不可少的動(dòng)態(tài)路徑,然后從函數(shù)調(diào)用基本路徑集中刪除被動(dòng)態(tài)路徑所覆蓋的函數(shù)調(diào)用路徑,重新計(jì)算Ti,Ri的值,迭代執(zhí)行;當(dāng)沒有必不可少的動(dòng)態(tài)路徑時(shí),挑選覆蓋函數(shù)調(diào)用路徑最多的動(dòng)態(tài)路徑,然后從函數(shù)調(diào)用基本路徑集中刪除該條動(dòng)態(tài)路徑所覆蓋的函數(shù)調(diào)用路徑,重新計(jì)算Ti,Ri的值,并再次查看是否有必不可少的動(dòng)態(tài)路徑,迭代執(zhí)行。
[0042]采用上述進(jìn)一步方案的有益效果是:首先去除動(dòng)態(tài)路徑集中相同的路徑然后使用啟發(fā)算法對函數(shù)調(diào)用子集的包含關(guān)系進(jìn)行優(yōu)化,刪除了重復(fù)和冗余的動(dòng)態(tài)路徑,易于實(shí)現(xiàn),優(yōu)化率高.優(yōu)化后的動(dòng)態(tài)路徑集與函數(shù)調(diào)用基本路徑集進(jìn)行匹配,能同時(shí)獲得已覆蓋的函數(shù)調(diào)用路徑和未覆蓋的函數(shù)調(diào)用路徑,便于對下一步測試進(jìn)行指導(dǎo)。
[0043]本發(fā)明的技術(shù)方案還包括一種基于函數(shù)調(diào)用路徑的覆蓋率動(dòng)態(tài)跟蹤裝置,其功能及有益效果均與上述覆蓋率動(dòng)態(tài)跟蹤方法相對應(yīng)。所述覆蓋率動(dòng)態(tài)跟蹤裝置包括:[0044]插樁預(yù)處理模塊,其用于對被測源代碼進(jìn)行插樁預(yù)處理,得到函數(shù)對象列表和控制關(guān)鍵字對象列表;
[0045]基本路徑集獲取模塊,其用于獲取源代碼的函數(shù)調(diào)用基本路徑集;
[0046]動(dòng)態(tài)路徑獲取模塊,其連接所述插樁預(yù)處理模塊,用于執(zhí)行測試用例,并運(yùn)行經(jīng)所述插樁預(yù)處理模塊插樁后的源代碼,獲得由源代碼的執(zhí)行路徑樁點(diǎn)數(shù)據(jù)流組成的動(dòng)態(tài)路徑;
[0047]動(dòng)態(tài)路徑拆分模塊,其連接所述插樁預(yù)處理模塊及所述動(dòng)態(tài)路徑獲取模塊,用于根據(jù)函數(shù)對象列表和控制關(guān)鍵字對象列表提供的信息,對獲得的動(dòng)態(tài)路徑進(jìn)行拆分,得到測試用例所覆蓋的函數(shù)調(diào)用路徑子集;
[0048]路徑匹配模塊,其連接所述基本路徑集獲取模塊及所述動(dòng)態(tài)路徑拆分模塊,用于將函數(shù)調(diào)用路徑子集與函數(shù)調(diào)用基本路徑集進(jìn)行匹配,確保函數(shù)調(diào)用路徑子集是屬于函數(shù)調(diào)用基本路徑集的子集;
[0049]路徑集優(yōu)化模塊,其連接所述路徑匹配模塊,用于將經(jīng)所述匹配模塊處理過的所有函數(shù)調(diào)用路徑子集作為一個(gè)動(dòng)態(tài)路徑集,并優(yōu)化該動(dòng)態(tài)路徑集;
[0050]覆蓋率計(jì)算模塊,其連接所述路徑集優(yōu)化模塊用于計(jì)算優(yōu)化后的動(dòng)態(tài)路徑集占函數(shù)調(diào)用基本路徑集的比率,得到覆蓋率。
[0051]進(jìn)一步,所述插樁預(yù)處理模塊包括:
[0052]插樁點(diǎn)選擇模塊,其用于以源代碼所包括的每個(gè)函數(shù)作為一個(gè)塊結(jié)構(gòu),再針對每個(gè)塊結(jié)構(gòu),將函數(shù)起始點(diǎn)、控制邏輯關(guān)鍵字所在點(diǎn)和函數(shù)結(jié)束點(diǎn)作為插樁點(diǎn);
[0053]樁函數(shù)設(shè)計(jì)模塊,其連接所述插樁點(diǎn)選擇模塊,用于設(shè)計(jì)樁函數(shù),并將樁函數(shù)插入到選擇的插樁點(diǎn)中;
[0054]插樁信息存放模塊,其連接所述樁函數(shù)設(shè)計(jì)模塊,用于存放插入樁函數(shù)后生成的插樁信息,包括函數(shù)對象列表信息和控制關(guān)鍵字對象列表信息。
[0055]進(jìn)一步,所述動(dòng)態(tài)路徑拆分模塊包括:
[0056]信息讀入模塊,其用于分別讀入動(dòng)態(tài)路徑和函數(shù)對象列表及控制邏輯關(guān)鍵字對象列表;
[0057]信息存放模塊,其連接所述信息讀入模塊,用于將動(dòng)態(tài)路徑包含的每個(gè)樁點(diǎn)值存放到ArrayList數(shù)組里,將函數(shù)對象列表和控制邏輯關(guān)鍵字對象列表的信息分別存放到哈希表中;
[0058]拆分執(zhí)行模塊,其連接所述信息存放模塊,用于將動(dòng)態(tài)路徑里的樁點(diǎn)值分別與函數(shù)對象列表和控制關(guān)鍵字對象列表進(jìn)行比較,根據(jù)樁點(diǎn)值類型的不同對動(dòng)態(tài)路徑進(jìn)行不同的拆分處理。
[0059]進(jìn)一步,所述路徑匹配模塊包括:
[0060]路徑存放模塊,其用于將函數(shù)調(diào)用基本路徑集里的函數(shù)調(diào)用路徑存放到ArrayList 數(shù)組中;
[0061]樹形結(jié)構(gòu)建立模塊,其連接所述路徑存放模塊,用于遍歷ArrayList數(shù)組,將函數(shù)調(diào)用基本路徑集里的函數(shù)調(diào)用路徑構(gòu)建成樹形結(jié)構(gòu);
[0062]查找模塊,其連接所述樹形結(jié)構(gòu)建立模塊,用于在函數(shù)調(diào)用基本路徑集的樹形結(jié)構(gòu)中查找是否存在函數(shù)調(diào)用路徑子集的函數(shù)調(diào)用路徑,當(dāng)且僅當(dāng)一個(gè)函數(shù)調(diào)用路徑子集中的所有函數(shù)調(diào)用路徑都存在于樹形結(jié)構(gòu)中時(shí),該函數(shù)調(diào)用路徑子集能成功匹配函數(shù)調(diào)用基本路徑集,否則匹配不成功,并重新對動(dòng)態(tài)路徑進(jìn)行拆分。
【專利附圖】

【附圖說明】
[0063]圖1為本發(fā)明所述基于函數(shù)調(diào)用路徑的覆蓋率動(dòng)態(tài)跟蹤方法的流程示意圖;
[0064]圖2為本發(fā)明實(shí)施例中進(jìn)行動(dòng)態(tài)拆分的原理圖;
[0065]圖3為本發(fā)明實(shí)施例中樹形結(jié)構(gòu)表示的函數(shù)調(diào)用路徑示意圖;
[0066]圖4為本發(fā)明應(yīng)用例中函數(shù)調(diào)用關(guān)系的示意圖;
[0067]圖5為本發(fā)明所述基于函數(shù)調(diào)用路徑的覆蓋率動(dòng)態(tài)跟蹤裝置的結(jié)構(gòu)示意圖;
[0068]圖6為本發(fā)明所述插樁預(yù)處理模塊的結(jié)構(gòu)示意圖;
[0069]圖7為本發(fā)明所述動(dòng)態(tài)路徑拆分模塊的結(jié)構(gòu)示意圖;
[0070]圖8為本發(fā)明所述路徑匹配模塊的結(jié)構(gòu)示意圖。
[0071]附圖中,各標(biāo)號(hào)所代表的部件列表如下:
[0072]1、插樁預(yù)處理模塊,2、基本路徑集獲取模塊,3、動(dòng)態(tài)路徑獲取模塊,4、動(dòng)態(tài)路徑拆分模塊,5、路徑匹配模塊,6、路徑集優(yōu)化模塊,7、覆蓋率計(jì)算模塊,11、插樁點(diǎn)選擇模塊,12、樁函數(shù)設(shè)計(jì)模塊,13、插樁信息存放模塊,41、信息讀入模塊,42、信息存放模塊,43、拆分執(zhí)行模塊,51、路徑存放模塊,52、樹形結(jié)構(gòu)建立模塊,53、查找模塊。
【具體實(shí)施方式】
[0073]以下結(jié)合附圖對本發(fā)明的原理和特征進(jìn)行描述,所舉實(shí)例只用于解釋本發(fā)明,并非用于限定本發(fā)明的范圍。
[0074]如圖1所示,本實(shí)施例給出了一種基于函數(shù)調(diào)用路徑的覆蓋率動(dòng)態(tài)跟蹤方法,包括:
[0075]步驟1,對被測源代碼進(jìn)行插樁預(yù)處理,得到函數(shù)對象列表和控制關(guān)鍵字對象列表;
[0076]步驟2,獲取源代碼的函數(shù)調(diào)用基本路徑集;
[0077]步驟3,執(zhí)行測試用例,并運(yùn)行經(jīng)步驟I插樁后的源代碼,獲得由源代碼的執(zhí)行路徑的樁點(diǎn)數(shù)據(jù)流組成的動(dòng)態(tài)路徑;
[0078]步驟4,根據(jù)函數(shù)對象列表和控制關(guān)鍵字對象列表提供的信息,對步驟3獲得的動(dòng)態(tài)路徑進(jìn)行拆分,得到測試用例所覆蓋的函數(shù)調(diào)用路徑子集;
[0079]步驟5,將函數(shù)調(diào)用路徑子集與函數(shù)調(diào)用基本路徑集進(jìn)行匹配,確保函數(shù)調(diào)用路徑子集是屬于函數(shù)調(diào)用基本路徑集的子集;
[0080]步驟6,將所有函數(shù)調(diào)用路徑子集作為一個(gè)動(dòng)態(tài)路徑集,優(yōu)化該動(dòng)態(tài)路徑集;
[0081]步驟7,計(jì)算優(yōu)化后的動(dòng)態(tài)路徑集占函數(shù)調(diào)用基本路徑集的比率,得到覆蓋率。
[0082]步驟2中,函數(shù)調(diào)用基本路徑集的獲取是通過靜態(tài)分析獲得的函數(shù)調(diào)用路徑得至IJ,屬于本領(lǐng)域公知技術(shù),本發(fā)明中不再多述。
[0083]基于上述步驟,具體的實(shí)施過程包括以下幾個(gè)部分。
[0084]一、插樁預(yù)處理。
[0085]插樁預(yù)處理實(shí)現(xiàn)具體包括:[0086]步驟11,選擇插樁點(diǎn):基于塊結(jié)構(gòu)劃分源代碼,以源代碼所包括的每個(gè)函數(shù)作為一個(gè)塊結(jié)構(gòu),再針對每個(gè)塊結(jié)構(gòu),將函數(shù)起始點(diǎn)、控制邏輯關(guān)鍵字所在點(diǎn)和函數(shù)結(jié)束點(diǎn)作為插樁點(diǎn);
[0087]步驟12,設(shè)計(jì)樁函數(shù),并將樁函數(shù)插入到選擇的插樁點(diǎn)中;
[0088]步驟13,存放插入樁函數(shù)后生成的插樁信息,包括函數(shù)對象列表信息和控制關(guān)鍵字對象列表信息。
[0089]其中,選擇函數(shù)的起始點(diǎn)和結(jié)束點(diǎn)作為插樁點(diǎn)是出于以下兩個(gè)原因:1)通過該兩點(diǎn)可以唯一的標(biāo)識(shí)一個(gè)函數(shù);2)通過該兩點(diǎn)可以標(biāo)識(shí)函數(shù)的當(dāng)前狀態(tài)。例如,在動(dòng)態(tài)路徑里記錄了一個(gè)函數(shù)的入口點(diǎn),但是緊跟著的不是該函數(shù)的出口點(diǎn),而是另外一個(gè)函數(shù)的入口點(diǎn),說明該函數(shù)調(diào)用了其他的函數(shù),該函數(shù)本身還沒有結(jié)束。選擇控制關(guān)鍵字作為插樁點(diǎn)是為了標(biāo)識(shí)出函數(shù)之間的執(zhí)行順序是基于何種函數(shù)調(diào)用關(guān)系的。例如,在動(dòng)態(tài)路徑里記錄了函數(shù)Π的入口點(diǎn),然后是if關(guān)鍵字的真樁點(diǎn),緊跟著的是函數(shù)f2的入口點(diǎn),說明函數(shù)f2包含在函數(shù)Π里,且f2的執(zhí)行是通過選擇分支條件為真的情況發(fā)生調(diào)用的。
[0090]設(shè)計(jì)的樁函數(shù)要滿足兩個(gè)要求:第一,保證樁函數(shù)能夠記錄動(dòng)態(tài)路徑所需的信息;第二,對樁函數(shù)作最大程度的簡化,使插樁后的源代碼具有盡可能低的膨脹率。因此所需的樁函數(shù)不需很復(fù)雜,僅僅能起到唯一標(biāo)識(shí)且能夠保證所有位置都能插入即可。基于上述考慮,本實(shí)施例給出一組樁函數(shù)實(shí)現(xiàn)方案:在需要插入樁點(diǎn)的位置插入8位16進(jìn)制的標(biāo)記,這些16進(jìn)制的標(biāo)記不能有重復(fù)的情況發(fā)生,8位16進(jìn)制的個(gè)數(shù)足以保證插樁點(diǎn)個(gè)數(shù)的需求;為避免重復(fù),可設(shè)計(jì)四類樁函數(shù):函數(shù)的入口點(diǎn)插入CPiObeS (tag)函數(shù);函數(shù)的出口點(diǎn)插入CProbeE (tag);控制關(guān)鍵字為真時(shí)插入CProbeT (tag)函數(shù),且以標(biāo)記(CProbeT (tag),I)表示;控制關(guān)鍵字為假時(shí)插入CProbeF (tag)函數(shù),且以標(biāo)記(CProbeF (tag),O)表示。其中tag為8位16進(jìn)制的數(shù),每個(gè)樁函數(shù)的tag起始大小不一樣,且固定。然后逐個(gè)加1,但是最大數(shù)不能超過其它函數(shù)的起始數(shù),這樣就可以避免重復(fù)情況發(fā)生。這些樁函數(shù)將在程序執(zhí)行過程中向動(dòng)態(tài)路徑的樁點(diǎn)數(shù)據(jù)流文件中寫入tag值。例如CProbeS (0x7540001)表示將函數(shù)入口點(diǎn)樁點(diǎn)值0x7540001寫入動(dòng)態(tài)路徑的樁點(diǎn)數(shù)據(jù)流文件。
[0091]記錄的插樁信息包括函數(shù)對象列表和控制關(guān)鍵字對象列表。函數(shù)對象列表的文件存儲(chǔ)數(shù)據(jù)格式有五個(gè)字段,分別為:起始樁點(diǎn)、函數(shù)名、起始行、終止行、結(jié)束樁點(diǎn)。起始樁點(diǎn)字段里包含的內(nèi)容為函數(shù)的入口樁點(diǎn)數(shù)據(jù)值;函數(shù)名字段里包含的內(nèi)容為函數(shù)原型,有函數(shù)的返回類型、函數(shù)名、函數(shù)參數(shù)列表;起始行字段里包含的內(nèi)容為函數(shù)的起始行行號(hào);終止行字段里包含的內(nèi)容為函數(shù)的結(jié)束行行號(hào);結(jié)束樁點(diǎn)字段里包含的內(nèi)容為函數(shù)的出口樁點(diǎn)數(shù)據(jù)值;函數(shù)起始樁點(diǎn)和結(jié)束樁點(diǎn)與函數(shù)名是一一對應(yīng)關(guān)系。
[0092]控制邏輯關(guān)鍵字對象列表的文件存儲(chǔ)數(shù)據(jù)格式有四個(gè)字段,分別為:假樁點(diǎn)、關(guān)鍵字、函數(shù)名、真樁點(diǎn)。假樁點(diǎn)字段里包含的內(nèi)容為控制關(guān)鍵字為假的樁點(diǎn)數(shù)據(jù)值;關(guān)鍵字字段里包含的內(nèi)容為控制關(guān)鍵字;函數(shù)名字段里包含的內(nèi)容為控制關(guān)鍵字所在的函數(shù)原型里:有函數(shù)的返回類型、函數(shù)名、函數(shù)參數(shù)列表;真樁點(diǎn)字段里包含的內(nèi)容為控制關(guān)鍵字為真的樁點(diǎn)數(shù)據(jù)值。
[0093]其中,對于控制關(guān)鍵字對象列表里的信息,只關(guān)注關(guān)鍵字的類型,允許出現(xiàn)多個(gè)同樣的關(guān)鍵字。如在一個(gè)函數(shù)里可以出現(xiàn)多個(gè)if關(guān)鍵字,但是對每個(gè)if關(guān)鍵字都有唯一對應(yīng)的判定真樁點(diǎn)和判定假樁點(diǎn),其中判定真樁點(diǎn)和判定假樁點(diǎn)是一一對應(yīng)的。[0094]二、動(dòng)態(tài)路徑的拆分。
[0095]動(dòng)態(tài)路徑拆分主要包括以下步驟:
[0096]步驟41,分別讀入動(dòng)態(tài)路徑、函數(shù)對象列表及控制邏輯關(guān)鍵字對象列表;
[0097]步驟42,將動(dòng)態(tài)路徑包含的每個(gè)樁點(diǎn)值存放到ArrayList數(shù)組里,將函數(shù)對象列表和控制邏輯關(guān)鍵字對象列表的信息分別存放到哈希表中;
[0098]步驟43,將動(dòng)態(tài)路徑里的樁點(diǎn)值分別與函數(shù)對象列表和控制關(guān)鍵字對象列表進(jìn)行比較,根據(jù)樁點(diǎn)值類型的不同對動(dòng)態(tài)路徑進(jìn)行不同的拆分處理。
[0099]動(dòng)態(tài)路徑拆分的主要原理是將動(dòng)態(tài)路徑結(jié)合函數(shù)對象列表和控制關(guān)鍵字對象列表進(jìn)行分析,主要針對循環(huán)和遞歸進(jìn)行拆分,獲到函數(shù)調(diào)用路徑集。原理圖如圖2所示。本實(shí)施例的拆分算法的實(shí)現(xiàn)需要使用以下數(shù)據(jù)結(jié)構(gòu):
[0100]I) ArrayList
[0101]ArrayList數(shù)組的優(yōu)點(diǎn)是可以事先不定義數(shù)組的大小,其容量可根據(jù)需要?jiǎng)討B(tài)地?cái)U(kuò)充。利用ArrayList的這一特性,可以用來存儲(chǔ)動(dòng)態(tài)路徑的樁點(diǎn)值,也可以用來存放動(dòng)態(tài)路徑拆分后得到的函數(shù)調(diào)用路徑子集。
[0102]2) HashTable
[0103]哈希表表示鍵(key)/值(value)對的集合,這些鍵/值對根據(jù)鍵的哈希代碼進(jìn)行組織。哈希表像一個(gè)字典,其中每個(gè)元素都是一個(gè)存儲(chǔ)在字典實(shí)體對象中的鍵/值對,根據(jù)鍵可以查到相應(yīng)的值。插樁后得到的函數(shù)對象列表里的起始樁點(diǎn)、函數(shù)名、結(jié)束樁點(diǎn)是一一對應(yīng)的關(guān)系,且樁點(diǎn)值是唯一標(biāo)識(shí)的。并且控制關(guān)鍵字對象列表里的判定真樁點(diǎn)、關(guān)鍵字名、判定假樁點(diǎn)也是一一對應(yīng)關(guān)系,且樁點(diǎn)值是唯一標(biāo)識(shí)的。所以利用哈希表的這個(gè)特性可以用來存儲(chǔ)函數(shù)對象列表的信息和控制關(guān)鍵字對象列表的信息。創(chuàng)建兩個(gè)哈希表,一個(gè)用來存放函數(shù)對象列表信息;一個(gè)用來存放控制關(guān)鍵字對象列表信息。用來存放函數(shù)對象列表信息的哈希表的鍵設(shè)為起始樁點(diǎn),值為函數(shù)名和結(jié)束樁點(diǎn);用來存放控制邏輯關(guān)鍵字對象列表信息的哈希表的鍵設(shè)為判定真樁點(diǎn),值為關(guān)鍵字名和判定假樁點(diǎn)。
[0104]3) Stack
[0105]棧的特性是先進(jìn)后出,可以用來記錄函數(shù)的當(dāng)前狀態(tài)和關(guān)鍵字的當(dāng)前狀態(tài)。例如,一個(gè)函數(shù)中調(diào)用了其他的函數(shù),雖然該函數(shù)是先于其他函數(shù)被執(zhí)行的,但是仍需等到其他的函數(shù)執(zhí)行完成后才能結(jié)束。也就是說該函數(shù)的結(jié)束樁點(diǎn)最后退棧。
[0106]可知,拆分算法是動(dòng)態(tài)路徑拆分的核心,在設(shè)計(jì)拆分算法的過程中,結(jié)合動(dòng)態(tài)路徑和函數(shù)調(diào)用路徑的特點(diǎn),拆分算法所要處理的代碼結(jié)構(gòu)可分為以下四種類型,所述步驟43中根據(jù)樁點(diǎn)值類型的不同對動(dòng)態(tài)路徑進(jìn)行不同的拆分處理即是基于這種類型實(shí)現(xiàn)的:
[0107]I)函數(shù)樁點(diǎn)
[0108]遇到函數(shù)真樁點(diǎn)時(shí),將其與函數(shù)假樁點(diǎn)棧中的棧頂元素進(jìn)行比較,如果不相等,則將該樁點(diǎn)進(jìn)行函數(shù)真樁點(diǎn)棧的入棧操作,并記錄該函數(shù)真樁點(diǎn)所對應(yīng)的函數(shù)名,同時(shí)將其對應(yīng)的假樁點(diǎn)也進(jìn)行函數(shù)假樁點(diǎn)棧的入棧操作;遇到函數(shù)假樁點(diǎn),則對函數(shù)真樁點(diǎn)棧和函數(shù)假樁點(diǎn)棧進(jìn)行出棧操作。
[0109]2)遞歸情況
[0110]遇到函數(shù)真樁點(diǎn)時(shí),將其與函數(shù)假樁點(diǎn)棧中的棧頂元素進(jìn)行比較,如果相等,則說明該函數(shù)發(fā)生了遞歸。對于函數(shù)遞歸的情況,應(yīng)記錄每次遞歸時(shí)的路徑,并與遞歸數(shù)組里已有的路徑進(jìn)行比較。其中,遞歸數(shù)組是用來存放每次遞歸時(shí)的路徑,初始時(shí)為空。如果發(fā)現(xiàn)該路徑不存在于遞歸數(shù)組中,則將該路徑添加到遞歸路徑數(shù)組里,否則舍棄該條路徑。
[0111]3)循環(huán)情況
[0112]遇到循環(huán)關(guān)鍵字判定真樁點(diǎn),將其與循環(huán)真樁點(diǎn)棧的棧頂元素進(jìn)行比較,如果相等,則說明是當(dāng)前循環(huán)。記錄每次循環(huán)時(shí)的路徑,并與循環(huán)數(shù)組里已有的路徑進(jìn)行比較。其中,循環(huán)數(shù)組是用來存放每次循環(huán)時(shí)的路徑,初始時(shí)為空。如果發(fā)現(xiàn)有不同的路徑,則將該條路徑添加到循環(huán)路徑數(shù)組里,否則舍棄該條路徑;如果發(fā)現(xiàn)該樁點(diǎn)與棧頂元素不相等,則說明進(jìn)入下一個(gè)循環(huán),遞歸調(diào)用循環(huán)模塊函數(shù)。
[0113]4)選擇情況
[0114]遇到選擇關(guān)鍵字的時(shí)候,在一次實(shí)際執(zhí)行時(shí),只能執(zhí)行一條分支。要么是真分支語句、要么是假分支語句。因此無需對該結(jié)構(gòu)塊進(jìn)行拆分處理,直接處理下一個(gè)結(jié)構(gòu)塊即可。
[0115]三、動(dòng)態(tài)路徑的匹配
[0116]通過拆分算法將動(dòng)態(tài)路徑拆分成函數(shù)調(diào)用路徑集后,還需和函數(shù)調(diào)用基本路徑集進(jìn)行匹配,以驗(yàn)證拆分結(jié)果是否正確。如果拆分后得到的函數(shù)調(diào)用路徑集與函數(shù)調(diào)用基本路徑集出現(xiàn)不匹配的情況,則說明當(dāng)前采用的動(dòng)態(tài)路徑拆分算法不能較好的對動(dòng)態(tài)路徑進(jìn)行拆分,需要根據(jù)匹配的結(jié)構(gòu)分析拆分算法的缺陷,并做相應(yīng)的修改。如果匹配成功,說明拆分后得到的函數(shù)調(diào)用路徑集中的函數(shù)調(diào)用路徑都包含于函數(shù)調(diào)用基本路徑集,則該函數(shù)調(diào)用路徑集為函數(shù)調(diào)用基本路徑集的一個(gè)子集。關(guān)于將函數(shù)調(diào)用路徑子集與函數(shù)調(diào)用基本路徑集進(jìn)行匹配,其涉及所述步驟5的技術(shù)方案,具體包括:
[0117]步驟51,將函數(shù)調(diào)用基本路徑集里的函數(shù)調(diào)用路徑存放到ArrayList數(shù)組中;
[0118]步驟52,遍歷ArrayList數(shù)組,將函數(shù)調(diào)用基本路徑集里的函數(shù)調(diào)用路徑構(gòu)建成樹形結(jié)構(gòu);
[0119]步驟53,在函數(shù)調(diào)用基本路徑集的樹形結(jié)構(gòu)中查找是否存在函數(shù)調(diào)用路徑子集的函數(shù)調(diào)用路徑,當(dāng)且僅當(dāng)一個(gè)函數(shù)調(diào)用路徑子集中的所有函數(shù)調(diào)用路徑都存在于樹形結(jié)構(gòu)中時(shí),該函數(shù)調(diào)用路徑子集能成功匹配函數(shù)調(diào)用基本路徑集,否則匹配不成功,需重新對動(dòng)態(tài)路徑進(jìn)行拆分。
[0120]本實(shí)施例中,針對上述步驟的匹配算法需要使用以下數(shù)據(jù)結(jié)構(gòu):
[0121]I)樹
[0122]樹形結(jié)構(gòu)是一種重要的非線性數(shù)據(jù)結(jié)構(gòu),是以分支關(guān)系定義的層次結(jié)構(gòu)。函數(shù)調(diào)用基本路徑集中的函數(shù)調(diào)用路徑之間是因?yàn)榉种шP(guān)系而造成彼此之間的不同的。根據(jù)函數(shù)調(diào)用基本路徑集的特性,將集合中的函數(shù)調(diào)用路徑構(gòu)造成樹的結(jié)構(gòu)。每個(gè)結(jié)點(diǎn)代表一個(gè)函數(shù),樹中的每一條分支代表一條函數(shù)調(diào)用路徑,如圖3所示。從而,將動(dòng)態(tài)路徑的匹配過程轉(zhuǎn)化成了在樹中進(jìn)行查找的過程。對樹進(jìn)行查找,效率將非常的高,它的時(shí)間復(fù)雜度為0(n*k*h),其中η為函數(shù)調(diào)用路徑子集的個(gè)數(shù),k為樹中結(jié)點(diǎn)的最大度,h為樹的深度。而對函數(shù)調(diào)用路徑子集中的每條路徑與函數(shù)調(diào)用基本路徑集中的每個(gè)路徑進(jìn)行比較的算法復(fù)雜度為0(mn),其中m為函數(shù)調(diào)用基本路徑集中的個(gè)數(shù),η為函數(shù)調(diào)用路徑子集的個(gè)數(shù)。可見,將函數(shù)調(diào)用基本路徑集轉(zhuǎn)化為樹的結(jié)構(gòu),能夠提高動(dòng)態(tài)路徑的匹配效率。
[0123]2) HashTable
[0124]數(shù)組在使用前,需先規(guī)定其大小。但是針對函數(shù)調(diào)用基本路徑集,事先不知道每個(gè)結(jié)點(diǎn)會(huì)有多少個(gè)子節(jié)點(diǎn)。因此,數(shù)組并不能夠滿足以樹形結(jié)構(gòu)表示的函數(shù)調(diào)用基本路徑集的存儲(chǔ)需求。哈希表是一種集合結(jié)構(gòu),其容量可根據(jù)需要自動(dòng)擴(kuò)充。哈希表的鍵為函數(shù)名,值為類對象。
[0125]本實(shí)施例中,構(gòu)造存儲(chǔ)樹結(jié)構(gòu)的類為:
[0126]

Class A {

int flag;

HashTabIe<sl_ring, A> nodes;


}
[0127]另外,根據(jù)上述內(nèi)容,針對函數(shù)調(diào)用基本路徑集的樹形結(jié)構(gòu),進(jìn)行匹配時(shí)主要涉及兩個(gè)方面的技術(shù):
[0128](I)函數(shù)調(diào)用基本路徑集的樹形結(jié)構(gòu)建立
[0129]進(jìn)行函數(shù)調(diào)用基本路徑的樹形結(jié)構(gòu)構(gòu)建時(shí),針對每個(gè)函數(shù)調(diào)用路徑進(jìn)行構(gòu)建。構(gòu)建時(shí)應(yīng)注意,要隨時(shí)跟蹤當(dāng)前節(jié)點(diǎn)的上一個(gè)節(jié)點(diǎn),因?yàn)榭赡茉谝粭l分支上有相同的函數(shù)名。樹形結(jié)構(gòu)的建立過程與Trie樹的建立過程相似,其本質(zhì)上就是對樹中元素的查找過程。每次從函數(shù)調(diào)用基本路徑集中選取一條路 徑,從樹的根節(jié)點(diǎn)開始搜索,在根節(jié)點(diǎn)的所有子節(jié)點(diǎn)中查找函數(shù)調(diào)用路徑中的第一個(gè)被調(diào)用函數(shù),若查找成功,則轉(zhuǎn)入相應(yīng)的子樹,繼續(xù)查找函數(shù)調(diào)用路徑的下一個(gè)被調(diào)用函數(shù);若查找失敗,則將被調(diào)用函數(shù)的信息作為當(dāng)前節(jié)點(diǎn)的子節(jié)點(diǎn),添加到樹中,并轉(zhuǎn)入該子樹繼續(xù)查找。迭代上述過程,直至對函數(shù)調(diào)用路徑的最后一個(gè)被調(diào)用函數(shù)成功查找或插入樹中。對函數(shù)調(diào)用基本路徑中的每一條路徑循環(huán)上述操作,即可實(shí)現(xiàn)其樹形結(jié)構(gòu)的建立。
[0130](2)函數(shù)調(diào)用路徑集在樹形結(jié)構(gòu)中的查找
[0131]驗(yàn)證函數(shù)調(diào)用路徑集中的函數(shù)調(diào)用路徑是否包含于函數(shù)調(diào)用基本路徑集中,實(shí)際上是在函數(shù)調(diào)用基本路徑集的樹形結(jié)構(gòu)中進(jìn)行查找函數(shù)調(diào)用路徑的過程。若查找成功,則說明該條函數(shù)調(diào)用路徑包含于函數(shù)調(diào)用基本路徑集中;若查找失敗,則說明該條函數(shù)調(diào)用路徑不存在于函數(shù)調(diào)用基本路徑集中。當(dāng)且僅當(dāng)一個(gè)函數(shù)調(diào)用路徑子集中的所有路徑都存在于函數(shù)調(diào)用基本路徑集時(shí),該函數(shù)調(diào)用路徑子集能夠成功匹配函數(shù)調(diào)用基本路徑集,從而說明動(dòng)態(tài)路徑拆分算法是正確的。否則,該函數(shù)調(diào)用路徑子集不能夠與函數(shù)調(diào)用基本路徑集成功匹配,說明動(dòng)態(tài)路徑拆分算法是不正確的,需對拆分算法進(jìn)行修改。
[0132]四、動(dòng)態(tài)路徑集的優(yōu)化
[0133]所述步驟6中優(yōu)化動(dòng)態(tài)路徑集包括兩個(gè)方面:一是基于動(dòng)態(tài)路徑集本身進(jìn)行的優(yōu)化,二是基于動(dòng)態(tài)路徑集中的各函數(shù)調(diào)用路徑子集間的包含關(guān)系進(jìn)行的優(yōu)化;
[0134]所述基于動(dòng)態(tài)路徑集本身進(jìn)行的優(yōu)化具體包括:在將動(dòng)態(tài)路徑添加到動(dòng)態(tài)路徑集之前,判斷動(dòng)態(tài)路徑集中是否已存在該條動(dòng)態(tài)路徑,若存在,則說明該條動(dòng)態(tài)路徑是重復(fù)的動(dòng)態(tài)路徑,將其舍棄,同時(shí)將對應(yīng)的測試數(shù)據(jù)也一并舍棄;若不存在,則將該條動(dòng)態(tài)路徑添加到動(dòng)態(tài)路徑集中。
[0135]所述基于動(dòng)態(tài)路徑集中的各函數(shù)調(diào)用路徑子集間的包含關(guān)系進(jìn)行的優(yōu)化具體包括:計(jì)算出函數(shù)調(diào)用基本路徑集中的函數(shù)調(diào)用路徑被動(dòng)態(tài)路徑覆蓋的條數(shù),記為Ti,以及每條動(dòng)態(tài)路徑覆蓋函數(shù)調(diào)用路徑的條數(shù),記為Ri ;挑選出所有必不可少的動(dòng)態(tài)路徑,然后從函數(shù)調(diào)用基本路徑集中刪除被動(dòng)態(tài)路徑所覆蓋的函數(shù)調(diào)用路徑,重新計(jì)算Ti,Ri的值,迭代執(zhí)行;當(dāng)沒有必不可少的動(dòng)態(tài)路徑時(shí),挑選覆蓋函數(shù)調(diào)用路徑最多的動(dòng)態(tài)路徑,然后從函數(shù)調(diào)用基本路徑集中刪除該條動(dòng)態(tài)路徑所覆蓋的函數(shù)調(diào)用路徑,重新計(jì)算Ti,Ri的值,并再次查看是否有必不可少的動(dòng)態(tài)路徑,迭代執(zhí)行。
[0136]對動(dòng)態(tài)路徑集優(yōu)化算法的實(shí)現(xiàn)需要使用以下數(shù)據(jù)結(jié)構(gòu):
[0137]I) ArrayList
[0138]ArrayList數(shù)組用來存放動(dòng)態(tài)路徑集中的所有動(dòng)態(tài)路徑、優(yōu)化后的動(dòng)態(tài)路徑集。
[0139]2) HashTable
[0140]使用HashTable來存放每個(gè)測試需求被滿足的所有測試用例Ti。鍵用來存放函數(shù)調(diào)用基本路徑集中的函數(shù)調(diào)用路徑,值用來存放所有滿足該條測試需求的測試用例。每條測試用例所滿足的測試需求Ri也用HashTable表示。鍵用來存放動(dòng)態(tài)路徑集中的每條動(dòng)態(tài)路徑,值用來存放每條測試用例所滿足的測試需求集。
[0141]五、覆蓋率計(jì)算
[0142]一般的覆蓋率計(jì)算公式為:
[0143]
【權(quán)利要求】
1.一種基于函數(shù)調(diào)用路徑的覆蓋率動(dòng)態(tài)跟蹤方法,其特征在于,包括: 步驟1,對被測源代碼進(jìn)行插樁預(yù)處理,得到函數(shù)對象列表和控制關(guān)鍵字對象列表; 步驟2,獲取源代碼的函數(shù)調(diào)用基本路徑集; 步驟3,執(zhí)行測試用例,并運(yùn)行經(jīng)步驟I插樁后的源代碼,獲得由源代碼的執(zhí)行路徑的樁點(diǎn)數(shù)據(jù)流組成的動(dòng)態(tài)路徑; 步驟4,根據(jù)函數(shù)對象列表和控制關(guān)鍵字對象列表提供的信息,對步驟3獲得的動(dòng)態(tài)路徑進(jìn)行拆分,得到測試用例所覆蓋的函數(shù)調(diào)用路徑子集; 步驟5,將函數(shù)調(diào)用路徑子集與函數(shù)調(diào)用基本路徑集進(jìn)行匹配,確保函數(shù)調(diào)用路徑子集是屬于函數(shù)調(diào)用基本路徑集的子集; 步驟6,將所有函數(shù)調(diào)用路徑子集作為一個(gè)動(dòng)態(tài)路徑集,優(yōu)化該動(dòng)態(tài)路徑集; 步驟7,計(jì)算優(yōu)化后的動(dòng)態(tài)路徑集占函數(shù)調(diào)用基本路徑集的比率,得到覆蓋率。
2.根據(jù)權(quán)利要求1所述的覆蓋率動(dòng)態(tài)跟蹤方法,其特征在于,所述步驟I具體包括: 步驟11,選擇插樁點(diǎn); 步驟12,設(shè)計(jì)樁函數(shù),并將樁函數(shù)插入到選擇的插樁點(diǎn)中; 步驟13,存放插入樁函數(shù)后生成的插樁信息,包括函數(shù)對象列表信息和控制關(guān)鍵字對象列表信息。.
3.根據(jù)權(quán)利要求2所述的覆蓋率動(dòng)態(tài)跟蹤方法,其特征在于,所述步驟11具體包括:基于塊結(jié)構(gòu)劃分源代碼,以源代碼所包括的每個(gè)函數(shù)作為一個(gè)塊結(jié)構(gòu),再針對每個(gè)塊結(jié)構(gòu),將函數(shù)起始點(diǎn)、控制邏輯關(guān)鍵字所在點(diǎn)和函數(shù)結(jié)束點(diǎn)作為插樁點(diǎn)。
4.根據(jù)權(quán)利要求1所述的覆蓋率動(dòng)態(tài)跟蹤方法,其特征在于,所述步驟4中對動(dòng)態(tài)路徑進(jìn)行拆分具體包括: 步驟41,分別讀入動(dòng)態(tài)路徑、函數(shù)對象列表及控制邏輯關(guān)鍵字對象列表; 步驟42,將動(dòng)態(tài)路徑包含的每個(gè)樁點(diǎn)值存放到ArrayList數(shù)組里,將函數(shù)對象列表和控制邏輯關(guān)鍵字對象列表的信息分別存放到哈希表中; 步驟43,將動(dòng)態(tài)路徑里的樁點(diǎn)值分別與函數(shù)對象列表和控制關(guān)鍵字對象列表進(jìn)行比較,根據(jù)樁點(diǎn)值類型的不同對動(dòng)態(tài)路徑進(jìn)行不同的拆分處理。
5.根據(jù)權(quán)利要求1所述的覆蓋率動(dòng)態(tài)跟蹤方法,其特征在于,所述步驟5中將函數(shù)調(diào)用路徑子集與函數(shù)調(diào)用基本路徑集進(jìn)行匹配具體包括: 步驟51,將函數(shù)調(diào)用基本路徑集里的函數(shù)調(diào)用路徑存放到ArrayList數(shù)組中; 步驟52,遍歷ArrayList數(shù)組,將函數(shù)調(diào)用基本路徑集里的函數(shù)調(diào)用路徑構(gòu)建成樹形結(jié)構(gòu); 步驟53,在函數(shù)調(diào)用基本路徑集的樹形結(jié)構(gòu)中查找是否存在函數(shù)調(diào)用路徑子集的函數(shù)調(diào)用路徑,當(dāng)且僅當(dāng)一個(gè)函數(shù)調(diào)用路徑子集中的所有函數(shù)調(diào)用路徑都存在于樹形結(jié)構(gòu)中時(shí),該函數(shù)調(diào)用路徑子集能成功匹配函數(shù)調(diào)用基本路徑集,否則匹配不成功,需重新對動(dòng)態(tài)路徑進(jìn)行拆分。
6.根據(jù)權(quán)利要求1所述的覆蓋率動(dòng)態(tài)跟蹤方法,其特征在于,所述步驟6中優(yōu)化動(dòng)態(tài)路徑集包括兩個(gè)方面:一是基于動(dòng)態(tài)路徑集本身進(jìn)行的優(yōu)化,二是基于動(dòng)態(tài)路徑集中的各函數(shù)調(diào)用路徑子集間的包含關(guān)系進(jìn)行的優(yōu)化; 所述基于動(dòng)態(tài)路徑集本身進(jìn)行的優(yōu)化具體包括:在將動(dòng)態(tài)路徑添加到動(dòng)態(tài)路徑集之前,判斷動(dòng)態(tài)路徑集中是否已存在該條動(dòng)態(tài)路徑,若存在,則說明該條動(dòng)態(tài)路徑是重復(fù)的動(dòng)態(tài)路徑,將其舍棄,同時(shí)將對應(yīng)的測試數(shù)據(jù)也一并舍棄;若不存在,則將該條動(dòng)態(tài)路徑添加到動(dòng)態(tài)路徑集中; 所述基于動(dòng)態(tài)路徑集中的各函數(shù)調(diào)用路徑子集間的包含關(guān)系進(jìn)行的優(yōu)化具體包括:計(jì)算出函數(shù)調(diào)用基本路徑集中的函數(shù)調(diào)用路徑被動(dòng)態(tài)路徑覆蓋的條數(shù),記為Ti,以及每條動(dòng)態(tài)路徑覆蓋函數(shù)調(diào)用路徑的條數(shù),記為Ri ;挑選出所有必不可少的動(dòng)態(tài)路徑,然后從函數(shù)調(diào)用基本路徑集中刪除被動(dòng)態(tài)路徑所覆蓋的函數(shù)調(diào)用路徑,重新計(jì)算Ti, Ri的值,迭代執(zhí)行;當(dāng)沒有必不可少的動(dòng)態(tài)路徑時(shí),挑選覆蓋函數(shù)調(diào)用路徑最多的動(dòng)態(tài)路徑,然后從函數(shù)調(diào)用基本路徑集中刪除該條動(dòng)態(tài)路徑所覆蓋的函數(shù)調(diào)用路徑,重新計(jì)算Ti, Ri的值,并再次查看是否有必不可少的動(dòng)態(tài)路徑,迭代執(zhí)行。
7.一種基于函數(shù)調(diào)用路徑的覆蓋率動(dòng)態(tài)跟蹤裝置,其特征在于,包括: 插樁預(yù)處理模塊,其用于對被測源代碼進(jìn)行插樁預(yù)處理,得到函數(shù)對象列表和控制關(guān)鍵字對象列表; 基本路徑集獲取模塊,其用于獲取源代碼的函數(shù)調(diào)用基本路徑集; 動(dòng)態(tài)路徑獲取模塊,其 連接所述插樁預(yù)處理模塊,用于執(zhí)行測試用例,并運(yùn)行經(jīng)所述插樁預(yù)處理模塊插樁后的源代碼,獲得由源代碼的執(zhí)行路徑樁點(diǎn)數(shù)據(jù)流組成的動(dòng)態(tài)路徑;動(dòng)態(tài)路徑拆分模塊,其連接所述插樁預(yù)處理模塊及所述動(dòng)態(tài)路徑獲取模塊,用于根據(jù)函數(shù)對象列表和控制關(guān)鍵字對象列表提供的信息,對獲得的動(dòng)態(tài)路徑進(jìn)行拆分,得到測試用例所覆蓋的函數(shù)調(diào)用路徑子集; 路徑匹配模塊,其連接所述基本路徑集獲取模塊及所述動(dòng)態(tài)路徑拆分模塊,用于將函數(shù)調(diào)用路徑子集與函數(shù)調(diào)用基本路徑集進(jìn)行匹配,確保函數(shù)調(diào)用路徑子集是屬于函數(shù)調(diào)用基本路徑集的子集; 路徑集優(yōu)化模塊,其連接所述路徑匹配模塊,用于將經(jīng)所述匹配模塊處理過的所有函數(shù)調(diào)用路徑子集作為一個(gè)動(dòng)態(tài)路徑集,并優(yōu)化該動(dòng)態(tài)路徑集; 覆蓋率計(jì)算模塊,其連接所述路徑集優(yōu)化模塊用于計(jì)算優(yōu)化后的動(dòng)態(tài)路徑集占函數(shù)調(diào)用基本路徑集的比率,得到覆蓋率。
8.根據(jù)權(quán)利要求7所述的覆蓋率動(dòng)態(tài)跟蹤裝置,其特征在于,所述插樁預(yù)處理模塊包括: 插樁點(diǎn)選擇模塊,其用于以源代碼所包括的每個(gè)函數(shù)作為一個(gè)塊結(jié)構(gòu),再針對每個(gè)塊結(jié)構(gòu),將函數(shù)起始點(diǎn)、控制邏輯關(guān)鍵字所在點(diǎn)和函數(shù)結(jié)束點(diǎn)作為插樁點(diǎn); 樁函數(shù)設(shè)計(jì)模塊,其連接所述插樁點(diǎn)選擇模塊,用于設(shè)計(jì)樁函數(shù),并將樁函數(shù)插入到選擇的插樁點(diǎn)中; 插樁信息存放模塊,其連接所述樁函數(shù)設(shè)計(jì)模塊,用于存放插入樁函數(shù)后生成的插樁信息,包括函數(shù)對象列表信息和控制關(guān)鍵字對象列表信息。
9.根據(jù)權(quán)利要求7所述的覆蓋率動(dòng)態(tài)跟蹤裝置,其特征在于,所述動(dòng)態(tài)路徑拆分模塊包括: 信息讀入模塊,其用于分別讀入動(dòng)態(tài)路徑和函數(shù)對象列表及控制邏輯關(guān)鍵字對象列表; 信息存放模塊,其連接所述信息讀入模塊,用于將動(dòng)態(tài)路徑包含的每個(gè)樁點(diǎn)值存放到ArrayList數(shù)組里,將函數(shù)對象列表和控制邏輯關(guān)鍵字對象列表的信息分別存放到哈希表中; 拆分執(zhí)行模塊,其連接所述信息存放模塊,用于將動(dòng)態(tài)路徑里的樁點(diǎn)值分別與函數(shù)對象列表和控制關(guān)鍵字對象列表進(jìn)行比較,根據(jù)樁點(diǎn)值類型的不同對動(dòng)態(tài)路徑進(jìn)行不同的拆分處理。
10.根據(jù)權(quán)利要求7所述的覆蓋率動(dòng)態(tài)跟蹤裝置,其特征在于,所述路徑匹配模塊包括: 路徑存放模塊,其用于將函數(shù)調(diào)用基本路徑集里的函數(shù)調(diào)用路徑存放到ArrayList數(shù)組中; 樹形結(jié)構(gòu)建立模塊,其連接所述路徑存放模塊,用于遍歷ArrayList數(shù)組,將函數(shù)調(diào)用基本路徑集里的函數(shù)調(diào)用路徑構(gòu)建成樹形結(jié)構(gòu); 查找模塊,其連接所述樹形結(jié)構(gòu)建立模塊,用于在函數(shù)調(diào)用基本路徑集的樹形結(jié)構(gòu)中查找是否存在函數(shù)調(diào)用路徑子集的函數(shù)調(diào)用路徑,當(dāng)且僅當(dāng)一個(gè)函數(shù)調(diào)用路徑子集中的所有函數(shù)調(diào)用路徑都存在于樹形結(jié)構(gòu)中時(shí),該函數(shù)調(diào)用路徑子集能成功匹配函數(shù)調(diào)用基本路徑集,否則匹配不成功,并重.新對動(dòng)態(tài)路徑進(jìn)行拆分。
【文檔編號(hào)】G06F11/36GK103473171SQ201310379892
【公開日】2013年12月25日 申請日期:2013年8月28日 優(yōu)先權(quán)日:2013年8月28日
【發(fā)明者】牟永敏 申請人:北京信息科技大學(xué), 牟永敏
網(wǎng)友詢問留言 已有0條留言
  • 還沒有人留言評(píng)論。精彩留言會(huì)獲得點(diǎn)贊!
1
平阳县| 从化市| 平武县| 三明市| 乌兰浩特市| 海口市| 岢岚县| 郎溪县| 乌审旗| 神木县| 古丈县| 白河县| 荆州市| 舟山市| 阿城市| 西乌珠穆沁旗| 通州区| 海南省| 宜君县| 于田县| 洛阳市| 米脂县| 碌曲县| 平阳县| 广灵县| 沧州市| 长武县| 吴堡县| 漳州市| 南阳市| 宁城县| 八宿县| 年辖:市辖区| 景洪市| 白山市| 酉阳| 长治市| 顺义区| 贵定县| 金沙县| 澄江县|