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