回歸測試是指被測單元、部件、配置項和系統(tǒng)因各種原因進行更改(以下稱更改前為老版本,更改后為新版本)后的再測試[1],目的是重新驗證一個系統(tǒng)或部件被修改后有沒有造成不期望的副作用,是否仍然符合它的需求規(guī)格說明[2].
在生命周期的任何一個階段,軟件都可能發(fā)生改變.改變原因可能是源于發(fā)現(xiàn)了錯誤并做了修改,也有可能是因為在集成或維護階段加入了新的模塊.當軟件發(fā)生改變時,就可能存在修改錯誤或產(chǎn)生副作用,而導(dǎo)致軟件未被修改的部分產(chǎn)生新的問題,使本來正常的功能發(fā)生錯誤.因此,每當軟件發(fā)生變化時,就必須重新測試現(xiàn)有功能,以便確定修改是否達到了預(yù)期目的,檢查修改是否損害了原有的正常功能;同時,還需要補充新的測試用例來測試新的和被修改了的功能.為了驗證軟件修改的正確性及對其他功能的影響就需要進行回歸測試,該測試在軟件開發(fā)過程中占有很大的比重.根據(jù)第三方測試數(shù)據(jù)統(tǒng)計,1個提交第三方測試的軟件,至少有4個版本的回歸,多者可達十幾個版本.在漸進和快速迭代開發(fā)中,新版本的連續(xù)發(fā)布使回歸測試進行得更加頻繁.回歸測試在軟件生命周期中的維護成本中可占總維護成本的1/2[3].
回歸測試在軟件生命周期中扮演著重要的角色,大約30%的錯誤都是通過回歸測試發(fā)現(xiàn)的[3].因忽視回歸測試而造成嚴重后果的例子不計其數(shù).因此回歸測試策略研究和選擇對提高回歸測試效率和有效性是非常有意義的.
目前,有關(guān)回歸測試方法的研究已有很多,大多數(shù)研究集中在某些特定的領(lǐng)域上,采用專門的方法和工具減少測試用例,從而提高回歸測試效率.如Memon[4]提出了基于GUI圖形界面的回歸測試方法,這種GUI圖形界面的回歸方法不適用于嵌入式軟件;基于程序切片技術(shù)的回歸測試利用切片技術(shù)提取信息組成一個程序片段后設(shè)計測試用例[5],但該方法針對稍有規(guī)模的程序切片構(gòu)造非常困難,難以操作.本文在總結(jié)常用的回歸測試策略的基礎(chǔ)上,對策略的特點進行分析,最后從測試成本和效率角度,提出了一種基于更動影響域分析的回歸測試方法,詳細說明了更動類型,并針對每種類型提出了對應(yīng)的確認和影響域分析方法.
測試人員實施測試時需要將設(shè)計的測試用例保存到測試用例庫中,并對其進行維護和管理.當?shù)玫揭粋€軟件的基線版本后,用于測試基線版本的所有測試用例就形成了基線測試用例庫.
回歸測試時,需要從基線測試用例庫中選取合適的測試用例組成回歸測試用例包并運行.
回歸測試用例包的選取需要結(jié)合測試時間和花費成本進行,通常有如下幾種回歸測試策略[6-8].
(1)全面的回歸測試
選擇測試用例庫中的全部測試用例組成回歸測試用例包并重新運行.該方式測試遺漏風險最低,但測試成本最高,測試效率最低.當回歸測試次數(shù)不斷增加、測試用例不斷增多時,相關(guān)的成本和進度往往超出項目預(yù)算.
(2)基于風險分析的回歸測試
基于一定的風險標準從測試用例庫中選擇回歸測試用例包.首先運行最重要和可疑的測試用例,而跳過那些非關(guān)鍵、優(yōu)先級低的測試用例.該測試策略花費的成本相對低;但是,由于目前沒有一個好的風險標準,關(guān)鍵等級較高的測試項目采用該策略時,存在極大的質(zhì)量隱患.
(3)基于操作剖面的回歸測試
如果測試用例是基于軟件操作剖面設(shè)計的,則測試用例的分布反映了系統(tǒng)的實際使用情況.回歸測試時優(yōu)先選擇功能最重要或使用最頻繁的測試用例,以降低最高級別的風險發(fā)生概率,有助于盡早發(fā)現(xiàn)那些對可靠性有重大影響的軟件問題.這種方法可以在給定的預(yù)算條件下最有效地提高軟件可靠性,但在實際用例設(shè)計過程中,基于軟件操作剖面的用例設(shè)計方法很難實施.
(4)基于代碼更動的回歸測試
通過總結(jié)代碼的更動情況并分析更動的影響范圍,對更動及其受影響的部分進行測試.
基于代碼更動的回歸測試策略花費的成本相對較低,并且能夠提高測試效率,具體實施也相對容易.因此嵌入式星上軟件的回歸測試通常選擇該策略.但是該策略的實施質(zhì)量依賴于更動影響域分析的充分性,因此為保證回歸測試質(zhì)量,研究和總結(jié)代碼更動影響域分析方法是必須的.
通常,代碼更動體現(xiàn)在如下3個方面:
1)控制結(jié)構(gòu)算法/邏輯更動;
2)參數(shù)更動;
3)參數(shù)和控制結(jié)構(gòu)算法/邏輯算法均更動.
2.1.1 遵循原則
算法/邏輯更動影響域分析需遵循如下原則:
1)如果算法的修改既不要求修改它的輸入?yún)?shù),又不要求改變它的輸出參數(shù),那么它的影響僅限于被修改的單元或模塊;
2)如果算法的修改對輸入?yún)?shù)有了新的要求,則該修改不僅影響本模塊,還對該參數(shù)的“生產(chǎn)者”模塊有影響;
3)如果算法的修改對輸出參數(shù)的結(jié)構(gòu)或類型進行了修改,則該修改不僅影響本模塊,還對該參數(shù)的“消費者”模塊有影響.
2.1.2 分析方法
實際測試過程中,算法/邏輯的更動屬性可分為需求更動、問題糾正、完善設(shè)計3類.確定代碼更動屬性后,相關(guān)的影響域分析和確認方法如下:
1)屬性為需求更動,表示當前代碼更動是依據(jù)需求變更進行的,因此該類更動首先分析當前代碼是否與變更后的需求說明一致,然后分析代碼中所有相關(guān)功能是否均進行了對應(yīng)修改,即確認需求變更是否在代碼中進行了全面修改;
2)屬性為問題糾正,表示當前代碼更動是依據(jù)代碼執(zhí)行或測試過程中發(fā)生或發(fā)現(xiàn)問題進行的,因此該類更動需要確認當前代碼是否消除了原有問題并沒有引入新問題;
3)屬性為完善設(shè)計,表示當前更動對軟件功能和性能沒有不良影響,僅僅是依據(jù)某種目的而進行的改進,如提高可讀性、改善軟件性能、刪除多余變量等.完善設(shè)計修改的影響僅限于被修改的單元或模塊.
針對完善設(shè)計,根據(jù)改進目的,可以進一步細分為等價修改、設(shè)計改進、適應(yīng)性修改,具體如下:
① 等價修改表示代碼更改前后實現(xiàn)功能完全一致,沒有特定的改進目的;
② 設(shè)計改進表示更動前后實現(xiàn)的功能需求相同,但更改后代碼有特定的改進目的;
③ 適應(yīng)性更動表示由于軟件修改而帶來的間接修改,如增加代碼后導(dǎo)致程序中的org位置更動,軟件更改引起的作為參數(shù)的版本號變化等.
相對算法/邏輯更動影響域分析,參數(shù)更動的影響域分析和確認在實際測試過程中尚未得到充分重視和應(yīng)用實施,導(dǎo)致由于參數(shù)更動而未對該參數(shù)相關(guān)的所有代碼進行適應(yīng)性修改,造成相關(guān)功能實現(xiàn)錯誤.以下是在實際的軟件回歸測試過程中由于參數(shù)更動不全面而導(dǎo)致的3個典型遺漏問題實例.
例1.某參數(shù)TMS001位定義變化
參數(shù)TMS001有D7-D0共8位,其中D7未定義,即沒有實際意義,其他各位分別代表不同的意義.由于需求更動引起該參數(shù)的位定義發(fā)生變化,具體說明如下.
1)變化內(nèi)容:“A令接收到標記”由參數(shù)TMS001的D5 位表示改為該參數(shù)的D7位表示;
2)代碼更動:針對上述變化,代碼更動時只在設(shè)置“A令接收到標記”的語句處進行了修改,即由設(shè)置D5=1B改為設(shè)置D7=1B,但是沒有對判斷“A令接收到標記”的語句進行相應(yīng)修改,即沒有把語句if((TMS001&0x20)==0x20)改為if((TMS001&0x80)==0x80),造成代碼修改不全面,判斷錯誤,最終導(dǎo)致對應(yīng)功能無法實現(xiàn).
例2.某參數(shù)STAT定義變化
參數(shù)STAT為數(shù)組變量.參數(shù)STAT的數(shù)組大小根據(jù)新需求發(fā)生變化,具體說明如下.
1)變化內(nèi)容:STAT為數(shù)組變量,數(shù)組大小由86改為100;
2)代碼更動:代碼采用for循環(huán)的方式對該數(shù)組變量進行訪問,該變量對應(yīng)的直接功能模塊中的for語句全部進行了修改,但其他模塊中的兩處for循環(huán)語句卻被遺漏,即語句
for(j=0;j<86;j++)
heat_channel_current_status[j][1] &= 0xbf
沒有改為
for(j=0;j<100;j++)
heat_channel_current_status[j][1] &= 0xbf
上述修改不全面導(dǎo)致對應(yīng)的功能實現(xiàn)錯誤.
例3.新增參數(shù)NUM
NUM是依據(jù)新需求增加的參數(shù),具體變化如下.
1)變化內(nèi)容:新增定義,該變量值組織到遙測參數(shù)中;
2)代碼更動:遙測參數(shù)組織過程中增加參數(shù)NUM的組織,即根據(jù)新需求增加了該變量的定義,并根據(jù)數(shù)據(jù)協(xié)議組織該參數(shù)到一個數(shù)據(jù)包中,但代碼針對該參數(shù)沒有任何賦值操作,導(dǎo)致新增需求無法實現(xiàn).
上述3個實例均是由于未進行充分的參數(shù)更動影響域分析而引起的惡劣后果.因此回歸測試過程中,參數(shù)更動影響域分析是必不可少的.
參數(shù)分為全局參數(shù)和局部參數(shù).在函數(shù)之外定義的變量稱為全局參數(shù),函數(shù)內(nèi)定義的變量稱為局部參數(shù).
2.2.1 全局參數(shù)的更動影響域分析
所有對該全局參數(shù)有讀/寫操作的模塊都會受到影響,需要結(jié)合參數(shù)更動類型進行全面地分析和確認.參數(shù)更動類型通常包括新增參數(shù)、初始值/固定值更動參數(shù)、刪除參數(shù)、形式更動參數(shù)、結(jié)構(gòu)更動參數(shù).
(1) 新增參數(shù)影響域分析
新增參數(shù)為代碼中新增一個變量或數(shù)據(jù),對應(yīng)的影響域分析必須包括如下幾個方面.
1)軟件對該參數(shù)訪問時對應(yīng)的邏輯過程必須與需求規(guī)格說明一致.
2)該參數(shù)被賦過初始值,否則會出現(xiàn)“未初始化就使用”的基本程序問題.
3)至少保證該參數(shù)有一次讀/寫操作,否則會出現(xiàn)新增變量沒有明確的功能意義,存在引入錯誤的可能.
4)結(jié)合該參數(shù)定義類型,對所有引用該參數(shù)的操作語句進行相關(guān)的正確性/合理性分析,具體說明如下:
① 軟件對該參數(shù)的讀取、賦值、保存等操作過程中涉及到的其他參數(shù)類型是否與該參數(shù)類型匹配;
② 如果該參數(shù)參與數(shù)學(xué)運算,需要結(jié)合數(shù)據(jù)類型分析當前運算過程是否會引入運算錯誤(如溢出).
(2)初始值/固定值更動參數(shù)影響域分析
參數(shù)初始值/固定值更動為代碼中的參數(shù)數(shù)值發(fā)生變化,往往不涉及邏輯確認,因此一般情況下,影響域分析時只需確認初始值/固定值設(shè)置是否滿足需求說明,當該參數(shù)參與公式計算或運算時,則需要分析數(shù)值更動是否會引入運算錯誤.
(3) 刪除參數(shù)影響域分析
刪除參數(shù)為代碼中刪除了其定義和使用語句.影響域分析必須包括如下幾個方面:
1) 該參數(shù)不再被任何代碼語句引用;
2) 該參數(shù)涉及的語句被刪除后對應(yīng)的邏輯過程必須滿足新的需求說明.
(4)形式更動參數(shù)影響域分析
形式更動參數(shù)一般情況包括參數(shù)的數(shù)據(jù)類型更動、數(shù)據(jù)長度更動和數(shù)據(jù)元素更動.其中,數(shù)據(jù)類型更動如字符型變?yōu)檎?;?shù)據(jù)長度更動如一個數(shù)組的長度變化;數(shù)據(jù)元素更動如一個參數(shù)的各個位的定義變化、一個數(shù)組中的各個單元的定義變化.
形式更動參數(shù)的影響域分析必須對所有引用該參數(shù)的操作語句進行相關(guān)的正確性/合理性分析.針對每種更動參數(shù)影響域分析的具體說明如下:
1) 數(shù)據(jù)類型更動的參數(shù),往往不涉及代碼邏輯更動,因此影響域分析時只需按照新增參數(shù)中數(shù)據(jù)類型的分析方法進行,確認代碼是否引入新的缺陷;
2)數(shù)據(jù)長度更動的參數(shù),影響域分析時必須對所有引用該參數(shù)的語句進行長度引用分析,確認代碼中該參數(shù)的數(shù)據(jù)長度全部進行了對應(yīng)更動,保證更動的全面性;
3)數(shù)據(jù)元素更動的參數(shù),影響域分析必須對所有引用該參數(shù)的操作語句進行充分分析,確認所有代碼中有關(guān)該參數(shù)的元素定義引用(包括讀和寫)均符合新的協(xié)議規(guī)定和說明.該類型更動在實際的測試過程中經(jīng)常被忽略,導(dǎo)致修改引入新缺陷,因此,本文在此對數(shù)據(jù)元素更動的參數(shù)影響域分析進行重點說明.
數(shù)據(jù)元素更動的參數(shù),指參數(shù)的類型/結(jié)構(gòu)沒有發(fā)生變化,但其內(nèi)部的數(shù)據(jù)元素發(fā)生變化,如變量int DATA[4]保存對象由TK1、TK2、TK3、TK4更改為TK4、TK3、TK2、TK1.
該更動的影響域分析必須確認軟件針對每個參數(shù)元素的所有賦值和讀取操作是否滿足新的需求要求或仍然滿足未更改的原需求,以保證避免如下錯誤認識或結(jié)果:
① 源代碼由DATA[0]→BUF改為DATA[3]→BUF時,應(yīng)該是原需求“保存TK1到緩沖區(qū)BUF中”的適應(yīng)性修改,而不能認為是需求更動;
②源代碼由DATA[1]=5改為DATA[2]=5時,應(yīng)該是原需求“設(shè)置TK2為5”的適應(yīng)性修改,而不能認為是需求更動;
③ 源代碼X=Y+DATA[2]如果沒有更改時,應(yīng)該是原需求X=Y+TK3更改為X=Y+TK2.此時如果用戶需求沒有變化,則代碼實現(xiàn)錯誤;
④ 源代碼DATA[3]=100如果沒有更改時,應(yīng)該是原需求TK4=100更改為TK1=100.此時如果用戶需求沒有變化,則代碼實現(xiàn)錯誤.
(5)結(jié)構(gòu)更動參數(shù)影響域分析
一個參數(shù)如果定義為結(jié)構(gòu)類型,其更動包括新增元素、刪除元素、形式更動元素,更動對應(yīng)的影響域分析可以參見新增參數(shù)、刪除參數(shù)和形式類型更動參數(shù)的對應(yīng)說明.
(6) 參數(shù)更動特征說明
通過以上的分析和說明,參數(shù)修改對應(yīng)的影響域分析相關(guān)的特征總結(jié)如表1所示.
表1 參數(shù)更動對影響域分析的特征說明
2.2.2 局部參數(shù)的更動影響域分析
局部參數(shù)的更動一般情況下只影響本模塊,不需要對其他模塊進行分析確認,但是必須遵循如下原則:如果該參數(shù)在模塊中的操作引入了全局參數(shù)的運算操作,或參與了全局參數(shù)的運算操作,則更動確認時,需要對運算結(jié)果對應(yīng)的范圍及引用該結(jié)果進行運算的所有語句進行分析,以確保當前更動不會引起軟件的運算錯誤.
在前面邏輯/算法和參數(shù)更動影響域分析的基礎(chǔ)上,為確保當前修改對軟件其他功能沒有不良影響,需要綜合分析當前更改引起的其他影響域,相關(guān)的分析原則如下:
1)針對一項代碼更動,必須檢查分析受影響模塊的相關(guān)部分是否做了同步更動;
2)針對一個需求更動,必須分析確認代碼中所有相關(guān)功能均進行了對應(yīng)修改,即回歸影響域分析要確認代碼修改是否全面;
3)影響域分析過程中,必須考慮非功能需求(如性能需求、余量需求)的影響分析,一般情況下,代碼修改后需要重新運行相關(guān)用例對軟件性能進行重新測試,以避免代碼更動引入性能失效;
4)必須考慮中斷程序模塊、其他的進程(線程)、內(nèi)存駐留程序模塊等對當前修改后整體代碼的影響.操作過程中,采用中斷沖突分析技術(shù)進行專項檢測,以避免代碼更動引入中斷資源使用沖突或中斷時序錯誤.
本文說明了一種基于更動影響域分析的回歸測試方法.采用該方法,測試人員需要進行回歸測試時,就可以很容易地識別軟件哪些功能和模塊需要重新測試,從而快速地從基線測試用例庫中提取、修訂合適的測試用例組成新的回歸測試用例包,通過運行回歸測試用例包來實現(xiàn)回歸測試.該方法在嵌入式軟件回歸測試過程中已經(jīng)得到實際應(yīng)用.結(jié)果表明該方法在有效降低成本的前提下,可保證測試充分性,從而大大提高測試質(zhì)量.在該回歸方法的基礎(chǔ)上,下一步需要進行相關(guān)工具的研究以實現(xiàn)測試自動化,進一步提高測試效率.
參 考 文 獻
[1]閆宇華,李誼,黃寧,等.軍用軟件測評實驗室測評過程和技術(shù)能力要求[S].北京:總裝電子信息部,2005:26-28
[2]IEEE.Standard glossary of software engieering terminology[S]. New York: IEEE Std,1990
[3]Rothermel G,Harrold M.Analyzing regression test selection techniques[J].IEEE Transactions on Software Engineering,1996,22(8):529-551
[4]Memon A M,Xie Q.Studying the default-detection effectiveness of GUI test cases for rapidly evolving software[J].IEEE Transactions on Software Engineering,2005,31(10):884-896
[5]陳永鄭,李龍封.基于程序切片技術(shù)的回歸測試方法研究[J].計算機技術(shù)與發(fā)展,2007,17(12):113-115
Chen Y Z,Li L S.Regression testing based on program slicing[J]. Computer Technology and Development, 2007,17(12):113-115
[6]馬軍勇,楊勝建.軟件回歸測試研究[J].電子測試,2009,6(6):56-59
Ma J Y,Yang S J. Software regression testing and it’s practice[J]. Electronic Test,2009,6(6):56-59
[7]王小麗,段永顥.軟件回歸測試用例選取方法研究[J].空間控制技術(shù)與應(yīng)用,2010,36(3):46-51
Wang X L,Duan Y H. Research and application on regression test suite selection[J].Aerospace Control and Application,2010,36(3):46-51
[8]古樂,史九林.軟件測試技術(shù)概論[M].北京:清華大學(xué)出版社,2007:216-217