基于頻譜的增量式缺陷定位方法
【專利摘要】本發(fā)明公開了基于頻譜的增量式缺陷定位方法,該方法采用增量式逐步迭代的方法,利用程序信息和測試信息找出程序缺陷語句或者預(yù)測缺陷語句可能存在的范圍。該方法首先通過運行測試用例,收集測試用例在程序中執(zhí)行的覆蓋信息即頻譜信息以及運行結(jié)果信息生成覆蓋信息表;再對覆蓋信息表進行統(tǒng)計分析,計算程序語句可疑度,根據(jù)可疑度對程序語句進行排序獲得缺陷定位序列;根據(jù)定位序列中語句排列逐個進行排錯,直到找到引發(fā)程序異常的語句。本發(fā)明從多角度采取優(yōu)化策略提高軟件缺陷定位的效率,提高了測試用例的覆蓋率,很好地減少了收集頻譜的開銷,提高了可疑度算法的精確性。
【專利說明】
基于頻譜的増量式缺陷定位方法
技術(shù)領(lǐng)域
[0001] 本發(fā)明涉及一種基于頻譜的增量式缺陷定位方法,屬于軟件測試技術(shù)領(lǐng)域。
【背景技術(shù)】
[0002] 多年來,人們在缺陷定位的研究中提出了許多方法,主要通過程序的靜態(tài)信息和 動態(tài)信息來定位程序錯誤。但獲得靜態(tài)信息的開銷較大,對于大型軟件,全面的靜態(tài)分析甚 至是不現(xiàn)實的,而動態(tài)信息的收集主要是運行測試用例,并不會給測試帶來過多的開銷。同 時,由于動態(tài)信息包含了程序運行時的信息,與利用靜態(tài)信息的方法相比,可以提供更準(zhǔn)確 的結(jié)果。
[0003] 利用程序頻譜信息進行缺陷定位,是目前比較切實有效的軟件缺陷定位方法,程 序頻譜是一種表示程序運行時的覆蓋信息,反應(yīng)程序運行某一特征的代碼剖面信息。程序 頻譜與程序行為之間存在著一定的關(guān)系,通過研究運行失敗測試用例得到的頻譜信息與運 行通過測試用例得到的頻譜信息之間的差異性可為軟件缺陷定位提供幫助。對于程序的單 條語句,被失敗測試用例執(zhí)行的越多,通過的測試用例執(zhí)行的越少,語句含有錯誤的可能性 就越大,發(fā)生錯誤的概率就越大。利用這種特征對程序語句被通過測試用例以及失敗測試 用例的覆蓋情況進行統(tǒng)計分析,找出含有缺陷的程序語句。對基于頻譜的程序定位方法,這 里
【發(fā)明內(nèi)容】
[0004] 本發(fā)明目的在于解決了上述現(xiàn)有技術(shù)的不足,提出了一種基于頻譜的增量式缺陷 定位方法,該方法采取優(yōu)化策略產(chǎn)生一種新的缺陷定位方法,使缺陷定位的效率更高,本發(fā) 明采取一種增量式的方法執(zhí)行測試用例,并考慮了大量測試用例情況下的邊際效應(yīng),對后 續(xù)增加的測試用例對可疑度的貢獻進行動態(tài)加權(quán),對語句可疑度進行修正,根據(jù)修正后的 定位序列進行缺陷定位。具體概述如下:對采集的所有測試用例集進行等量隨機分組,選擇 其中一組測試用例執(zhí)行,收集本組測試用例的執(zhí)行信息(即頻譜)以及結(jié)果信息,生成覆蓋 信息表,對覆蓋信息表進行統(tǒng)計分析,進行語句可疑度計算,根據(jù)可疑度值的大小獲得定位 序列。重新選擇一組新的測試用例執(zhí)行,原組測試用例的頻譜信息與結(jié)果信息與新組測試 用例執(zhí)行信息進行動態(tài)加權(quán)對原可疑度進行修正,獲得新的定位序列,新的定位序列與原 定位序列進行比較,若序列趨于穩(wěn)定或測試用例均執(zhí)行完畢,則終止測試用例的執(zhí)行,根據(jù) 獲得的最新定位序列逐個進行排錯,直到找到引發(fā)程序異常的語句。
[0005] 本發(fā)明解決其技術(shù)問題所采取的技術(shù)方案是:一種基于頻譜的增量式缺陷定位方 法,該方法包括如下步驟:
[0006] 步驟1:獲取可執(zhí)行的待測程序以及測試用例集,測試用例分組;
[0007] 步驟1-1:獲取待測的可執(zhí)行程序P;
[0008] 步驟1-2:將程序P的每條語句進行編號,按序編為Si,S2,S3,…,Sj,…,Sn,將編號集 合記為S,其中&表示程序P的第j條語句,η為程序語句的總條數(shù);
[0009] 步驟1-3:獲取測試用例集,記為Listsuites;
[0010] 步驟1-4:將測試用例集Listsuites中的測試用例進行等量隨機分組,共分成k組, 并對組進行編號,依次編為Groupi,Group2,Group3, · · ·,Groupk;
[0011] 步驟2:運行測試用例,獲取覆蓋信息表;
[0012]步驟2-1:選取一組測試用例;
[0013]步驟2-2:對選擇的測試用例集中的測試用例進行編號,按序編為
[0014] testi,test2,test3,…,testi,…,testm,其中testi表示選定測試用例組中的第i 條測試用例,m為選定測試用例組中測試用例的總條數(shù);
[0015] 步驟2-3:從選定的測試用例集按序讀取測試用例test1;
[001 ?] 步驟2-4:運行當(dāng)前讀取的測試用例testi;
[0017] 步驟2-5:標(biāo)記語句覆蓋情況;
[0018] 步驟2-5-1:判定程序P的語句&是否被測試用例覆蓋,如果"是",則轉(zhuǎn)步驟2-5-2:,否則轉(zhuǎn)步驟2-5-3;
[0019] 步驟2-5-2:將語句標(biāo)記為1;
[0020] 步驟2-5-3:將語句標(biāo)記為0;
[0021 ]步驟2-5-4:判定程序P是否執(zhí)行結(jié)束,如果"是",則轉(zhuǎn)步驟2.5.5),否則轉(zhuǎn)步驟2-5-1:,直到程序P的η條語句均被判定覆蓋情況;
[0022] 步驟2-5-5:收集執(zhí)行完當(dāng)前測試用例獲得的頻譜信息
[0023] T(Sl·),T(S2),T(S3),…,T(Sj),…,T(Sn),其中T(Sj)表示程序Ρ的第j條語句被當(dāng)前 運行測試用例覆蓋的情況;
[0024] 步驟2-6:判定測試用例運行結(jié)果;
[0025] 步驟2-6-1:獲取當(dāng)前測試用例test在程序中的實際運行結(jié)果;
[0026] 步驟2-6-2:獲取當(dāng)前測試用例test的預(yù)期運行結(jié)果;
[0027]步驟2-6-3:判斷實際運行結(jié)果與預(yù)期結(jié)果是否相同,如果"是",轉(zhuǎn)步驟 2.6.4),否則轉(zhuǎn)步驟2.6.5);
[0028] 步驟2-6-4:運行結(jié)果記為0,記入Ri中,Ri表示測試用例運行結(jié)果情況;
[0029] 步驟2-6-5:運行結(jié)果記為1,記入Ri中,Ri表示測試用例運行結(jié)果情況;
[0030]步驟2-7:收集測試用例testi的運行情況,記為:
[0031] F[testi]{T(Si),T(S2),T(S3),---,1(?).
[0032] 其中:T(SJ表示語句&被當(dāng)前測試用例覆蓋的情況,即頻譜信息也表示當(dāng)前測試 用例的運行通過情況,即結(jié)果信息;
[0033] 步驟 2.8:將卩[仏8。]{1'(51),1'(52),1'(5 3),...,1'(5」),...,1'(511),1^}按行存入如圖1 所示的覆蓋信息表G中,G由F[testi] {I^SO,T(S2),T(S3),…,T(Sj),···,T(Sn),Ri}累積生 成;
[0034] 步驟2.9:判斷選定的測試用例集中的所有的測試用例是否均被執(zhí)行,如果"是", 轉(zhuǎn)步驟2-10:,否則轉(zhuǎn)步驟2-3;
[0035] 步驟2-10:獲取包含選定測試用例集中所有測試用例的頻譜信息以及結(jié)果信息的 覆蓋信息表G;
[0036] 步驟3:可疑度計算;
[0037]步驟3-1 :針對Sj語句,收集執(zhí)行完選定測試用例集所提供的<aef,aep,anf,a np>j 中,ef表示測試用例i執(zhí)行語句&,且執(zhí)行實際結(jié)果與預(yù)期結(jié)果不一致;
[0038] ep表示某測試用i例執(zhí)行語句&,且執(zhí)行實際結(jié)果與預(yù)期結(jié)果一致;
[0039] nf表示某測試用例i沒有執(zhí)行語句&,且執(zhí)行實際結(jié)果與預(yù)期結(jié)果不一致;
[0040] np表示某測試用例i沒有執(zhí)行語句&,且執(zhí)行實際結(jié)果與預(yù)期結(jié)果一致;
[0041]
羨示語句&被測試用例覆蓋且測試用例失敗的次數(shù),表示覆蓋 1=1 信息表G的第i行第j列的元素值,心表示覆蓋信息G中R列的第i行元素值;
[0042] 一
表示語句&被測試用例覆蓋且測試用例通過的次數(shù); /=1
[0043]
I示語句&沒有被測試用例覆蓋且測試用例失敗的次數(shù); i=\
[0044]
,表示語句&沒有被測試用例覆蓋且測試用例通過的次數(shù);
[0045] 步驟3_2 :令〈Aef,Aep,Anf,Anp〉=〈Elef, Elep,Elnf, ε?ηρ〉,將〈Aef,Aep,Anf,Anp〉初始化為〈Elef, aep, anf, anp〉的 ξ!ξ| 如值;
[0046] 步驟3-3:根據(jù)公式1計算語句Sj的可疑度fsj;
[0047]
[0048] 步驟3_4 :將爲(wèi),己入Zrough中,Zrough表不可規(guī)度值序列;
[0049] 步驟3-5:判斷所有語句是否均獲得可疑度值,如果"是",轉(zhuǎn)步驟3-6,否則轉(zhuǎn)步驟 3-1;
[0050] 步驟3-6:獲得語句可疑度值序列Z_gh;
[0051 ]步驟4:獲取初始定位序列;
[0052] 步驟4-丨:獲取程序語句編號序列S: Sl,&,&,…,Sj,…, Sn;
[0053] 步驟4-2:獲取語句序列S: &,&,&,…,&,…,Sn相應(yīng)語句的可疑度值序列
[0054] Zrciugh: Zi,Z2,Z3,…,Zj,…,Zn,其中Zj表示第j條語句的可疑度值;
[0055] 步驟4-3:根據(jù)Z_gh中可疑度值進行降序排列;
[0056] 步驟4-4:根據(jù)已排序的Z_gh序列,匹配對應(yīng)的程序語句編號,對
[0057] S: Si,&,S3,…,Sj,…,行排序,排序后的S即為缺陷定位序列,記為Srough;
[0058] 步驟5:測試用例增量;
[0059] 步驟5-1:增加一組測試用例并執(zhí)行;
[0060] 步驟5-1-1:選取下一組測試用例;
[0061 ] 步驟5-1-2:重復(fù)步驟2-2:至步驟3-1;
[0062]步驟5-2:可疑度修正;
[0063] 步驟5-2-1:獲取執(zhí)行完上一組測試用例獲得語句Sj的<Aef,Aep,Anf,A np>;
[0064] 步驟5-2-2:將ef,ep,nf,np統(tǒng)稱為ev,利用公式2分別計算ef,ep,nf,np再次發(fā)生 的概率P(ef),p(ep),p(nf),p(np);
[0065]
[0066] 步驟5-2-3:利用公式3分別計算#,叩,1^,即再次發(fā)生后所提供的信息量訊#),!1 (ep),H(nf),Η(ηρ);
[0067]
[0068] 步驟5-2-4 :利用公式4分別計算ef,ep,nf,ηρ的增量權(quán)重aef,aep,anf,α ηρ;
[0069]
[0070] 其中,k為測試用例組數(shù),1/k即為選定執(zhí)行的測試用例條數(shù)占測試用例總條數(shù)的 百分比;
[0071] 步驟5-2-5:獲取執(zhí)行完本選定組測試用例獲得的語句Sj的<aef,a ep,anf,anp>4_ 公式5,分別計算Arf , Aep , Anf , Αηρ,
[0072] Aev=Aev+aevXaev 公式 5
[0073] 步驟5-2-6:利用公式1重新計算語句可疑度爲(wèi);
[0074] 步驟5-2-7:將fsj記入zsiight中,zsiight表示修正后的可疑度值序列;
[0075]步驟5-2-8:判斷所有語句是否均獲得修正后的可疑度值,如果"是",轉(zhuǎn)步驟 5.2.9),否則轉(zhuǎn)步驟5-2-1;
[0076]步驟5-2-9:獲得語句可疑度值序列zsllght;
[0077] 步驟5-3:定位序列修正;
[0078] 步驟5-34 :獲取語句編號序列S: Sl,&,&,…,Sj,…, Sn;
[0079] 步驟5-3-2:獲取語句序列S: &,&,&,…,&,…,Sn相應(yīng)語句的可疑度值序列 [0080] Zsiight: Zl,Z2,Z3,…,Z j,…,Zn,其中Z j表示修正后的第j條語句的可疑度值;
[0081]步驟5-3-3:根據(jù)Zsllght中可疑度值進行降序排列;
[0082] 步驟5-3-4:根據(jù)已排序的zslight序列,匹配對應(yīng)的程序語句編號,對
[0083] S: Si,S2, S3,…,S」,…,Sn?行排序,將排序后的S序列即為修正后定位序列,記為 Sslight;
[0084] 步驟6:定位序列判定;
[0085]步驟6-1:檢驗所有測試用例是否均執(zhí)行完畢,如果"是",轉(zhuǎn)步驟6-8;
[0086] 步驟6-2:獲取定位序列Srcmgh;
[0087] 步驟6-3:獲取定位序列Ssiight;
[0088] 步驟6-4:將Sslight與Srcmgh進行比較,檢驗Sslight相對于Srcmgh是否穩(wěn)定,如果"是", 轉(zhuǎn)步驟6-8:,否則轉(zhuǎn)步驟6-5;
[0089] 步驟 6-5:令 Srciugh = Ssiight,
[0090] 步驟 6-6: Sslight 清空;
[0091] 步驟6-7:轉(zhuǎn)步驟5-1;
[0092]步驟6-8: Sslight判定為最終定位序列;
[0093]步驟7:根據(jù)定位序列進行缺陷語句定位;
[0094]步驟7-1:獲取最終定位序列Ssiight;
[0095] 步驟7-2:讀取Ssiight中的編號Sj;
[0096] 步驟7-3 :查看程序P的語句Sj是否含有缺陷,如果"是",轉(zhuǎn)步驟7-4:,否則轉(zhuǎn)步驟 7-2;
[0097]步驟7-4:確定程序語句&為缺陷語句;
[0098]步驟7-5:檢驗程序P所有缺陷是否均被定位,如果"是",轉(zhuǎn)步驟7-6:,否則轉(zhuǎn)步驟 7-2;
[0099]步驟7-6:缺陷定位結(jié)束。
[0100] 有益效果:
[0101] 1、本發(fā)明利用增量的方式執(zhí)行測試用例,在語句可疑度計算中考慮到了多測試用 例的邊際效應(yīng),對缺陷定位序列進行實時修正,提高缺陷定位的效率,降低軟件開發(fā)過程中 缺陷定位的成本。
[0102] 2、本發(fā)明采取優(yōu)化策略產(chǎn)生一種新的缺陷定位方法,使缺陷定位的效率更高,該 方法采取一種增量式的方法執(zhí)行測試用例,并考慮了大量測試用例情況下的邊際效應(yīng),對 后續(xù)增加的測試用例對可疑度的貢獻進行動態(tài)加權(quán),對語句可疑度進行修正,根據(jù)修正后 的定位序列進行缺陷定位。
[0103] 3、本發(fā)明增量式體現(xiàn)在測試用例的分批執(zhí)行,實時對定位序列進行修正,旨在減 少收集程序譜的開銷,提高軟件缺陷定位的效率。
[0104] 4、本發(fā)明從多角度采取優(yōu)化策略提高軟件缺陷定位的效率,提高了測試用例的覆 蓋率,很好地減少了收集頻譜的開銷,提高了可疑度算法的精確性。
【附圖說明】
[0105] 圖1為本發(fā)明測試用例執(zhí)行過程示意圖。
[0106] 圖2為本發(fā)明程序語句可疑度計算示意圖。
[0107] 圖3為本發(fā)明初始定位序列生成示意圖。
[0108] 圖4為本發(fā)明修正定位序列生成示意圖。
[0109] 圖5為本發(fā)明最終定位序列判定示意圖。
[0110] 圖6為本發(fā)明缺陷定位過程示意圖。
【具體實施方式】
[0111] 下面結(jié)合說明書附圖對本發(fā)明創(chuàng)造作進一步的詳細(xì)說明。
[0112] 本發(fā)明的基于頻譜的增量式缺陷定位方法是通過執(zhí)行測試用例獲得動態(tài)信息進 行缺陷定位的方法。首先選定部分測試用例執(zhí)行,對程序運行結(jié)果進行收集產(chǎn)生覆蓋信息 表,再根據(jù)覆蓋信息表進行統(tǒng)計分析,進行可疑度計算,進而根據(jù)程序可疑度獲得初始定位 序列,采取逐步添加測試用例的方式對定位序列進行實時修正,獲得排序相對穩(wěn)定的定位 序列,從測試用例集執(zhí)行到定位缺陷語句的實現(xiàn)步驟為:
[0113] 步驟1:獲取可執(zhí)行的待測程序以及測試用例集,測試用例分組;
[0114] 步驟1-1:獲取待測的可執(zhí)行程序P,即包含缺陷語句的可執(zhí)行程序;
[0115]步驟1-2:對程序P的每條語句進行編號,依次編為Si,S2,S3,…,Sj,…,S n,其中,Sj 表示程序P的第j條語句。對語句進行編號為可疑度計算以及語句排序提供便利;
[0116] 步驟1-3:獲取測試用例集,記為Listsuites,測試用例按照特定的規(guī)則利用測試 工具自動生成。一條測試用例由測試輸入、執(zhí)行條件以及預(yù)期結(jié)果組成;
[0117] 步驟1-4:將測試用例集Listsuites中的測試用例進行等量隨機分組,共分成k組, 并對組進行編號,依次編為Groupi,Group2,Group3, · · ·,Groupk;測試用例的分組為測試用 例的增量執(zhí)行提供便利。隨機分組的目的在于使得每組測試用例中包含各種類型的測試用 例,保證每組測試用例的多樣性。
[0118] 步驟2:運行測試用例,獲取程序執(zhí)行的動態(tài)信息,如圖1所示;
[0119] 步驟2-1:選取一組測試用例;
[0120]步驟2-2:對選擇的測試用例集中的測試用例進行編號,按序編為
[0121] testi,test2,test3,···,testi,···,testm,其中testi表示選定測試用例組中的第i 條測試用例,m為選定測試用例組中測試用例的總條數(shù);對測試用例進行編號便于對執(zhí)行情 況進行統(tǒng)計分析;
[0122] 步驟2-3:從選定的測試用例集中讀取測試用例test1;
[0123] 步驟2-4:根據(jù)測試用例的輸入以及執(zhí)行條件執(zhí)行讀取的測試用例test1;
[0124] 步驟2-5:在測試用例執(zhí)行過程中對未覆蓋語句以及覆蓋的語句用"0"和"Γ進行 區(qū)分標(biāo)記,"0"表示語句沒有被當(dāng)前測試用例執(zhí)行,T表示語句被當(dāng)前測試用例執(zhí)行;
[0125] 步驟2-6:測試用例執(zhí)行結(jié)束,獲取實際運行結(jié)果,將執(zhí)行結(jié)果與測試用例的預(yù)期 結(jié)果進行比較,用"〇"和"Γ進行區(qū)分標(biāo)記執(zhí)行結(jié)果。"〇"表示實際執(zhí)行結(jié)果與預(yù)期結(jié)果一 致,測試用例為通過的測試用例;"Γ表示實際執(zhí)行結(jié)果與預(yù)期結(jié)果不一致,測試用例為失 敗的測試用例;
[0126] 步驟2-7:用gcoverage收集測試用例的執(zhí)行情況,執(zhí)行情況包括測試用例執(zhí)行過 程中的語句覆蓋情況以及最終執(zhí)行結(jié)果情況,由"〇"和"Γ表示為頻譜
[0127] - 也即頻譜信息,表示測試 用例運行軌跡。其中,T(SJ表示測試用例test對語句&的覆蓋情況,心表示第i條測試用例 的運行結(jié)果;步驟2.9將按行存入覆 蓋信息表G 中,G由 累積生成,形成覆 蓋信息表目的在于對覆蓋信息進行統(tǒng)計分析。
[0128] 步驟2.8:轉(zhuǎn)步驟2-3:,讀取并執(zhí)行下一條測試用例,收集測試用例的運行情況,持 續(xù)讀取測試用例并執(zhí)行,直至選定的測試用例集中的測試用例均被執(zhí)行并獲得覆蓋信息;
[0129] 步驟2.9:獲得包含選定測試用例集中所有測試用例的覆蓋信息表G;
[0130] 步驟3:用可疑度值來衡量語句含有缺陷的可能性,進行語句可疑度計算,如圖2;
[0131] 步驟3-1:針對&語句,對覆蓋信息表進行統(tǒng)計分析,收集執(zhí)行完選定測試用例集 所提供的〈&^~ [),&1^311[)>,其中,#表示測試用例討丸行語句&,且執(zhí)行實際結(jié)果與預(yù)期結(jié)果 不一致;
[0132] ep表示某測試用i例執(zhí)行語句&,且執(zhí)行實際結(jié)果與預(yù)期結(jié)果一致;
[0133] nf表示某測試用例i沒有執(zhí)行語句&,且執(zhí)行實際結(jié)果與預(yù)期結(jié)果不一致;
[0134] np表示某測試用例i沒有執(zhí)行語句&,且執(zhí)行實際結(jié)果與預(yù)期結(jié)果一致;
[0135]
表示語句&被測試用例覆蓋且測試用例失敗的次數(shù),表示覆蓋 /=:1 信息表G的第i行第j列的元素值,心表示覆蓋信息G中R列的第i行元素值;
[0136]
,表示語句&被測試用例覆蓋且測試用例通過的次數(shù);
[0137]
羨示語句&沒有被測試用例覆蓋且測試用例失敗的次數(shù);
[0138]
,表示語句&沒有被測試用例覆蓋且測試用例通過的次數(shù);
[0139] 步驟 3-2:令<Aef,Aep,Anf,A叩> =<aef, aep,anf, a叩〉,即將<Aef,Aep,Anf,A叩〉初始化為〈 Elef, Elep,Elnf, Strip〉的 ξ!ξ| 如'直;
[0140] 步驟3-3:根據(jù)公式1計算語句&的可疑度fSj,語句可疑度值越大,含有缺陷的可能 性就越大,語句可疑度值越大,含有缺陷的可能性就越大;
[0141]
[0142] 步驟3-4:對計算的語句可疑度值進行存儲,將爲(wèi)〇^.4??4/,4ρ)記入Z roug h 中,Zrough表 示可疑度值序列;
[0143] 步驟3-5:轉(zhuǎn)步驟3-1:,計算下一條語句的可疑度值,持續(xù)進行,直到所有的語句均 進行統(tǒng)計分析,獲得可疑度值;
[0144] 步驟3-6:獲得完整語句可疑度值序列Z_gh;
[0145] 步驟4:獲取初始定位序列如圖3;
[0146]步驟4-1:獲取程序語句編號序列S: Si,&,S3,…,Sj,…,Sn,S為程序語句編號集合;
[0147] 步驟4-2:獲取語句序列S: &,&,&,…,&,…,Sn相應(yīng)語句的可疑度值序列
[0148] zrciugh: Zi,Z2,Z3,…,Z」,…,Zn,其中Z」表示第j條語句的可疑度值,可疑度作為錯誤 定位的依據(jù),可疑度值越大的語句含有缺陷的可能性就越大;
[0149] 步驟4-3:根據(jù)Zrciugh中可疑度值進行降序排列,排列越前的語句含有缺陷的可能性 越大;
[0150] 步驟4-4:根據(jù)已排序的Z_gh序列,匹配對應(yīng)的程序語句編號,對
[0151] SiAA,···々,···,Sn?行排序,可疑度值大的語句編號排列在前,若遇到可疑 度值相同的語句則編號小的語句排列在前,排序后的S即為缺陷定位序列,記為S rciugh,Srciugh 即為初始定位序列;
[0152] 步驟5:增量式的缺陷定位方法中,本發(fā)明采取逐步增加測試用例的方式,并實時 對缺陷定位序列進行修正。測試用例增量執(zhí)行,修正定位序列生成如圖4;
[0153] 步驟5-1:選擇下一組測試用例并執(zhí)行,收集覆蓋信息,生成覆蓋信息表;
[0154] 步驟5.2)針對語句&,對覆蓋信息表進行統(tǒng)計,獲得執(zhí)行完本組測試用例獲得的〈 Bef ? Bep , Bnf ? Βηρ^ ;
[0155] 步驟5-3 :利用<Aef,Aep,Anf,Αηρ>,利用公式2分別計算ef,ep,nf,ηρ再次發(fā)生的概 率,并利用公式3計算各自發(fā)生所提供的信息量,利用公式4求得加權(quán)因子,如公式5中利用
[0156] 加權(quán)因子對〈Aef,Aep,Anf,Anp>進行修正,獲得修正后的〈Aef,Aep,Anf,Anp> ;
[0157]
[0158]
[0159] Aev = Aev+aevXaev 公式 5
[0160] 其中,ev為ef,ep,nf,np的統(tǒng)稱,計算過程中分別用ef,ep,nf,np進行替換。
[0161 ]步驟5-3:獲取語句Sj的<Aef,Aep,Anf,A np>,利用公式1重新計算語句的可疑度值,并 存入可疑度值序列Zslight中;
[0162] 步驟5.4:轉(zhuǎn)步驟5-2,計算下一條語句的可疑度,持續(xù)進行,直至所有語句均重新 獲得可疑度值,并計入Zslight;
[0163] 步驟5.5:對可疑度值序列2811咖進行降序排列,根據(jù)已排序的2811咖同步對程序語 句編號序列S進行排序,可疑度值大的語句編號在前,若遇到可疑度值相同的語句則語句編 號小的語句在前,獲得修正后的定位序列S sllght;
[0164] 步驟6:定位序列作為缺陷定位的依據(jù),需要判定修正后的定位序列是否為最終的 定位序列,定位序列的判定如圖5;
[0165] 步驟6-1:判定所有測試用例是否均被執(zhí)行,如果均被執(zhí)行則判定Ssllght為最終的 定位序列,否則轉(zhuǎn)步驟6-2;
[0166] 步驟6-2:將定位序列Srough與Sslight進行比較,若Sslight相對于Srough穩(wěn)定則判定 Ssiigh為最終的定位序列,否則轉(zhuǎn)步驟6-3;
[0167] 步驟6-3:將Ssiight序列賦給Srciugh,S siight清空,轉(zhuǎn)步驟5-1:,執(zhí)行一組新的測試用 例,獲取新的Sslight,進行定位序列判定;
[0168] 步驟7:根據(jù)定位序列定位缺陷語句,缺陷定位過程如圖6;
[0169] 步驟7-1:定位序列作為缺陷定位的依據(jù),獲取最終定位序列Ssiight;
[0170] 步驟7-2:語句在Ssiight中的順序決定了缺陷查找的順序,讀取Ssiight中的編號Sj;
[0171] 步驟7-3:查看程序P中語句Sj是否含有缺陷,如果含有缺陷,則斷定語句Sj為缺陷 語句,否則轉(zhuǎn)步驟7-2;
[0172] 步驟7-5:檢驗程序P所有缺陷是否均被定位,如果程序P的缺陷均已定位,缺陷定 位結(jié)束,否則轉(zhuǎn)步驟7-2。
[0173] 表1:覆蓋信息表
[0174]
'[0175]本發(fā)明是請根據(jù)上述表^的覆蓋信息表所示行描述I ' ' '
【主權(quán)項】
1. 一種頻譜信息去冗余優(yōu)化的軟件缺陷方法,其特征在于,所述方法包含如下步驟: 獲取初始定位序列;包括: 獲取程序語句編號序列S: Sl,S2,S3,…,Sj ,…,Sn; 獲取語句序列S : Si,S2,S3,…,Sj,…,Sn相應(yīng)語句的可疑度值序列Zrcmgh : Zl,Z2,Z3,…, 扣-。而,其中2康示第讀語句的可疑度值; 根據(jù)Zrough中可疑度值進行降序排列; 根據(jù)已排序的ZrDugh序列,匹配對應(yīng)的程序語句編號,對S : Si,S2,S3,…,Sj,…,Sn進行排 序,排序后的S即為缺陷定位序列,記為Srough ; 測試用例增量執(zhí)行;包括: 增加一組測試用例并執(zhí)行; 選取下一組測試用例; 可疑度修正; 獲取執(zhí)行完上一組測試用例獲得語句&的^6:,Aep,Anf,Anp〉; 將ef,邱,nf,np統(tǒng)稱為ev,矛Ll用公式(2)分別計算ef,ep,nf,np再次發(fā)生的概率p(ef),p (ep),p(nf),p(np);根據(jù)公式3分別計算ef,ep,nf,叩再次發(fā)生后所提供的信息量H(ef),H(ep),H(nf),H (np);根據(jù)公式4分別計算ef,邱,nf,噸的增量權(quán)重Qef,Qep,Qnf,口叩;其中,k為測試用例組數(shù),1/k即為選定執(zhí)行的測試用例條數(shù)占測試用例總條數(shù)的百分 比; 獲取執(zhí)行完本選定組測試用例獲得的語句&的<日6:,日6。,日扣,日叩〉,利用公式5,分別計算 Aef , Aep , Anf , Anp ? Aev - Aev+Qev X 過ev 根據(jù)公式1重新計算語句可疑度; 將《記入Zslight中,Zslight表示修正后的可疑度值序列; 判斷所有語句是否均獲得修正后的可疑度值; 獲得語句可疑度值序列Zslight; 定位序列修正; 獲取語句編號序列S: Sl,S2,S3,…,Sj ,…,Sn; 獲取語句序列S: Si , S2 , S3 ,…,Sj ,…,Sn相應(yīng)語句的可疑度值序列Zslight: Z1 , Z2 ,Z3 ,…, Ζ^,···,Ζη,其中Zj表示修正后的第j條語句的可疑度值; 根據(jù)Zslight中可疑度值進行降序排列; 根據(jù)已排序的Zslight序列,匹配對應(yīng)的程序語句編號,對S : Si,S2,S3,· · ·,Sj,· · ·,Sn進行排 序,將排序后的S序列即為修正后定位序列,記為Sslight; 定位序列判定; 根據(jù)定位序列進行缺陷語句定位。2. 根據(jù)權(quán)利要求1所述的一種基于頻譜信息的增增量式軟件缺陷方法,其特征在于,所 述方法包括: 步驟1:獲取可執(zhí)行的待測程序W及測試用例集,測試用例分組; 步驟1-1:獲取待測的可執(zhí)行程序P; 步驟1-2:將程序P的每條語句進行編號,按序編為Si,S2,S3,…,Sj,…,Sn,將編號集合記 為S,其中&表示程序P的第j條語句,η為程序語句的總條數(shù); 步驟1-3:獲取測試用例集,記為Listsuites; 步驟1-4:將測試用例集Listsuites中的測試用例進行等量隨機分組,共分成k組,并對 組進行編號,依次編為G;roupi,G;roup2,G;roup3,. . . iGroupk。3. 根據(jù)權(quán)利要求1所述的一種基于頻譜信息的增增量式軟件缺陷方法,其特征在于,所 述方法包括: 步驟2:運行測試用例,獲取覆蓋信息表; 步驟2-1:選取一組測試用例; 步驟2-2:對選擇的測試用例集中的測試用例進行編號,按序編為testi,tests, tests,…,testi,…,testm,其中testi表示選定測試用例組中的第i條測試用例,m為選定測 試用例組中測試用例的總條數(shù); 步驟2-3:從選定的測試用例集按序讀取測試用例testi; 步驟2-4:運行當(dāng)前讀取的測試用例testi; 步驟2-5:標(biāo)記語句覆蓋情況; 步驟2-5-1:判定程序P的語句&是否被測試用例覆蓋,如果"是",則轉(zhuǎn)步驟2-5-2:,否則 轉(zhuǎn)步驟2-5-3; 步驟2-5-2:將語句標(biāo)記為1; 步驟2-5-3:將語句標(biāo)記為0; 步驟2-5-4:判定程序P是否執(zhí)行結(jié)束,如果"是",則轉(zhuǎn)步驟2.5.5,否則轉(zhuǎn)步驟2-5-1:, 直到程序P的η條語句均被判定覆蓋情況; 步驟2-5-5 :收集執(zhí)行完當(dāng)前測試用例獲得的頻譜信息Τ ( Si),Τ (S2),Τ ( S3),…,Τ 佔),…,T(Sn),其中T位)表示程序P的第j條語句被當(dāng)前運行測試用例覆蓋的情況; 步驟2-6:判定測試用例運行結(jié)果; 步驟2-6-1:獲取當(dāng)前測試用例testi在程序中的實際運行結(jié)果; 步驟2-6-2:獲取當(dāng)前測試用例testi的預(yù)期運行結(jié)果; 步驟2-6-3:判斷testi的實際運行結(jié)果與預(yù)期結(jié)果是否相同,如果"是",轉(zhuǎn)步驟2.6.4, 否則轉(zhuǎn)步驟2.6.5; 步驟2-6-4:運行結(jié)果記為0,記入Ri中,R康示測試用例運行結(jié)果情況; 步驟2-6-5:運行結(jié)果記為1,記入Ri中,R康示測試用例運行結(jié)果情況; 步驟2-7:收集測試用例testi的運行情況,記為F[testi]{T(Si),T(S2),T(S3),.'',T (Sj),.'',T(Sn),Ri}, 其中:Τ位)表示語句&被當(dāng)前測試用例覆蓋的情況,即頻譜信息;R康示當(dāng)前測試用例 的運行通過情況,即結(jié)果信息; 步驟 2.8:將 F[testi]{T(Si),T(S2),T(S3),.'',T(Sj),..',T(Sn),Ri}按行存入如圖 1 所示 的覆蓋信息表G中,G由F[testi] mSi),T(S2),T(S3),···,T(Sj),…,T(Sn),Ri}累積生成; 步驟2.9:判斷選定的測試用例集中的所有的測試用例是否均被執(zhí)行,如果"是",轉(zhuǎn)步 驟2-10:,否則轉(zhuǎn)步驟2-3; 步驟2-10:獲取包含選定測試用例集中所有測試用例的頻譜信息W及結(jié)果信息的覆蓋 信息表G。4. 根據(jù)權(quán)利要求1所述的一種基于頻譜信息的增增量式軟件缺陷方法,其特征在于,所 述方法包括: 步驟3:可疑度計算; 步驟3-1:針對S推句,收集執(zhí)行完選定測試用例集所提供的 <曰6:,曰6。,曰扣,曰叩〉,其中如 表示測試用例i執(zhí)行語句&,且執(zhí)行實際結(jié)果與預(yù)期結(jié)果不一致; ep表示某測試用i例執(zhí)行語句&,且執(zhí)行實際結(jié)果與預(yù)期結(jié)果一致; nf表示某測試用例i沒有執(zhí)行語句&,且執(zhí)行實際結(jié)果與預(yù)期結(jié)果不一致; np表示某測試用例i沒有執(zhí)行語句&,且執(zhí)行實際結(jié)果與預(yù)期結(jié)果一致;表示語句&被測試用例覆蓋且測試用例失敗的次數(shù),Gi,j表示覆蓋信息表 G的第i行第j列的元素值,Ri表示覆蓋信息G中R列的第i行元素值,即:,表示語句&被測試用例覆蓋且測試用例通過的次數(shù);表示語句&沒有被測試用例覆蓋且測試用例失敗的次數(shù);,表示語句&沒有被測試用例覆蓋且測試用例通過的次數(shù); 步驟3-2 :令〈Aef , Aep , Anf , Anp〉一〈Elef , 3ep , Elnf , 3ηρ〉,將〈Aef , Aep , Anf , Anp〉初始化為〈日6:£^, Elep , anf,日叩〉的當(dāng)前值; 步驟3-3:根據(jù)公式1計算語句&的可疑度/、;步驟3-4 :將名,記入Zrough中,Zrough表不可規(guī)度值序列; 步驟3-5:判斷所有語句是否均獲得可疑度值,如果"是",轉(zhuǎn)步驟3-6,否則轉(zhuǎn)步驟3-1; 步驟3-6 :獲得語句可疑度值序列Zrough。5. 根據(jù)權(quán)利要求1所述的一種基于頻譜信息的增增量式軟件缺陷方法,其特征在于,所 述定位序列判定包括: 步驟6-1:檢驗所有測試用例是否均執(zhí)行完畢,如果"是",轉(zhuǎn)步驟6-8; 步驟6-2 :獲取定位序列Srough ; 步驟6-3:獲取定位序列Sslight; 步驟6-4 :將Sslight與Srmjgh進行比較,檢驗Ssligh捕對于Srmjgh是否穩(wěn)定,如果"是",轉(zhuǎn)步驟 6-8:,否則轉(zhuǎn)步驟6-5; 步驟6-5 :令Srough二 Sslight; 步驟6-6: Sslight清空; 步驟6-7:轉(zhuǎn)步驟5-1; 步驟6-8: Sslight判定為最終定位序列。6. 根據(jù)權(quán)利要求1所述的一種基于頻譜信息的增增量式軟件缺陷方法,其特征在于,根 據(jù)定位序列進行缺陷語句定位包括: 步驟7-1:獲取最終定位序列Sslight; 步驟7-2:讀取Sslight中的編號Sj; 步驟7-3:查看程序P的語句&是否含有缺陷,如果"是",轉(zhuǎn)步驟7-4:,否則轉(zhuǎn)步驟7-2; 步驟7-4:確定程序語句&為缺陷語句; 步驟7-5:檢驗程序P所有缺陷是否均被定位,如果"是",轉(zhuǎn)步驟7-6:,否則轉(zhuǎn)步驟7-2; 步驟7-6:缺陷定位結(jié)束。7. 根據(jù)權(quán)利要求1所述的一種基于頻譜信息的增增量式軟件缺陷方法,其特征在于,所 述方法是對采集的所有測試用例集進行等量隨機分組,選擇其中一組測試用例執(zhí)行,收集 本組測試用例的執(zhí)行信息W及結(jié)果信息,生成覆蓋信息表,對覆蓋信息表進行統(tǒng)計分析,進 行語句可疑度計算,根據(jù)可疑度值的大小獲得定位序列,重新選擇一組新的測試用例執(zhí)行, 原組測試用例的頻譜信息與結(jié)果信息與新組測試用例執(zhí)行信息進行動態(tài)加權(quán)對原可疑度 進行修正,獲得新的定位序列,新的定位序列與原定位序列進行比較,若序列趨于穩(wěn)定或測 試用例均執(zhí)行完畢,則終止測試用例的執(zhí)行,根據(jù)獲得的最新定位序列逐個進行排錯,直到 找到引發(fā)程序異常的語句。
【文檔編號】G06F11/36GK105975388SQ201610184439
【公開日】2016年9月28日
【申請日】2016年3月28日
【發(fā)明人】王子元, 張曉紅, 張衛(wèi)豐, 周國強, 張迎周
【申請人】南京郵電大學(xué)