栗曉雪, 趙逢禹
(1 上海理工大學(xué)光電信息與計(jì)算機(jī)工程學(xué)院, 上海 200093;2 上海出版與印刷高等??茖W(xué)校信息與智能工程系, 上海 200093)
在軟件的演化和維護(hù)過(guò)程中,往往需要修改軟件中的錯(cuò)誤、增加新的功能、調(diào)整軟件的配置等需求,導(dǎo)致代碼不斷被修改。 在代碼修改完后,需要使用回歸測(cè)試來(lái)檢查軟件中的缺陷,避免代碼的修改給軟件帶來(lái)新的錯(cuò)誤。 此外,當(dāng)已有測(cè)試用例集不充分時(shí),還需要針對(duì)新的功能與代碼部分設(shè)計(jì)新的測(cè)試用例。 因此,在軟件的持續(xù)演化過(guò)程中,測(cè)試用例集合的規(guī)模逐漸擴(kuò)大,導(dǎo)致回歸測(cè)試用例集的構(gòu)建成為一項(xiàng)復(fù)雜的工作。 有研究表明,回歸測(cè)試的開(kāi)銷占整個(gè)軟件測(cè)試預(yù)算的80%以上,并占整體維護(hù)預(yù)算的50%以上[1]。 因而,研究并提出一套有效且經(jīng)濟(jì)的回歸測(cè)試用例集的構(gòu)建方案是十分有意義的。
不管是回歸測(cè)試用例的選擇還是回歸測(cè)試用例的生成都是國(guó)內(nèi)外學(xué)者關(guān)注的課題。 文獻(xiàn)[2]提出了一套基于測(cè)試用例能夠檢測(cè)的故障程度來(lái)選擇回歸測(cè)試用例的方法,該文首先運(yùn)行已有的測(cè)試用例,將發(fā)現(xiàn)的故障與故障程度記錄在日志文件中,然后選擇故障程度較高的測(cè)試用例進(jìn)入下一輪的回歸測(cè)試。 文獻(xiàn)[3]提出一種根據(jù)回歸測(cè)試目標(biāo)自動(dòng)調(diào)整優(yōu)化策略的測(cè)試用例選擇方法。 該方法將測(cè)試用例加上標(biāo)識(shí)屬性,如缺陷檢測(cè)數(shù)表示該測(cè)試用例歷史執(zhí)行中失敗的總次數(shù),用重要性因子表示該測(cè)試用例對(duì)于當(dāng)前測(cè)試需求的重要程度,新舊功能標(biāo)識(shí)表示了該測(cè)試用例是否屬于新增或刪除模塊。 根據(jù)階段的回歸測(cè)試目標(biāo),將測(cè)試用例按照屬性標(biāo)識(shí)自動(dòng)優(yōu)化排序,根據(jù)優(yōu)化排序結(jié)果選擇測(cè)試用例集。 文獻(xiàn)[4]提出了一種靜態(tài)多重關(guān)聯(lián)的回歸測(cè)試用例構(gòu)造方案,通過(guò)分析方法間的調(diào)用關(guān)聯(lián)和隱式數(shù)據(jù)關(guān)聯(lián)進(jìn)而構(gòu)建多重方法關(guān)聯(lián)圖,并依據(jù)該圖中的關(guān)聯(lián)關(guān)系,選擇因代碼更改而受影響的回歸測(cè)試用例集。文獻(xiàn)[5]提出基于偶然正確性概率的回歸測(cè)試選擇方法,刪減掉可能發(fā)生偶然正確性現(xiàn)象的測(cè)試用例,提高測(cè)試用例的檢錯(cuò)能力,進(jìn)一步縮減回歸測(cè)試用例集的規(guī)模。 所謂偶然正確性是指程序中包含錯(cuò)誤的語(yǔ)句被執(zhí)行但仍通過(guò)了測(cè)試的現(xiàn)象。
當(dāng)回歸測(cè)試中選擇的測(cè)試用例不充分時(shí),需要生成新的測(cè)試用例。 符號(hào)執(zhí)行作為一種重要的程序分析技術(shù),可以為程序測(cè)試提供高覆蓋率的測(cè)試用例[6]。 符號(hào)執(zhí)行又分為靜態(tài)符號(hào)執(zhí)行和動(dòng)態(tài)符號(hào)執(zhí)行。 靜態(tài)符號(hào)執(zhí)行使用符號(hào)值代替一類實(shí)際數(shù)值,作為程序的輸入并執(zhí)行程序,在程序執(zhí)行的過(guò)程中收集路徑約束和符號(hào)狀態(tài)。 最終,在程序執(zhí)行結(jié)束后,得到一條完整的路徑約束方程,使用約束求解器對(duì)其求解便可得到一條與符號(hào)執(zhí)行時(shí)相同路徑的測(cè)試用例。 隨著程序的復(fù)雜化,出現(xiàn)了“路徑爆炸”和復(fù)雜的外部調(diào)用等導(dǎo)致靜態(tài)符號(hào)執(zhí)行收集到的路徑約束方程無(wú)法進(jìn)行求解。 為了解決上述問(wèn)題,Cristian Cadar[7]提出了動(dòng)態(tài)符號(hào)執(zhí)行的技術(shù)。 當(dāng)靜態(tài)符號(hào)執(zhí)行遇到約束方程無(wú)法求解的情況,利用具體值代替符號(hào)值,也就是結(jié)合具體值與符號(hào)值共同執(zhí)行程序。 Artzi 等人[8]開(kāi)發(fā)的web 缺陷檢測(cè)工具Apollo,就使用了動(dòng)態(tài)符號(hào)執(zhí)行的技術(shù)生成缺陷檢錯(cuò)能力更高的測(cè)試用例集。 在Apollo 工具中,Artzi等對(duì)動(dòng)態(tài)符號(hào)執(zhí)行技術(shù)做了改進(jìn),為了解決動(dòng)態(tài)符號(hào)執(zhí)行中路徑爆炸和生成冗余測(cè)試用例的問(wèn)題,對(duì)路徑約束相似的路徑進(jìn)行剪枝處理,對(duì)由約束求解器求得的相似測(cè)試用例進(jìn)行判斷是否冗余,縮小了測(cè)試用例的規(guī)模,提高軟件測(cè)試的效率。
當(dāng)前的回歸測(cè)試用例生成技術(shù)多集中于如何高效地從已有測(cè)試用例集中選擇測(cè)試用例來(lái)覆蓋程序的改動(dòng)部分。 但是,由于代碼的修改可能會(huì)調(diào)整代碼的邏輯,僅從歷史測(cè)試用例集中選取部分測(cè)試用例還是不夠的,需要在所選測(cè)試用例集的基礎(chǔ)上,進(jìn)一步完善測(cè)試用例。 而實(shí)際上,已有測(cè)試用例集的執(zhí)行信息包含了覆蓋路徑、路徑約束等信息,基于這些信息更能夠準(zhǔn)確地分析所選測(cè)試用例集覆蓋程序的不完全性,進(jìn)而構(gòu)建更完善、準(zhǔn)確的回歸測(cè)試用例集。
本文提出的基于測(cè)試用例的執(zhí)行信息構(gòu)建回歸測(cè)試用例集方法,首先從原測(cè)試用例集中,根據(jù)測(cè)試執(zhí)行時(shí),測(cè)試用例覆蓋程序的方法,選擇一部分覆蓋改動(dòng)方法的測(cè)試用例作為回歸測(cè)試用例選擇集;然后,對(duì)修改的部分源程序進(jìn)行插樁,并執(zhí)行所有已選擇的測(cè)試用例,由插樁語(yǔ)句獲取回歸測(cè)試用例選擇集的動(dòng)態(tài)執(zhí)行信息;最后,整理并分析插樁得到的信息,找出未覆蓋的程序路徑,提取未覆蓋路徑的邏輯表達(dá)式組成該路徑下的路徑約束表達(dá)式,并對(duì)其進(jìn)行求解,得到的結(jié)果即是新的測(cè)試用例。
由于已有的測(cè)試用例是已經(jīng)執(zhí)行過(guò)的,所以本文假設(shè)已經(jīng)獲得了已有測(cè)試用例覆蓋程序方法的信息,根據(jù)此信息構(gòu)建測(cè)試用例覆蓋程序方法的矩陣。而代碼經(jīng)過(guò)修改后,形成了代碼的變更信息,可以得到改動(dòng)后的方法集合。 又因?yàn)槌绦虼a的修改會(huì)導(dǎo)致程序的調(diào)用發(fā)生變化,所以所有直接或間接調(diào)用修改方法(包括增加的新方法)的方法,也屬于變更的方法,都應(yīng)該在回歸測(cè)試中被重新測(cè)試。 本文將改動(dòng)方法與受改動(dòng)方法影響的方法集合稱為該改動(dòng)相關(guān)方法集。
假設(shè)在已有的測(cè)試用例庫(kù)T 中,存在某一測(cè)試用例ti(ti∈T),程序方法mi(mi∈M),若執(zhí)行ti 的測(cè)試路徑覆蓋mi,測(cè)試用例覆蓋程序方法矩陣中對(duì)應(yīng)值則為1,否則為0。 覆蓋改動(dòng)相關(guān)方法集的所有測(cè)試用例構(gòu)成回歸測(cè)試用例選擇集。 表1 給出了一個(gè)從已有測(cè)試用例中選擇測(cè)試用例的示例。
表1 測(cè)試用例覆蓋程序方法矩陣Tab. 1 Test case overlay method matrix
假設(shè)方法m3 是程序經(jīng)過(guò)維護(hù)后修改的方法,而受調(diào)用關(guān)系,m2 和m5 是方法m3 的相關(guān)方法,所以選擇的測(cè)試用例集需要覆蓋的方法集合是{m2,m3,m5}。 最終,回歸測(cè)試用例選擇集為{t2,t3,t5,t6 }。
程序經(jīng)過(guò)修改后,代碼邏輯發(fā)生改變,從已有測(cè)試用例集中選擇的測(cè)試用例很有可能不能完全覆蓋程序所有的路徑,導(dǎo)致構(gòu)建的回歸測(cè)試用例選擇集不充分。 為了建立更完整的測(cè)試用例集,需要先執(zhí)行回歸測(cè)試用例選擇集,通過(guò)動(dòng)態(tài)執(zhí)行信息分析是否存在未覆蓋的程序路徑,并基于執(zhí)行結(jié)果生成新的測(cè)試用例。 所以,收集選擇測(cè)試用例動(dòng)態(tài)執(zhí)行信息的目的有兩個(gè),一是分析回歸測(cè)試用例選擇集是否有未覆蓋的程序路徑;二是獲取未覆蓋路徑的路徑約束表達(dá)式,通過(guò)求解生成新的測(cè)試用例。
為了收集回歸測(cè)試用例選擇集的動(dòng)態(tài)執(zhí)行信息,首先需要對(duì)源程序進(jìn)行靜態(tài)分析識(shí)別出程序修改的部分,然后在修改的部分程序中按照一定的規(guī)則進(jìn)行代碼插樁,插樁輸出的結(jié)果包括執(zhí)行測(cè)試用例的執(zhí)行語(yǔ)句編號(hào)、邏輯表達(dá)式、邏輯表達(dá)式的值、邏輯表達(dá)式中各變量的值。 本文定義了以下插樁規(guī)則以獲得和記錄上述信息。
為了實(shí)現(xiàn)插樁的功能,插樁位置需要設(shè)置在修改后的部分程序中的邏輯判斷語(yǔ)句處和代碼中順序執(zhí)行的多個(gè)語(yǔ)句后。 需要特別說(shuō)明的是,對(duì)于沒(méi)有改動(dòng)的部分程序來(lái)說(shuō),即使存在邏輯判斷表達(dá)式或循環(huán)語(yǔ)句也不需要對(duì)此進(jìn)行插樁。
插樁規(guī)則:
(1)順序執(zhí)行的語(yǔ)句塊:輸出語(yǔ)句塊標(biāo)識(shí)。
(2)分支語(yǔ)句:輸出執(zhí)行語(yǔ)句編號(hào)、邏輯表達(dá)式、邏輯表達(dá)式的值、邏輯表達(dá)式的各變量值。
(3)循環(huán)語(yǔ)句:輸出執(zhí)行語(yǔ)句編號(hào)、循環(huán)中的邏輯表達(dá)式、循環(huán)中邏輯表達(dá)式的值、循環(huán)中的變量值。
以下是一段簡(jiǎn)單的程序代碼,并假設(shè)testme 方法中的if 判斷語(yǔ)句即第6 行代碼發(fā)生了更改。 下面以此例展示本文的插樁方法以及插樁后輸出的信息。
由于第6 行代碼是更改后的語(yǔ)句,所以testme是變更方法。 受調(diào)用關(guān)系影響,主方法main 是變更方法的相關(guān)方法,所以方法testme 和方法main 都需要重新被測(cè)試,由此選擇的部分測(cè)試用例也必須覆蓋上述兩個(gè)方法,所以這兩個(gè)方法也是選擇進(jìn)行插樁的部分程序。
根據(jù)插樁規(guī)則,main 屬于順序執(zhí)行的語(yǔ)句塊,即在該方法的出口處進(jìn)行插樁輸出該方法的方法塊標(biāo)識(shí)。 而testme 方法中調(diào)用的twice 方法不受更改代碼的影響,所以不進(jìn)行插樁處理。 最終,testme 方法中需要進(jìn)行插樁的地方是代碼第6、7、8、9、11 行處,由于上述代碼行屬于邏輯判斷結(jié)構(gòu),所以由插樁語(yǔ)句輸出執(zhí)行語(yǔ)句編號(hào)、邏輯表達(dá)式、邏輯表達(dá)式的值、邏輯表達(dá)式值中各變量的值即可。 最終testme方法經(jīng)過(guò)插樁后的部分代碼如下所示。
以測(cè)試用例{x=30,y=15} 作為輸入,執(zhí)行上述插樁后的程序,得到的插樁結(jié)果如下方代碼所示:
如第一行輸出數(shù)據(jù)中,6 表示了當(dāng)前執(zhí)行的選擇測(cè)試用例的語(yǔ)句編號(hào),“z==x” 是執(zhí)行的邏輯表達(dá)式,T表示該邏輯表達(dá)式的值為真,“z=30,x=30” 是邏輯表達(dá)式中的變量值。
本文基于插樁獲得的信息分析回歸測(cè)試用例選擇集中各測(cè)試用例所覆蓋程序路徑的情況,通過(guò)算法比對(duì)得出未覆蓋的程序路徑,然后對(duì)未覆蓋的路徑生成新的測(cè)試用例,形成回歸測(cè)試用例生成集。
為了找出回歸測(cè)試用例選擇集未覆蓋的程序路徑,首先需要對(duì)插樁得到的信息進(jìn)行整理,分析被修改的方法中所有邏輯表達(dá)式的真假分支是否都被執(zhí)行,而沒(méi)有執(zhí)行的分支就組成了未覆蓋的程序路徑。
得到未覆蓋的程序路徑之后,需要根據(jù)回歸測(cè)試用例選擇集的動(dòng)態(tài)執(zhí)行信息,比對(duì)、查找出未覆蓋路徑上的邏輯表達(dá)式與邏輯表達(dá)式的值。 假如未覆蓋路徑所對(duì)應(yīng)的邏輯表達(dá)式的值為T,那么只需要令當(dāng)前邏輯表達(dá)式為T,然后對(duì)該約束求解,找出滿足該約束表達(dá)式的各變量值。
通過(guò)求解路徑約束表達(dá)式,可以得到各變量具體的值,進(jìn)而構(gòu)建測(cè)試用例,使之能測(cè)試執(zhí)行到未覆蓋的程序路徑。 但是,在一些特殊的情況下,例如在路徑約束表達(dá)式中的變量需要一系列復(fù)雜計(jì)算或者該變量取值網(wǎng)絡(luò)上的數(shù)據(jù)時(shí),在生成測(cè)試用例的輸入值時(shí),需要進(jìn)一步分析如何確保路徑約束表達(dá)式中的變量能夠取到限定值,使測(cè)試執(zhí)行到未覆蓋路徑。
下面以1.2 節(jié)中的程序?yàn)槔?,說(shuō)明生成新測(cè)試用例的過(guò)程。 現(xiàn)假設(shè)表2 是上述程序經(jīng)過(guò)修改后,通過(guò)選擇形成的回歸測(cè)試用例選擇集。 將這些測(cè)試用例作為輸入,執(zhí)行插樁后的程序,然后對(duì)插樁輸出結(jié)果進(jìn)行處理,得到如表3 所示的動(dòng)態(tài)執(zhí)行信息表。
表2 回歸測(cè)試用例選擇集信息Tab. 2 Information about selected test cases
表3 回歸測(cè)試用例選擇集的動(dòng)態(tài)執(zhí)行信息Tab. 3 Test case execution information
從表3 中可以看到,插樁信息中出現(xiàn)了兩個(gè)邏輯表達(dá)式分別為A(z==x) 和B(x >y+10),其中邏輯表達(dá)式A(z==x)出現(xiàn)了A(F)和A(T)兩個(gè)邏輯表達(dá)式的值,說(shuō)明該邏輯表達(dá)式中的真假分支均已被執(zhí)行到,而邏輯表達(dá)式B(x >y+10)只出現(xiàn)了B(T) 說(shuō)明該邏輯表達(dá)式只有邏輯為真的分支被執(zhí)行到,邏輯為假的分支B(F) 并沒(méi)有被執(zhí)行到,所以回歸測(cè)試用例選擇集未覆蓋的程序路徑包含該B(F) 分支。
為了得到完整的未覆蓋路徑的約束表達(dá)式,可基于回歸測(cè)試用例選擇集的動(dòng)態(tài)執(zhí)行信息構(gòu)建路徑覆蓋圖,基于路徑覆蓋圖查找該部分程序塊中所有使程序執(zhí)行到未覆蓋路徑的邏輯表達(dá)式。 以表3 為例,構(gòu)建的路徑覆蓋如圖1 所示。 由圖1 可知, 程序執(zhí)行到未覆蓋的路徑經(jīng)歷了兩個(gè)邏輯表達(dá)式分別為A(z==x) 和B(x >y+10),對(duì)應(yīng)的邏輯表達(dá)式的值分別為T 和F,所以最終組成的未覆蓋路徑的約束表達(dá)式為(z==x)∧[?(x >y+10)],對(duì)此進(jìn)行求解即可得到一組使測(cè)試執(zhí)行到未覆蓋路徑的變量值,如{x=20,y=10}。
圖1 路徑覆蓋圖Fig. 1 Path coverage diagram
前文給出了對(duì)修改代碼路徑覆蓋的回歸測(cè)試用例集生成方法。 為了驗(yàn)證本文所提方法的有效性,選取了4 個(gè)C 語(yǔ)言編寫的基準(zhǔn)程序和兩個(gè)C#語(yǔ)言編寫的web 程序構(gòu)建實(shí)驗(yàn),這些程序常被用于軟件測(cè)試研究領(lǐng)域[9-10]。 以上程序均采用了不同的維護(hù)方法,形成了各試驗(yàn)程序的不同版本。 表4 列出了每一個(gè)實(shí)驗(yàn)程序的名稱、簡(jiǎn)要概述、方法個(gè)數(shù)、代碼行數(shù)、測(cè)試用例數(shù)和維護(hù)類型。
表4 實(shí)驗(yàn)程序信息Tab. 4 Experimental program information
回歸測(cè)試用例集生成方法主要有兩部分,一部分是當(dāng)程序經(jīng)過(guò)變更后,從已有測(cè)試用例集中選擇能夠覆蓋全部改動(dòng)方法的測(cè)試用例。 另一部分是對(duì)已選測(cè)試用例集所未能覆蓋的程序路徑生成新的測(cè)試用例。 所以實(shí)驗(yàn)需要驗(yàn)證的目標(biāo)有兩個(gè),一是回歸測(cè)試用例選擇集的合理性;二是針對(duì)于程序未覆蓋的路徑,是否能夠生成新的且正確又有效的測(cè)試用例,即回歸測(cè)試用例生成集的正確性。
2.2.1 回歸測(cè)試用例選擇集的合理性
回歸測(cè)試用例選擇集的合理性是指凡是覆蓋程序改動(dòng)相關(guān)方法的測(cè)試用例都應(yīng)該被選入回歸測(cè)試用例選擇集,否則不應(yīng)該選入回歸測(cè)試用例選擇集。
實(shí)驗(yàn)步驟:
(1)根據(jù)已有測(cè)試用例集的歷史執(zhí)行信息構(gòu)建已有測(cè)試用例集覆蓋程序方法的矩陣。
(2)根據(jù)程序代碼的變更信息定位程序改動(dòng)的方法,并通過(guò)分析方法間的調(diào)用關(guān)系,找出所有與改動(dòng)相關(guān)的方法。
(3)從已有測(cè)試用例覆蓋程序的矩陣中選擇覆蓋程序改動(dòng)部分的測(cè)試用例進(jìn)入回歸測(cè)試用例選擇集。
實(shí)驗(yàn)結(jié)果:
表5 是回歸測(cè)試用例選擇集的結(jié)果,主要展示信息有:程序的名稱、原測(cè)試用例集的數(shù)量、回歸測(cè)試用例選擇集的數(shù)量,其中,回歸測(cè)試用例選擇是在已有測(cè)試用例集合的基礎(chǔ)上,選擇覆蓋程序改動(dòng)部分的測(cè)試用例。 例如Financial management 程序,在對(duì)程序進(jìn)行增加類型的維護(hù)后,受更改影響的相關(guān)方法共有4 個(gè),根據(jù)已有測(cè)試用例覆蓋程序方法的關(guān)系共選擇了90 個(gè)測(cè)試用例進(jìn)入回歸測(cè)試。
表5 回歸測(cè)試用例選擇集信息Tab.5 Test case selection set information
驗(yàn)證分析:
為了驗(yàn)證前文所提測(cè)試用例選擇方法的合理性,實(shí)驗(yàn)采取了對(duì)部分改動(dòng)程序插樁的方法以記錄回歸測(cè)試用例選擇集的執(zhí)行信息,如果回歸測(cè)試用例選擇集中的所有測(cè)試用例都執(zhí)行了程序的改動(dòng)部分并且未選的測(cè)試用例都不執(zhí)行程序的改動(dòng)部分,便認(rèn)為回歸測(cè)試用例選擇集是合理的。
表6 是測(cè)試用例選擇集的結(jié)果驗(yàn)證,主要信息有程序名稱、代碼改動(dòng)指因改動(dòng)而受影響的程序部分、回歸測(cè)試選擇集覆蓋的方法集合。 通過(guò)收集回歸測(cè)試用例選擇集的執(zhí)行信息即覆蓋程序改動(dòng)方法的情況,得出了回歸測(cè)試用例選擇集中所有的測(cè)試用例都執(zhí)行了程序的改動(dòng)部分。 并且實(shí)驗(yàn)采取了相同的方法收集了未選入回歸測(cè)試用例選擇集的測(cè)試用例集合的執(zhí)行信息,結(jié)果顯示未入選的測(cè)試用例集合皆未執(zhí)行程序的改動(dòng)部分。 由此得出回歸測(cè)試用例選擇集是合理的。
表6 回歸測(cè)試用例選擇結(jié)果驗(yàn)證Tab. 6 Test case selection verifies results
2.2.2 回歸測(cè)試用例生成集的正確性
回歸測(cè)試用例生成集的正確性指生成的測(cè)試用例集覆蓋了測(cè)試用例選擇集中沒(méi)有覆蓋的全部路徑。因而,通過(guò)執(zhí)行回歸測(cè)試用例生成集,并記錄其執(zhí)行的路徑便可驗(yàn)證回歸測(cè)試用例生成集的正確性。
實(shí)驗(yàn)步驟:
(1)整理回歸測(cè)試用例選擇集的動(dòng)態(tài)執(zhí)行信息,并通過(guò)對(duì)動(dòng)態(tài)執(zhí)行信息的分析找出未覆蓋的程序路徑。
(2)對(duì)程序進(jìn)行向上回溯,找到所有使程序執(zhí)行到未覆蓋路徑的邏輯判斷表達(dá)式構(gòu)建未覆蓋程序路徑的約束表達(dá)式。
(3)求解得到的路徑約束表達(dá)式,若有解即是一條新的測(cè)試用例。
實(shí)驗(yàn)結(jié)果:
表7 是回歸測(cè)試用例生成集的結(jié)果,主要信息有實(shí)驗(yàn)程序名稱、未覆蓋路徑、回歸測(cè)試用例生成集、回歸測(cè)試用例生成集覆蓋的路徑。 從表7 中可以看出,前文的測(cè)試用例生成方法針對(duì)于每個(gè)實(shí)驗(yàn)程序中的未覆蓋路徑都有新生成的測(cè)試用例。 通過(guò)執(zhí)行新生成的測(cè)試用例并記錄其執(zhí)行信息,得到了測(cè)試用例的路徑覆蓋情況。 實(shí)驗(yàn)證實(shí),新生成的測(cè)試用例所覆蓋的路徑皆是回歸測(cè)試選擇集沒(méi)有執(zhí)行過(guò)的程序路徑。
表7 回歸測(cè)試用例生成集結(jié)果Tab. 7 Test case generation set results
本文提出了一套包含測(cè)試用例選擇和測(cè)試生成的回歸測(cè)試用例構(gòu)建方案,通過(guò)該方法選擇的測(cè)試用例集不僅能夠完全覆蓋程序的改動(dòng)部分,還保持了較小的數(shù)據(jù)集,能夠一定程度上降低回歸測(cè)試選擇集的冗余度。 而生成的新測(cè)試用例能夠彌補(bǔ)已有測(cè)試用例的覆蓋不足,增加回歸測(cè)試的檢錯(cuò)能力,提高回歸測(cè)試的效率。
本文實(shí)驗(yàn)的程序集規(guī)模與程序邏輯都不太復(fù)雜,約束方程的求解較容易,但隨著實(shí)驗(yàn)程序的規(guī)模與復(fù)雜性的增加,特別是在有復(fù)雜的外部調(diào)用或者頻繁的數(shù)據(jù)庫(kù)交互時(shí),會(huì)導(dǎo)致約束方程求解困難,使新測(cè)試用例生成難度加大。 所以本文方法還需要在約束方程的求解方面進(jìn)一步完善。