一種面向回歸測試的控制流變更影響域分析方法和系統(tǒng)的制作方法
【技術(shù)領(lǐng)域】
[0001] 本發(fā)明涉及軟件測試領(lǐng)域,具體地,涉及一種面向回歸測試的控制流變更影響域 分析方法和系統(tǒng)。
【背景技術(shù)】
[0002] 回歸測試(Regression Testing)是指軟件系統(tǒng)被修改或擴(kuò)充后,為了驗(yàn)證對軟件 的修改是否達(dá)到預(yù)期的目的,并且沒有引入新的錯(cuò)誤而重復(fù)進(jìn)行的測試。理論上,每當(dāng)軟件 發(fā)生修改和變化時(shí),都要進(jìn)行回歸測試來驗(yàn)證修改的正確性及其影響,這種修改和變化稱 之為變更。實(shí)踐表明,軟件生命周期中的任何階段都可能發(fā)生變更,不必對所有的測試用例 進(jìn)行重新測試,只需要對其中受到影響的部分進(jìn)行重新測試。重新測試時(shí)若仍采用基于路 經(jīng)粒度進(jìn)行測試,則路徑數(shù)目將會是海量的,人工測試幾乎是不可能的。采用面向函數(shù)調(diào)用 路徑思想,將代碼分析粒度由語句擴(kuò)展到函數(shù),既避免路徑數(shù)量的大規(guī)模增長,又保證了軟 件測試充分性。
[0003] 變更可以導(dǎo)致數(shù)據(jù)流、控制流和信息流的變化,目前變更的研宄也主要集中在這 三方面。其中,控制語句在程序中有改變(或停止)程序執(zhí)行順序,控制代碼執(zhí)行的路徑的 作用??刂普Z句發(fā)生變化使得函數(shù)調(diào)用路徑發(fā)生改變,此時(shí)若對所有的測試用例進(jìn)行回歸 測試則會增加巨大的工作量,若能確定控制語句發(fā)生變化后影響的函數(shù)則不必對所有的用 例進(jìn)行回歸測試,只需對受到影響的函數(shù)進(jìn)行重新測試,降低回歸測試中的工作量。
[0004] 目前按照不同分類方式對軟件變更進(jìn)行了研宄,從變更的行為和軟件生命周期和 邏輯語義三個(gè)方面對變更進(jìn)行了分類。軟件生命周期中的任何階段都可能發(fā)生變更,其中 代碼變更可能引發(fā)各種錯(cuò)誤,若能確定這些代碼的變更影響域,開發(fā)人員可根據(jù)控制流變 更影響域提高處理軟件缺陷的效率;測試人員可根據(jù)控制流變更影響域分析得到變更影響 的函數(shù)調(diào)用路徑進(jìn)行測試,不必對所有的路徑進(jìn)行測試,節(jié)約測試成本。
[0005] 因此,本發(fā)明提出了一種面向回歸測試的控制流變更影響域分析方法和系統(tǒng)。
【發(fā)明內(nèi)容】
[0006] 本發(fā)明的目的是提供一種面向回歸測試的控制流變更影響域分析方法和系統(tǒng),用 于解決版本變更后,準(zhǔn)確定位控制流變化產(chǎn)生的影響的問題。
[0007] 為了實(shí)現(xiàn)上述目的,本發(fā)明提供一種面向回歸測試的控制流變更影響域分析方 法,包括:
[0008] 獲取舊版本的源程序的具有控制語句的靜態(tài)函數(shù)調(diào)用路徑和控制流二叉樹;
[0009] 比較新舊版本的源程序,獲取發(fā)生變更的控制語句;
[0010] 在舊版本的源程序的控制流二叉樹中,確定發(fā)生變更的控制語句的影響域。
[0011] 優(yōu)選地,所述新舊版本的源程序均為C++源程序。
[0012] 優(yōu)選地,采用靜態(tài)分析方法獲取舊版本的源程序的具有控制語句的靜態(tài)函數(shù)調(diào)用 路徑和控制流二叉樹,具體包括:
[0013] 預(yù)處理源程序,得到程序靜態(tài)分析信息;
[0014] 將程序靜態(tài)分析信息進(jìn)行函數(shù)重載和多態(tài)調(diào)用點(diǎn)的唯一性確定,確定函數(shù)調(diào)用點(diǎn) 和控制語句及函數(shù)的對應(yīng)關(guān)系,得到控制流函數(shù)調(diào)用信息;
[0015] 將程序靜態(tài)分析信息中的函數(shù)邏輯結(jié)構(gòu)與控制流函數(shù)調(diào)用信息結(jié)合,獲得局部帶 有控制語句的靜態(tài)函數(shù)調(diào)用路徑和局部控制流二叉樹;
[0016] 從入口函數(shù)開始,迭代展開所有函數(shù)的局部帶有控制語句的靜態(tài)函數(shù)調(diào)用關(guān)系, 獲得全局靜態(tài)函數(shù)調(diào)用路徑和全局控制流二叉樹。
[0017] 優(yōu)選地,所述比較新舊版本的源程序,獲取發(fā)生變更的控制語句,具體包括:比較 新舊版本的源程序中具有控制語句的語句,再采用基于編輯距離的算法獲取發(fā)生變更的控 制語句。
[0018] 優(yōu)選地,所述在舊版本的源程序的控制流二叉樹中,確定發(fā)生變更的控制語句的 影響域,具體包括:所述靜態(tài)函數(shù)調(diào)用路徑中所有包含發(fā)生變更的控制語句的路徑均為受 到影響的路徑,且受到影響的路徑集合中被調(diào)用的該發(fā)生變更的控制語句之后的函數(shù)均為 受到影響的函數(shù)。
[0019] 優(yōu)選地,若新舊版本的源程序?yàn)镃++源程序,則確定發(fā)生變更的控制語句的影響 域,具體包括:
[0020] 若發(fā)生變更的控制語句包括 if、else、while、for、switch case default 和 do while控制語句,則該發(fā)生變更的控制語句的影響域?yàn)樵摽刂普Z句后調(diào)用的函數(shù)和該控制 語句的兄弟結(jié)點(diǎn);
[0021] 若發(fā)生變更的控制語句包括continue、goto和return控制語句,則該發(fā)生變更的 控制語句的影響域?yàn)樗薪?jīng)過該控制語句結(jié)點(diǎn)的函數(shù);
[0022] 若發(fā)生變更的控制語句包括break控制語句,則該發(fā)生變更的控制語句的影響域 為對應(yīng)的switch case整個(gè)控制語句。
[0023] 本發(fā)明的技術(shù)方案還包括一種面向回歸測試的控制流變更影響域分析系統(tǒng),包 括:
[0024] 源程序分析模塊,用于獲取舊版本的源程序的具有控制語句的靜態(tài)函數(shù)調(diào)用路徑 和控制流二叉樹;
[0025] 控制語句獲取模塊,用于比較新舊版本的源程序,獲取發(fā)生變更的控制語句;
[0026] 影響域確定模塊,用于在舊版本的源程序的控制流二叉樹中,確定發(fā)生變更的控 制語句的影響域。
[0027] 優(yōu)選地,所述新舊版本的源程序均為C++源程序。
[0028] 優(yōu)選地,所述源程序分析模塊包括:
[0029] 預(yù)處理模塊,用于預(yù)處理源程序,得到程序靜態(tài)分析信息;
[0030] 唯一性確定模塊,用于將程序靜態(tài)分析信息進(jìn)行函數(shù)重載和多態(tài)調(diào)用點(diǎn)的唯一性 確定,確定函數(shù)調(diào)用點(diǎn)和控制語句及函數(shù)的對應(yīng)關(guān)系,得到控制流函數(shù)調(diào)用信息;
[0031] 局部控制流二叉樹獲取模塊,用于將程序靜態(tài)分析信息中的函數(shù)邏輯結(jié)構(gòu)與控制 流函數(shù)調(diào)用信息結(jié)合,獲得局部帶有控制語句的靜態(tài)函數(shù)調(diào)用路徑和局部控制流二叉樹;
[0032] 全局控制流二叉樹獲取模塊,用于從入口函數(shù)開始,迭代展開所有函數(shù)的局部帶 有控制語句的靜態(tài)函數(shù)調(diào)用關(guān)系,獲得全局靜態(tài)函數(shù)調(diào)用路徑和全局控制流二叉樹。
[0033] 優(yōu)選地,所述影響域確定模塊,用于在舊版本的源程序的控制流二叉樹中,確定發(fā) 生變更的控制語句的影響域,具體包括:所述靜態(tài)函數(shù)調(diào)用路徑中所有包含發(fā)生變更的控 制語句的路徑均為受到影響的路徑,且受到影響的路徑集合中被調(diào)用的該發(fā)生變更的控制 語句之后的函數(shù)均為受到影響的函數(shù)。
[0034] 本發(fā)明的有益效果是:本發(fā)明能夠正確識別發(fā)生變化的控制語句,精確獲取變更 點(diǎn)影響域,通過變更點(diǎn)影響域,在回歸測試中可以約減測試用例,提高測試效率。
【附圖說明】
[0035] 圖1是面向回歸測試的控制流變更影響域分析方法的流程示意圖;
[0036] 圖2是表1的示例代碼對應(yīng)的控制流二叉樹示意圖;
[0037] 圖3是【具體實(shí)施方式】中控制流變更影響域分析方法的框架示意圖;
[0038] 圖4是表2的示例代碼對應(yīng)的控制流二叉樹示意圖;
[0039] 圖5是圖4的控制流二叉樹的變更影響域示意圖。
【具體實(shí)施方式】
[0040] 以下結(jié)合附圖對本發(fā)明的【具體實(shí)施方式】進(jìn)行詳細(xì)說明。應(yīng)當(dāng)理解的是,此處所描 述的【具體實(shí)施方式】僅用于說明和解釋本發(fā)明,并不用于限制本發(fā)明。
[0041] 本實(shí)施方式中的舊版本指未發(fā)生變更的源程序,新版本指發(fā)生為變更后的代碼。
[0042] 本實(shí)施方式給出了一種面向回歸測試的控制流變更影響域分析方法,如圖1所 示,包括:獲取舊版本的源程序的具有控制語句的靜態(tài)函數(shù)調(diào)用路徑和控制流二叉樹;比 較新舊版本的源程序,獲取發(fā)生變更的控制語句;在舊版本的源程序的控制流二叉樹中,確 定發(fā)生變更的控制語句的影響域。
[0043] 因 C++語言易于得到帶控制語句的函數(shù)調(diào)用關(guān)系圖,故下文中以C++語言為例,具 體說明本實(shí)施方式的工作過程,但并不限于C++語言。
[0044] 根據(jù)圖1所示的步驟,本實(shí)施方式的面向回歸測試的控制流變更影響域分析方法 主要分為三個(gè)部分。
[0045] 一、控制流靜態(tài)分析
[0046] 首先,給出控制流函數(shù)調(diào)用路徑和控制流二叉樹的定義。
[0047] 控制流函數(shù)調(diào)用路徑是函數(shù)調(diào)用圖中的一個(gè)結(jié)點(diǎn)序列(Vi= Vitl, Vil,…,VJ,Vim為 函數(shù)名或有編號的控制語句,路徑中相鄰結(jié)點(diǎn)表示調(diào)用順序關(guān)系。
[0048] 控制流二叉樹是根據(jù)二叉鏈表表示法的原理,左指針指向其相繼執(zhí)行/調(diào)用的結(jié) 點(diǎn),即孩子結(jié)點(diǎn),右指針指向兄弟結(jié)點(diǎn)。
[0