周海旭
(中國民航信息網(wǎng)絡股份有限公司 北京市民航大數(shù)據(jù)工程技術研究中心,北京 101318)
回歸測試指的是對軟件待測版本中相對上一個版本不變的特性進行驗證.在軟件的版本更迭過程中,回歸測試是必不可少的質量保障手段.回歸測試用例一般繼承自產(chǎn)品用例庫,對于實際的軟件項目來說,回歸測試用例的數(shù)量往往很大.由于測試資源的限制,一般不可能執(zhí)行回歸測試用例集中的全部用例,而是要予以適當?shù)娜∩?通常的做法是,首先確定每個回歸測試用例的優(yōu)先級,然后再根據(jù)可用資源的規(guī)模,挑選一部分優(yōu)先級較高的用例進行回歸測試.因此,用例優(yōu)先級的評估,是回歸測試設計中的一個核心問題[1–6].
軟件待測版本相對上一個版本的代碼變更,會對已有特性帶來潛在的質量風險,這一風險水平直接與回歸測試用例的優(yōu)先級相關聯(lián).Orso 等[7]使用用戶現(xiàn)場數(shù)據(jù)分析代碼變更與回歸測試用例選擇的關系;Pfleeger 等[8]通過依賴追蹤圖建立起代碼變更與回歸測試用例的追蹤框架;Ryder 等[9]提出了基于原子變更的分析方法,可以找出所有可能受一組代碼變更影響的回歸測試用例,同時也可以找出可能影響到某個回歸測試用例的代碼變更.Tyagi 等[10]考慮了缺陷嚴重性對回歸測試用例優(yōu)先級的影響;Mahmood 等[11]綜合了需求、代碼復雜性、歷史信息等16 個影響因素,得到回歸測試用例優(yōu)先級的排序結果;Arar和Ryu 等[12,13]使用成本敏感型機器學習算法來預測代碼變更對軟件質量及回歸測試用例的影響;Di Nardo 等[14]對測試用例在軟件歷史版本上的執(zhí)行信息進行分析,并結合代碼變更情況進行回歸測試用例優(yōu)先級排序.然而這些已有的研究基本都沒有涉及到代碼變更對回歸測試用例優(yōu)先級影響水平的定量度量問題.
回歸測試的目的是驗證待測版本的變更是否會對已有特性產(chǎn)生不良影響.從風險、價值和成本的角度,可以歸納出回歸測試用例優(yōu)先級的啟發(fā)式評估原則如下:
(1)用例對應的需求特性受代碼變更的影響越大,則該用例的優(yōu)先級應該越高;
(2)用例對應的需求特性越重要,則該用例的優(yōu)先級應該越高;
(3)執(zhí)行用例所需的成本(包含運行用例和維護用例的成本)越低,則該用例的優(yōu)先級應該越高.
記回歸測試用例總集為S,其中用例數(shù)量為N,假設S由一組用例子集構成,記為{Si},i=1,2,···,n.Si中用例數(shù)量為Ni.記產(chǎn)品需求特性總集為U,假設U由一組需求特性子集構成,記為且Si與存在測試覆蓋的映射關系,記為Si→.用ai表示待測版本的代碼變更對需求特性子集的影響水平.用vi表 示的價值水平,即在功能或非功能上的重要程度.用ei表示運行Si(手工或自動化方式)所需人天.用mi表示維護Si(維護手工用例或自動化腳本)所需人天.用R表示可投入到此次回歸測試中的人天資源總數(shù).
不失一般性,假設Si中 用例數(shù)量Ni=1,則Si代表回歸測試用例總集中的第i個用例.用ci表示該用例的優(yōu)先級,則[3]:
上式說明,代碼變更與回歸測試用例優(yōu)先級的關系,集中體現(xiàn)在代碼變更對相關需求特性的影響程度上.數(shù)值上要求ai>0.
根據(jù)式(1),在回歸測試設計中進行用例優(yōu)先級的評估時,需要首先計算ai的值,也就是要定量評估代碼變更對需求特性的影響程度.目前度量ai的主要手段是依靠研發(fā)人員的主觀判斷和經(jīng)驗,結果并不精確.本文將從測試覆蓋的角度建立起需求特性與代碼變更的關聯(lián),綜合顯性和隱性影響水平兩方面的度量指標,提出一個新的代碼變更影響度量模型,為回歸測試用例優(yōu)先級的評估提供量化支持.
需求特性與測試用例之間存在測試覆蓋的映射關系.需求特性是測試用例的覆蓋目標,測試用例是需求特性的實現(xiàn)反映.假設回歸測試用例Si覆蓋需求特性子集,那么的實現(xiàn)程度只能通過Si的執(zhí)行結果來體現(xiàn),如果代碼變更影響了的 實現(xiàn),必然影響Si的執(zhí)行結果.也就是說,代碼變更對測試用例的影響程度,可以反映出代碼變更對需求特性的影響程度.圖1描述了代碼變更與需求特性、測試用例的關系.
圖1 代碼變更與需求特性、測試用例的關系
基于需求特性與測試用例之間的測試覆蓋關系,可以通過度量代碼變更對測試用例的影響水平,來評估代碼變更對需求特性的影響水平.
進一步考慮如何度量代碼變更對測試用例的影響.回歸測試用例Si在執(zhí)行過程中會覆蓋被測軟件中的一部分代碼,將這部分代碼行的集合記為Li.Si的執(zhí)行結果是否正確,在代碼層面完全取決于Li的實現(xiàn)是否正確.因此,代碼變更對Si的影響程度,等同于代碼變更對Li的影響程度.從局部的角度看,發(fā)生變更的代碼行集合和Li都是被測代碼的子集,這兩個子集的關系代表了代碼變更對Li的顯性影響;從整體的角度看,代碼總集內部的全局耦合性代表了代碼變更對Li的隱性影響.本文提出的度量模型綜合了局部和整體兩方面的考慮.
工程實踐中,絕大多數(shù)軟件項目都使用配置管理工具來進行代碼變更的標識、組織和控制.流行的配置管理工具,如Git、SVN 等,都可以很方便地輸出待測版本的代碼變更信息,包括發(fā)生變更的類、代碼行、變更類型、變更內容等.
測試用例與代碼的關聯(lián)關系可以通過代碼覆蓋來進行分析和描述,基本步驟是:
(1)對被測代碼進行插樁,即插入一些用于信息采集的探針代碼,并保證語義及功能與原始代碼完全等效;
(2)對插樁后的代碼進行編譯、鏈接,獲得可執(zhí)行程序;
(3)執(zhí)行測試用例,對插樁輸出的信息進行處理,獲得用例對代碼的覆蓋結果,也就是用例與代碼的關聯(lián)關系.
插樁有手工和自動兩種方式.手工方式指的是在代碼需要獲取運行覆蓋信息的地方寫入信息采集代碼段,相對靈活,但對源代碼有修改,引入了額外的風險;自動方式則通常是基于代碼覆蓋分析工具,對編譯鏈接產(chǎn)生的中間文件進行插樁修改,相對安全且高效.目前,采用自動方式進行代碼覆蓋的分析已經(jīng)是業(yè)界的主流選擇,流行的代碼覆蓋分析工具包括Jacoco、EclEmma、gcov 等.
考慮待測版本代碼變更對回歸測試用例Si的影響.將待測版本的上一個版本的代碼行總集記為L.借助代碼覆蓋分析工具,依據(jù)上述分析步驟,容易得到Si覆蓋的上一個版本的代碼行集合,即Li,Li中的元素可以用“命名空間 + 文件名 + 代碼行號”的方式來描述;借助配置管理工具,容易得到待測版本相對上一個版本發(fā)生變更的代碼行集合,記為LD,LD采用與Li同樣的元素描述方式.本文僅討論待測版本發(fā)生代碼變更的情形,即LD≠?.從代碼行的角度看,代碼變更主要有三種情形:修改某一行,刪除某一行,或在某一行之后新增若干行.若上一個版本的第j行被修改、刪除,或者在第j行之后新增了若干行,則j∈LD.
如果Li與LD存在交集,說明測試用例Si覆蓋的代碼在待測版本中發(fā)生了變更,Si的測試執(zhí)行結果將受到這一變更的直接影響.Li與LD交疊的程度越大,代碼變更對Si的影響也越大.基于這一結論,我們使用Li與LD的jaccard 相似度來度量代碼變更對測試用例Si的顯性影響水平,即:
根據(jù)式(2)可知,0≤J(Li,LD)≤1.當J(Li,LD)=0時,與Si有關的代碼沒有發(fā)生變更;J(Li,LD)的數(shù)值越大,說明與Si有關的代碼發(fā)生變更的比例越大,Si檢出缺陷的概率也越大.
通過評估測試用例覆蓋代碼行集合與變更代碼行集合的交疊程度,可以衡量代碼變更對測試用例的顯性影響程度.然而,由于代碼耦合性的廣泛存在,即使測試用例覆蓋的代碼行均未發(fā)生變更,該用例也可能受到變更的隱性影響.
假設待測版本代碼中,類的總集為C={c1,c2,···,c|C|}.借助代碼覆蓋分析工具,容易得到測試用例Si覆蓋的類集合,記為CSi={cSi1,cSi2,···,cSi|Ci|}.借鑒軟件設計度量中耦合因子的概念[15],定義面向測試用例的耦合因子如下:
其中,Descendents(cSim)表 示與cSim有派生關系的類集合;isclient(cSim,cn)是 一個函數(shù),當cSim引用了cn中的某個方法或變量,且cSim與cn沒 有派生關系,且cSim≠cn時,isclient(cSim,cn)取值為1,否則取值為0.易知0≤COF(Si)≤1.
COF(Si)刻畫了代碼全局耦合性中與測試用例Si有關的部分,使用這個指標可以在一定程度上表征代碼變更對測試用例的間接影響.但是該指標與代碼變更程度的關聯(lián)較小,只要代碼沒有類級別的變更,比如類的新增、刪除、派生關系、類間引用的改變等,COF(Si)就是一個定值.而在直觀認知中,代碼修改得越多,對測試用例執(zhí)行結果和相關需求特性產(chǎn)生間接影響的可能性就越大.因此,我們需要針對代碼變更程度補充另一個度量維度.
考慮待測版本的上一個版本的代碼行總集L和變更代碼行集合LD的關系.從L和LD的定義易知,L?LD.使用L和LD的jaccard 相似度來評估代碼變更程度,即:
因為LD≠?,所以J(L,LD)>0.
結合面向測試用例的耦合因子、代碼變更程度兩方面的度量,可實現(xiàn)對隱性影響水平相對完整的評估.
綜合以上對顯性影響水平和隱性影響水平兩方面的分析,可以得到面向回歸測試的代碼變更影響度量模型如下:
其中,λ是一個可定制的常量,用于調節(jié)顯性影響水平和隱性影響水平的數(shù)值比例,在同一軟件的不同版本中可以取不同的值.配置 λ的經(jīng)驗原則是,調節(jié)后的平均顯性影響水平應比平均隱性影響水平高一個數(shù)量級,以保證顯性影響水平在度量中處于主導地位.
因為 0≤J(Li,LD)≤1,0≤COF(Si)≤1,J(L,LD)>0,所以ai>0,滿足式(1)的數(shù)值要求.
該度量模型的構成如圖2所示.
圖2 度量模型構成
模型由顯性影響水平指標和隱性影響水平指標兩部分組成.顯性影響水平刻畫了用例覆蓋代碼發(fā)生變更的程度,是度量模型的主要指標,通過變更代碼集合與用例覆蓋代碼集合的jaccard 相似度進行度量;隱性影響水平刻畫了用例覆蓋代碼藉由代碼總集內部耦合性與變更代碼產(chǎn)生間接關聯(lián)的程度,是模型的次要指標,通過面向測試用例的耦合因子、變更代碼集合與代碼總集的jaccard 相似度進行度量.
由于模型全面考慮了代碼變更對測試用例可能產(chǎn)生的顯性影響與隱性影響,在以下各類情形中,模型都可以給出合理的度量結果:
(1)回歸測試用例覆蓋的代碼發(fā)生了變更.這時,模型中顯性影響水平指標大于0,而且居于主導地位;
(2)回歸測試用例覆蓋的代碼未發(fā)生變更.這時,模式中顯性影響水平指標等于0,度量結果取決于隱性影響水平指標,即用例覆蓋的代碼與變更代碼的耦合程度.
在后續(xù)的實驗分析中,可以看到度量模型上述特性的實際效果.
實驗項目的一個迭代版本中共包括11 個類,1454 行代碼.回歸測試用例集中共有16 個用例,各自對應一個需求特性.該版本有兩個需求特性發(fā)生了變更,對應的回歸測試用例分別是TC05 和TC06.如果根據(jù)主觀經(jīng)驗來分析代碼變更對測試用例優(yōu)先級的影響程度,只能簡單地給這兩個用例賦予一個較高的影響水平,而給其它用例賦予一個較低的影響水平.
基于本文提出的代碼變更影響度量模型,可得到度量結果如表1(λ取值為10).影響水平排在前兩位的是TC06 和TC05,說明模型的度量結論與主觀經(jīng)驗判斷相符;另外,影響水平排在3~5 位的依次為TC01、TC14 和TC16,且TC01 與TC05 的影響水平很接近.通過檢查各測試用例的具體內容可以發(fā)現(xiàn),TC01 和TC14 雖然并不是針對發(fā)生變更的兩個特性所設計的用例,但是在用例的結果校驗部分涉及了變更特性的功能,所以受到了代碼變更的直接影響程度較高;通過檢查各測試用例的代碼覆蓋情況可以發(fā)現(xiàn),TC16 所覆蓋的代碼存在較多的類間變量引用,在類層面的耦合性較高,因此受到代碼變更間接影響的可能較大.由此可見,本文提出的模型可以對代碼變更影響回歸測試用例的程度給出更客觀、更全面的定量度量結果.
表1 代碼變更對回歸測試用例的影響水平度量結果
本文首先從測試覆蓋的角度建立起回歸測試用例與代碼變更的關聯(lián),基于代碼覆蓋集合與代碼變更集合的jaccard 相似度來度量顯性影響水平;繼而從代碼整體系統(tǒng)性的角度,使用面向測試用例的耦合因子、代碼變更集合與代碼總集的jaccard 相似度來綜合度量隱性影響水平.本文提出的面向回歸測試的代碼變更影響度量模型,同時考慮了顯性影響水平和隱性影響水平兩方面的因素,能夠對代碼變更影響水平進行比較全面和客觀的分析,進而為回歸測試用例優(yōu)先級的評估提供有效的支持.目前存在的問題是,模型的顯性影響水平指標中,關于新增代碼行這一情況的度量方式不夠精細,沒有體現(xiàn)出代碼增量大小帶來的不同影響.后續(xù)研究中將考慮予以改進.