專利名稱:基于控制流交集的缺陷自動定位裝置及其自動定位方法
技術(shù)領(lǐng)域:
本發(fā)明涉及軟件測試領(lǐng)域,具體涉及一種基于控制流交集的缺陷自動定位裝置及 其自動定位方法。
背景技術(shù):
程序缺陷定位技術(shù)是指明一個有缺陷的程序產(chǎn)生異常行為原因的技術(shù)。程序缺陷 包括程序錯誤(error)和程序bug。傳統(tǒng)的手工缺陷定位技術(shù)包括以下幾個基本步驟在 程序中設(shè)置斷點;再次執(zhí)行程序;檢測程序狀態(tài)以定位產(chǎn)生不正確輸出的原因。顯然,這樣 的缺陷定位方式耗費大量的時間、人力和物力。并且針對規(guī)模較大的程序,這樣的工作手工 完成相當困難。因此,如何定位缺陷成為程序開發(fā)過程中的瓶頸。在自動缺陷定位領(lǐng)域,已有許多不同的技術(shù)被提出并應用到實踐當中??偟膩碚f, 這些技術(shù)可以被分為兩類靜態(tài)程序分析和動態(tài)缺陷定位。靜態(tài)程序分析是指在不執(zhí)行程 序的情況下,通過程序分析手段找出程序缺陷的技術(shù)。而動態(tài)缺陷定位技術(shù)是指在程序運 行時,通過檢測程序行為發(fā)現(xiàn)缺陷的技術(shù)。靜態(tài)程序分析的主要手段有代碼走讀、模型檢測等。代碼走讀是指程序員逐行的 審查程序源碼,顯然,這仍然是一種耗費大量的時間、人力和物力的低效手段。模型檢測是 指對被測程序建模,基于模型窮舉程序所有可達的狀態(tài),并通過檢測模型屬性發(fā)現(xiàn)潛在缺 陷的技術(shù)。由于窮舉程序所有可達的狀態(tài)會導致程序狀態(tài)轉(zhuǎn)移成指數(shù)增長,隨著程序規(guī)模 的不斷擴大,可能的程序狀態(tài)轉(zhuǎn)移將越來越趨于無窮。因此窮舉程序所有可達狀態(tài)的工作 隨程序規(guī)模擴大而難度不斷增大。由于靜態(tài)程序分析存在著費時費力和程序狀態(tài)轉(zhuǎn)移成指數(shù)增長等問題。目前動態(tài) 缺陷定位越來越成為人們關(guān)注的焦點。目前已有的主要動態(tài)缺陷定位有幾類包括基于程序數(shù)據(jù)流的動態(tài)不變式發(fā)現(xiàn)技 術(shù)定位程序缺陷,利用最近鄰概念定位缺陷,基于程序切片定位缺陷等幾種。這些方法存在以下問題
第一、許多技術(shù)仍停留在理論階段,沒有形成實際應用和已發(fā)布的具體裝置。如動態(tài)不 變式發(fā)現(xiàn)技術(shù)、利用最近鄰概念定位技術(shù)。第二、某些已有技術(shù),如最近鄰和程序切片等技術(shù),對最終報告的所有可能含有缺 陷的缺陷嫌疑點并不排序,使得程序員認為各缺陷嫌疑點等可能地含有缺陷,不利于排錯。第三,已有技術(shù)定位缺陷的準確率不高,需要進一步提高準確率,以有效地幫助程 序員定位缺陷。因此目前的缺陷定位技術(shù)尚難以滿足高效定位的應用需求,對開發(fā)效率有不利影 響。
發(fā)明內(nèi)容
本發(fā)明針對現(xiàn)有缺陷定位技術(shù)存在的費時費力以及排錯不便、定位缺陷的準確率不高等問題,提供了一種基于控制流交集的缺陷自動定位方法及其自動定位裝置。本發(fā)明提供的基于控制流交集的缺陷自動定位裝置,主要由類文件改裝模塊、測 試執(zhí)行模塊、成功與失敗分類模塊、Trace文件解析模塊、失敗執(zhí)行交集模塊、排序模塊以及 源代碼映射模塊組成。類文件改裝模塊通過在相應的程序點自動加入相應的打印語句,對 輸入的所有被測Java類文件進行改裝,并將改裝后的Java類文件和輸入的測試用例輸出 給測試執(zhí)行模塊;測試執(zhí)行模塊對所有測試用例執(zhí)行改裝后的Java類文件,收集每個測試 用例輸出的trace文件輸出給成功與失敗分類模塊;成功與失敗分類模塊根據(jù)測試執(zhí)行模 塊中測試用例執(zhí)行結(jié)果正確與否將所有trace文件分為成功trace文件與失敗trace文 件,并將這兩類trace文件傳送給Trace文件解析模塊;Trace文件解析模塊對所有成功 trace文件與所有失敗trace文件進行解析處理,將構(gòu)造的成功執(zhí)行樹形結(jié)構(gòu)集與失敗執(zhí) 行樹形結(jié)構(gòu)集傳遞給失敗執(zhí)行交集模塊;失敗執(zhí)行交集模塊對所有失敗執(zhí)行樹形結(jié)構(gòu)求交 集,將在每一個失敗執(zhí)行樹形結(jié)構(gòu)中都出現(xiàn)的程序點作為缺陷嫌疑點得到失敗執(zhí)行交集, 并將失敗執(zhí)行交集與成功執(zhí)行樹形結(jié)構(gòu)集傳遞給排序模塊;排序模塊針對失敗執(zhí)行交集中 的缺陷嫌疑點,根據(jù)每個缺陷嫌疑點在成功執(zhí)行樹形結(jié)構(gòu)集中出現(xiàn)的頻率從低到高進行排 序,將有序的所有缺陷嫌疑點輸出給源代碼映射模塊;源代碼映射模塊將有序的所有缺陷 嫌疑點映射到Java源代碼文件的相應位置,并最終將所有缺陷嫌疑點對應的源代碼位置 按每個缺陷嫌疑點含有缺陷的可能性從大到小排序后,作為缺陷定位報告顯示出來。本發(fā)明還提供一種基于控制流交集的缺陷自動定位方法,其定位處理過程包括如 下步驟
步驟一、類文件改裝模塊對所有的被測Java類文件改裝,在三類程序點函數(shù)入口、函 數(shù)return語句和分支選擇語句,自動加入相應的打印語句;
步驟二、測試執(zhí)行模塊將所有測試用例按照步驟一中改裝后的Java類文件執(zhí)行,并收 集每個測試用例輸出的trace文件;
步驟三、成功與失敗分類模塊根據(jù)步驟二中各測試用例執(zhí)行結(jié)果正確與否將所有 trace文件分為成功trace文件與失敗trace文件兩類;
步驟四、Trace文件解析模塊對trace文件解析通過構(gòu)造樹形數(shù)據(jù)結(jié)構(gòu)存儲trace信 息,Trace文件解析模塊解析所有的成功trace文件與所有的失敗trace文件后,得到成功 執(zhí)行樹形結(jié)構(gòu)集與失敗執(zhí)行樹形結(jié)構(gòu)集;
步驟五、失敗執(zhí)行交集模塊通過對所有失敗執(zhí)行樹形結(jié)構(gòu)求交集,得出程序中所有缺 陷嫌疑點的集合;
步驟六、排序模塊針對步驟五得到的缺陷嫌疑點,根據(jù)它們在成功執(zhí)行中出現(xiàn)的頻率 從低到高對它們排序;所述的頻率的數(shù)值是一個大于等于0,小于等于1的實數(shù),定義為該 缺陷嫌疑點在成功執(zhí)行樹形結(jié)構(gòu)集出現(xiàn)的次數(shù)與所有成功測試用例的個數(shù)的比值;
步驟七、源代碼映射模塊將排序后的各缺陷嫌疑點映射到Java源代碼文件的相應位 置,并將所有缺陷嫌疑點對應的源代碼位置按每個缺陷嫌疑點含有缺陷的可能性從大到小 排序后顯示。本發(fā)明一種基于控制流交集的缺陷自動定位裝置及其自動定位方法的優(yōu)點在 于
(1)所述的裝置直接作用于Java類文件,不需要提供有關(guān)于程序設(shè)計的具體業(yè)務邏輯和設(shè)計方案。(2)所述的裝置所有缺陷定位過程實現(xiàn)了自動化,不需要人工干預,節(jié)省了大量人 力,物力,從而提高了程序的開發(fā)效率。(3)本發(fā)明提供的缺陷自動定位方法采用了一種新型有效的缺陷定位方法來定位 缺陷,并對診斷得出的缺陷嫌疑點進行排序,提高了排錯效率,并使得定位缺陷的準確率提
尚ο
圖1為本發(fā)明缺陷自動定位裝置的架構(gòu)示意圖; 圖2為本發(fā)明缺陷自動定位方法的步驟流程圖3為一個含有bug的示例程序mid ();
圖4為圖3中的示例程序經(jīng)本發(fā)明缺陷自動定位方法改裝后的程序; 圖5為本發(fā)明缺陷自動定位方法步驟二中各用例執(zhí)行改裝后示例程序mid ()產(chǎn)生打 印輸出的位置示意圖6為本發(fā)明缺陷自動定位方法步驟二執(zhí)行測試用例[1]輸出的trace文件的示例
圖7為本發(fā)明缺陷自動定位方法步驟四中trace解析模塊解析trace文件后形成的樹 形結(jié)構(gòu)的一個示例圖8為本發(fā)明中失敗執(zhí)行交集模塊計算程序所有缺陷嫌疑點的集合的結(jié)果示意圖; 圖9為本發(fā)明中排序模塊計算各缺陷嫌疑點頻率并排序的結(jié)果示意圖。
具體實施例方式下面將結(jié)合附圖對本發(fā)明作進一步的詳細說明。本發(fā)明的目的是提出一種基于控制流交集的缺陷自動定位裝置及其自動定位方 法,其思想是一個缺陷對程序執(zhí)行產(chǎn)生影響,當且僅當程序執(zhí)行了該缺陷所在的代碼行, 所以要發(fā)現(xiàn)一個缺陷,可以通過對所有的失敗測試用例求交集,落在交集中的程序點是缺 陷可能存在的點,使得缺陷定位更加準確。本發(fā)明提供的一種基于控制流交集的缺陷自動定位裝置,如圖1所示,包括類文 件改裝模塊1、測試執(zhí)行模塊2、成功與失敗分類模塊3、Trace文件解析模塊4、失敗執(zhí)行交 集模塊5、排序模塊6以及源代碼映射模塊7。將需要缺陷檢測的Java類文件和其對應的測試用例輸入類文件改裝模塊1中,類 文件改裝模塊1對輸入的所有待測的Java類文件改裝,在相應的程序點自動加入相應的打 印語句。類文件改裝模塊1將改裝后的Java類文件和輸入的測試用例輸出給測試執(zhí)行模 塊2。所述的程序點有三類函數(shù)入口、函數(shù)return語句和分支選擇語句,在執(zhí)行到該相應 的程序點時,打印語句將輸出打印內(nèi)容至trace文件。測試執(zhí)行模塊2依據(jù)改裝后的Java類文件執(zhí)行所有測試用例,收集每個測試用例 輸出的trace文件輸出給成功與失敗分類模塊3。成功與失敗分類模塊3根據(jù)測試執(zhí)行模塊2中各測試用例執(zhí)行結(jié)果正確與否將所 有trace文件分為成功與失敗兩類,并將分得的成功trace文件與失敗trace文件傳送給Trace文件解析模塊4。Trace文件解析模塊4對trace文件進行解析處理,使得trace文件能被后續(xù)模塊 識別與處理。所述解析處理后的trace文件將以樹形結(jié)構(gòu)組織,其中樹的根節(jié)點是測試用 例信息,分支與葉節(jié)點是三類程序點信息。每個測試用例的trace文件構(gòu)造相應的一個樹 形數(shù)據(jù)結(jié)構(gòu)存儲。Trace文件解析模塊4解析成功trace文件與失敗trace文件,并分別構(gòu) 造為成功執(zhí)行樹形結(jié)構(gòu)與失敗執(zhí)行樹形結(jié)構(gòu)。所有的成功執(zhí)行樹形結(jié)構(gòu)構(gòu)成成功執(zhí)行樹形 結(jié)構(gòu)集,所有的失敗執(zhí)行樹形結(jié)構(gòu)構(gòu)成失敗執(zhí)行樹形結(jié)構(gòu)集。Trace文件解析模塊4將失敗 執(zhí)行樹形結(jié)構(gòu)集與成功執(zhí)行樹形結(jié)構(gòu)集傳遞給失敗執(zhí)行交集模塊5。失敗執(zhí)行交集模塊5通過對所有失敗執(zhí)行樹形結(jié)構(gòu)求交集,得出程序中所有可能 含有缺陷的缺陷嫌疑點的集合形成失敗執(zhí)行交集。所述的缺陷嫌疑點是指在每一個失敗執(zhí) 行樹形結(jié)構(gòu)中都出現(xiàn)的程序點。失敗執(zhí)行交集模塊5將失敗執(zhí)行交集與成功執(zhí)行樹形結(jié)構(gòu) 集傳遞給排序模塊6。排序模塊6針對失敗執(zhí)行交集中的缺陷嫌疑點,根據(jù)每個缺陷嫌疑點在成功執(zhí)行 樹形結(jié)構(gòu)集中出現(xiàn)的頻率從低到高進行排序,將形成的有序的可能含缺陷的所有程序點即 有序的所有缺陷嫌疑點輸出給源代碼映射模塊7。其中,所述頻率的數(shù)值是一個大于等于 0,小于等于1的實數(shù),定義為該缺陷嫌疑點在成功執(zhí)行樹形結(jié)構(gòu)集出現(xiàn)的次數(shù)/所有成功 測試用例的個數(shù)。其中,成功執(zhí)行樹形結(jié)構(gòu)集是成功執(zhí)行樹形結(jié)構(gòu)的集合,某缺陷嫌疑點在 成功執(zhí)行樹形結(jié)構(gòu)集出現(xiàn)的次數(shù)等于成功執(zhí)行樹形結(jié)構(gòu)集中含有該缺陷嫌疑點的成功執(zhí) 行樹形結(jié)構(gòu)的數(shù)目。源代碼映射模塊7將按照接收到的有序的缺陷嫌疑點集合中的各缺陷嫌疑點映 射到Java源代碼文件的相應位置,將所有缺陷嫌疑點對應的源代碼位置按每個缺陷嫌疑 點含有缺陷的可能性從大到小排序后,作為缺陷定位報告顯示給程序員。其中每個缺陷嫌 疑點含有缺陷的可能性采用一個數(shù)值來表征,該數(shù)值是一個大于等于0,小于等于1的實 數(shù),其值等于1減去頻率的值??梢钥闯觯l率的值越小,對應缺陷嫌疑點含有缺陷的可能 性越高。本發(fā)明還提供一種應用上述缺陷自動定位裝置的缺陷自動定位方法,如圖2所 示,包括如下步驟
步驟一將需要缺陷檢測的Java類文件和其對應的測試用例輸入類文件改裝模塊1 中,類文件改裝模塊1對所有的被測Java類文件進行改裝,在相應的程序點自動加入相應 的打印語句。本步驟將Java類文件中的特殊程序點與打印語句代碼綁定。當執(zhí)行到該程 序點時,打印語句將輸出打印內(nèi)容至trace文件。被改裝的程序點有三類函數(shù)入口、函數(shù) return語句和分支選擇語句。如圖3所示,為說明本發(fā)明的過程所使用的一個示例程序mid (),程序mid ()每 次輸入3個整數(shù)參數(shù),輸出3個整數(shù)中處于中間位置的整數(shù)值。程序在第7行中存在一個 bug,if語句的條件表達式正確的形式應該是“x<z”。圖4為改裝后的示例程序mid()。經(jīng) 改裝,程序中的函數(shù)入口、函數(shù)return語句和分支選擇語句會自動加入相應的打印語句。 如圖4所示,圖4中(1)是對程序中的函數(shù)入口的改裝,使之在執(zhí)行時輸出標識“Method_ Call”及函數(shù)名,記錄該函數(shù)被調(diào)用;圖4中(6)是對程序中的函數(shù)return語句的改裝,使 之在執(zhí)行時輸出標識“MethocLEnd”及函數(shù)名,記錄該函數(shù)調(diào)用過程結(jié)束;圖4中(2)和(3)記錄if分支選擇語句調(diào)用過程,其中(2)輸出標識“IF_Call”、if分支對應的源代碼行號 和分支語句內(nèi)容“if (y < ζ) ”,記錄該分支被調(diào)用,其中,該if分支對應的源代碼行號為如 圖3中源代碼的第4行;(3)輸出標識“IF_0ut”及if分支對應的源代碼行號和分支語句 內(nèi)容,記錄該分支調(diào)用結(jié)束;同理,圖4中(4)和(5)記錄else分支選擇語句調(diào)用過程。需 要進一步說明的是(a)程序mid ()的其他分支語句,如mid ()源代碼中的第5行的if 分支選擇語句等也如同上述第4行if分支選擇語句那樣被改裝,這里不再贅述;(b)本發(fā) 明直接作用于Java類文件,為了便于說明,仍采用源代碼形式展示,實際的改裝效果與圖 示相同。步驟二 測試執(zhí)行模塊2將所有測試用例按照步驟一中改裝后的Java類文件執(zhí) 行,并輸出trace文件。如圖5所示,本發(fā)明實施例的測試用例一欄中共有6個測試用例,每個測試用例的 編號以方括號表示,每個測試用例的首欄中3個數(shù)字依次表示輸入的3個整數(shù)參數(shù)。每個圓形實心黑點表示執(zhí)行每個測試用例時,改裝后的mid ()程序輸出打印信息 的位置。其中,第1行為函數(shù)mid ()的入口,第14行則是函數(shù)mid ()的return語句,標 注圓形實心黑點的其他行表示分支語句調(diào)用時,輸出打印信息的位置,如圖5中第4行。每個測試用例的最后一欄標明了用例執(zhí)行成功與失敗的情況,“F”表示執(zhí)行失敗, “P”表示執(zhí)行成功。如圖5所示,測試用例[1]、[3]、[4]執(zhí)行成功;測試用例[2]、[5]、[6] 執(zhí)行失敗。通過輸入測試用例和改裝后的Java類文件,測試執(zhí)行模塊2執(zhí)行所有測試用例, 并收集每個測試用例輸出的trace文件。如圖6所示為輸入測試用例[1],3個整數(shù)分別為1,2,3時,輸出的trace文件的 內(nèi)容。結(jié)合圖5中的第一個測試用例的打印信息輸出位置示意可知,trace文件真實的反 映了程序函數(shù)調(diào)用和分支選擇等控制狀態(tài)的轉(zhuǎn)移情況。步驟三成功與失敗分類模塊3根據(jù)步驟二中各測試用例執(zhí)行結(jié)果正確與否將所 有trace文件分為成功trace文件與失敗trace文件兩類。通過判讀trace文件中是否報 告執(zhí)行錯誤或程序執(zhí)行結(jié)果是否與預期結(jié)果一致自動將trace文件分為成功trace文件與 失敗trace文件兩類。其中,如果trace中報告發(fā)生錯誤或者程序執(zhí)行結(jié)果與預期結(jié)果不一 致,則該trace文件劃入失敗trace文件一類;否則trace文件劃入成功trace文件一類。如圖5所示,測試用例中用例[1]、[3]、[4]產(chǎn)生的trace文件劃為成功trace文 件一類,測試用例[2]、[5]、[6]產(chǎn)生的trace文件劃為失敗trace文件一類。步驟四=Trace文件解析模塊4對步驟三中分類后的trace文件進行解析,使得解 析后的trace文件能被后續(xù)模塊識別與處理。所有的trace信息將以樹形結(jié)構(gòu)組織,其中 樹的根節(jié)點是測試用例信息,分支與葉節(jié)點是步驟一中的三類程序點信息。每個測試用例 產(chǎn)生的trace文件構(gòu)造為相應的一個樹形數(shù)據(jù)結(jié)構(gòu)存儲。如圖7所示,圖為測試用例[1]產(chǎn)生的trace文件被解析后形成樹形結(jié)構(gòu),其中樹 的根節(jié)點是測試用例[1],分支與葉節(jié)點均是步驟一中的程序點信息。第1層為方法mid() 的調(diào)用,第2層為源代碼第4行的if調(diào)用,第3層為源代碼第5行的if調(diào)用。樹形結(jié)構(gòu)的 層次關(guān)系表示了調(diào)用關(guān)系,例如測試用例[1]調(diào)用了方法mid ()。該樹中第3層為樹葉節(jié) 點,不再有子節(jié)點。完成解析后,樹形結(jié)構(gòu)使trace中的信息不丟失且能被后續(xù)模塊識別與處理。Trace文件解析模塊4解析所有的成功trace文件與所有的失敗trace文件后,得 到成功執(zhí)行樹形結(jié)構(gòu)集與失敗執(zhí)行樹形結(jié)構(gòu)集。步驟五失敗執(zhí)行交集模塊5計算所有失敗執(zhí)行的交集,找到所有缺陷嫌疑點。該 模塊通過對所有失敗執(zhí)行樹形結(jié)構(gòu)求交集,得出程序中所有缺陷嫌疑點的集合。本發(fā)明中 認為在每一個失敗的測試用例中都被執(zhí)行到的或者說每一個失敗執(zhí)行樹形結(jié)構(gòu)中都出現(xiàn) 的程序點是缺陷嫌疑點。如圖8所示,測試用例[2]、[5]、[6]均為失敗的用例,對測試用例[2]、[5]、[6] 求交集,得到如圖8所示的可能含有缺陷的所有缺陷嫌疑點,列于圖8中“嫌疑點”一欄,缺 陷嫌疑點有程序第1行、第4行、第5行、第7行以及第14行。需要說明的是第1行被視 為函數(shù)mid ()的入口,而第14行則是函數(shù)mid ()的return語句,均加入缺陷嫌疑點集合中。步驟六排序模塊6針對步驟五找到的缺陷嫌疑點,根據(jù)它們在成功執(zhí)行樹形結(jié) 構(gòu)集中出現(xiàn)的頻率由低到高對它們排序。頻率的數(shù)值是一個大于等于0,小于等于1的實 數(shù),定義為該缺陷嫌疑點在成功執(zhí)行樹形結(jié)構(gòu)集出現(xiàn)的次數(shù)/所有成功測試用例的個數(shù)。 其中,成功執(zhí)行樹形結(jié)構(gòu)集是成功執(zhí)行樹形結(jié)構(gòu)的集合,某缺陷嫌疑點在成功執(zhí)行樹形結(jié)
構(gòu)集出現(xiàn)的次數(shù)等于成功執(zhí)行樹形結(jié)構(gòu)集中含有該缺陷嫌疑點的成功執(zhí)行樹形結(jié)構(gòu)的數(shù)目。如圖9所示,本步驟針對每一個步驟五中報告的缺陷嫌疑點,根據(jù)它們在成功的 測試用例產(chǎn)生的trace文件中的出現(xiàn)頻率對它們排序,頻率越低含有缺陷的可能性越大, 排序越靠前。例如第5行缺陷嫌疑點只在1個成功的測試用例產(chǎn)生的trace文件中出現(xiàn), 即在測試用例[1]中出現(xiàn),總的成功的測試用例產(chǎn)生的trace文件數(shù)為3個,則該缺陷嫌疑 點的在成功的測試用例產(chǎn)生的trace文件中的出現(xiàn)頻率為1/3。所有缺陷嫌疑點的頻率列 于圖9中“頻率” 一欄。根據(jù)每個缺陷嫌疑點的頻率從低到高對它們排序。所有缺陷嫌疑 點的在序列中的位置列于圖9中“排序”一欄。如圖9所示,按照頻率從低到高排序后的缺 陷嫌疑點為程序第7行、第5行、第1行、第4行以及第14行。步驟七源代碼映射模塊7將步驟六中排序后的各缺陷嫌疑點映射到Java源代碼 文件的相應位置,并將排序后的所有缺陷嫌疑點對應的源代碼位置以及每個缺陷嫌疑點含 有缺陷的可能性順序顯示出來。其中每個缺陷嫌疑點含有缺陷的可能性,其數(shù)值是一個大 于等于0,小于等于1的實數(shù),其值等于1減去步驟六中頻率的值。即步驟六中的頻率值越 小,每個語句含有缺陷的可能性越高。如圖9所示,排序后第7行將作為最終報告的第一個 缺陷嫌疑點告知程序員,程序員能馬上定位程序缺陷。
權(quán)利要求
一種基于控制流交集的缺陷自動定位裝置,其特征在于,該缺陷自動定位裝置主要由類文件改裝模塊、測試執(zhí)行模塊、成功與失敗分類模塊、Trace文件解析模塊、失敗執(zhí)行交集模塊、排序模塊以及源代碼映射模塊組成;類文件改裝模塊通過在相應的程序點自動加入相應的打印語句,對輸入的所有被測Java類文件進行改裝,并將改裝后的Java類文件和輸入的測試用例輸出給測試執(zhí)行模塊;測試執(zhí)行模塊對所有測試用例執(zhí)行改裝后的Java類文件,收集每個測試用例輸出的trace文件并輸出給成功與失敗分類模塊;成功與失敗分類模塊根據(jù)測試執(zhí)行模塊中各測試用例執(zhí)行結(jié)果正確與否將所有trace文件分為成功trace文件與失敗trace文件,并將這兩類trace文件傳送給Trace文件解析模塊;Trace文件解析模塊對所有成功trace文件與所有失敗trace文件進行解析處理,將構(gòu)造的成功執(zhí)行樹形結(jié)構(gòu)集與失敗執(zhí)行樹形結(jié)構(gòu)集傳遞給失敗執(zhí)行交集模塊;失敗執(zhí)行交集模塊對所有失敗執(zhí)行樹形結(jié)構(gòu)求交集,將在每一個失敗執(zhí)行樹形結(jié)構(gòu)中都出現(xiàn)的程序點作為缺陷嫌疑點得到失敗執(zhí)行交集,并將失敗執(zhí)行交集與成功執(zhí)行樹形結(jié)構(gòu)集傳遞給排序模塊;排序模塊針對失敗執(zhí)行交集中的缺陷嫌疑點,根據(jù)每個缺陷嫌疑點在成功執(zhí)行樹形結(jié)構(gòu)集中出現(xiàn)的頻率從低到高進行排序,將形成的有序的所有缺陷嫌疑點輸出給源代碼映射模塊;源代碼映射模塊將有序的所有缺陷嫌疑點映射到Java源代碼文件的相應位置,并最終將所有缺陷嫌疑點對應的源代碼位置按每個缺陷嫌疑點含有缺陷的可能性從大到小排序后,作為缺陷定位報告顯示出來。
2.根據(jù)權(quán)利要求1所述的一種基于控制流交集的缺陷自動定位裝置,其特征在于,所 述的程序點包括三類函數(shù)入口、函數(shù)return語句和分支選擇語句。
3.根據(jù)權(quán)利要求1或2所述的一種基于控制流交集的缺陷自動定位裝置,其特征在于, 所述解析處理后的trace文件將以樹形數(shù)據(jù)結(jié)構(gòu)的形式組織,其中樹形結(jié)構(gòu)的根節(jié)點是測 試用例信息,分支與葉節(jié)點是三類程序點信息。
4.根據(jù)權(quán)利要求1所述的一種基于控制流交集的缺陷自動定位裝置,其特征在于,所 述頻率,其數(shù)值等于該缺陷嫌疑點在成功執(zhí)行樹形結(jié)構(gòu)集出現(xiàn)的次數(shù)與所有成功測試用例 的個數(shù)的比值。
5.根據(jù)權(quán)利要求1或4所述的一種基于控制流交集的缺陷自動定位裝置,其特征在于, 所述的每個缺陷嫌疑點含有缺陷的可能性,其數(shù)值等于1減去頻率的值。
6.應用權(quán)利要求1所述的缺陷自動定位裝置的缺陷自動定位方法,其特征在于,包括 以下步驟步驟一、類文件改裝模塊對所有的被測Java類文件改裝,在三類程序點函數(shù)入口、函 數(shù)return語句和分支選擇語句,自動加入相應的打印語句;步驟二、測試執(zhí)行模塊將所有測試用例按照步驟一中改裝后的Java類文件執(zhí)行,并收 集每個測試用例輸出的trace文件;步驟三、成功與失敗分類模塊根據(jù)步驟二中各測試用例執(zhí)行結(jié)果正確與否將所有 trace文件分為成功trace文件與失敗trace文件兩類;步驟四、Trace文件解析模塊對trace文件解析,通過構(gòu)造樹形數(shù)據(jù)結(jié)構(gòu)存儲trace信 息,Trace文件解析模塊解析所有的成功trace文件與所有的失敗trace文件后,得到成功 執(zhí)行樹形結(jié)構(gòu)集與失敗執(zhí)行樹形結(jié)構(gòu)集;步驟五、失敗執(zhí)行交集模塊通過對所有失敗執(zhí)行樹形結(jié)構(gòu)求交集,得出程序中所有缺陷嫌疑點的集合;步驟六、排序模塊針對步驟五得到的缺陷嫌疑點,根據(jù)它們在成功執(zhí)行中出現(xiàn)的頻率 從低到高對它們排序;所述的頻率的數(shù)值為該缺陷嫌疑點在成功執(zhí)行樹形結(jié)構(gòu)集出現(xiàn)的次 數(shù)與所有成功測試用例的個數(shù)的比值;步驟七、源代碼映射模塊將排序后的各缺陷嫌疑點映射到Java源代碼文件的相應位 置,并將排序后的所有缺陷嫌疑點對應的源代碼位置以及每個缺陷嫌疑點含有缺陷的可能 性順序顯示出來。
7.根據(jù)權(quán)利要求6所述的缺陷自動定位方法,其特征在于,步驟四中所述的樹形數(shù)據(jù) 結(jié)構(gòu)存儲trace信息,具體為樹形結(jié)構(gòu)的根節(jié)點是測試用例信息,分支與葉節(jié)點是步驟一 中的三類程序點信息。
8.根據(jù)權(quán)利要求6所述的缺陷自動定位方法,其特征在于,步驟五中所述的缺陷嫌疑 點指在每一個失敗執(zhí)行樹形結(jié)構(gòu)中都出現(xiàn)的程序點。
9.根據(jù)權(quán)利要求6所述的缺陷自動定位方法,其特征在于,步驟七中所述的可能性,其 數(shù)值等于1減去步驟六中所述的頻率的值。
全文摘要
本發(fā)明公開一種基于控制流交集的缺陷自動定位裝置及其方法。該裝置包括類文件改裝模塊、測試執(zhí)行模塊、成功/失敗分類模塊、Trace文件解析模塊、失敗執(zhí)行交集模塊、排序模塊和源代碼映射模塊,將被測Java類文件經(jīng)類文件改裝模塊改裝,在測試執(zhí)行模塊執(zhí)行各測試用例得到trace文件,成功/失敗分類模塊、Trace文件解析模塊對trace文件進行處理,由失敗執(zhí)行交集模塊、排序模塊找到缺陷嫌疑點并對其進行排序,最后源代碼映射模塊將缺陷嫌疑點映射到Java源代碼的相應位置。該方法通過對改裝的Java類文件執(zhí)行測試用例,對得到的trace文件進行分類、解析,找到缺陷嫌疑點并排序,最后將缺陷嫌疑點映射到Java源代碼文件對應位置。本發(fā)明節(jié)省了大量人力,物力,提高了排錯效率。
文檔編號G06F11/36GK101894073SQ20101025463
公開日2010年11月24日 申請日期2010年8月17日 優(yōu)先權(quán)日2010年8月17日
發(fā)明者余丹, 葉鋼, 周家杰, 李重文, 馬世龍 申請人:北京航空航天大學