李 娟,陳光武,范多旺
(蘭州交通大學(xué) 光電技術(shù)與智能控制教育部重點(diǎn)實(shí)驗(yàn)室,蘭州 730070)
計(jì)算機(jī)聯(lián)鎖系統(tǒng)是保證鐵路行車安全和效率的實(shí)時(shí)控制和防護(hù)系統(tǒng)。聯(lián)鎖軟件是聯(lián)鎖系統(tǒng)的安全性關(guān)鍵軟件,通過自動(dòng)測試可盡早發(fā)現(xiàn)并排除聯(lián)鎖軟件潛在的缺陷,使聯(lián)鎖軟件運(yùn)行時(shí)發(fā)生故障的幾率降到最低。聯(lián)鎖軟件測試的實(shí)質(zhì)是針對所設(shè)計(jì)的一組測試用例,執(zhí)行聯(lián)鎖程序,以發(fā)現(xiàn)聯(lián)鎖程序的缺陷。測試用例的設(shè)計(jì)與生成是聯(lián)鎖軟件測試中的難點(diǎn)和關(guān)鍵,它決定著軟件測試的質(zhì)量,影響軟件測試的效率和速度。
測試用例的自動(dòng)生成是在特定的數(shù)據(jù)空間中尋找符合測試標(biāo)準(zhǔn)的輸入數(shù)據(jù),執(zhí)行將實(shí)際結(jié)果與預(yù)期結(jié)果比較的過程。本文研究的重點(diǎn)是測試用例質(zhì)量的提高和優(yōu)化。該問題具有非線性特點(diǎn),而遺傳算法的優(yōu)化計(jì)算和全局尋優(yōu)搜索策略適合于處理高度復(fù)雜的非線性問題。本文提出一種新的設(shè)計(jì)方案:應(yīng)用基于成對組合的遺傳算法進(jìn)行聯(lián)鎖測試用例自動(dòng)生成和優(yōu)化,以提高聯(lián)鎖測試用例的質(zhì)量。
成對組合覆蓋是軟件測試方法之一,同時(shí)也是衡量測試充分性的一種準(zhǔn)則。它是一種面向應(yīng)用的測試方案,按照兩兩覆蓋的原則產(chǎn)生測試用例。成對組合的測試目標(biāo)是所設(shè)計(jì)的測試用例集合對系統(tǒng)的所有對象可能取值的兩兩組合至少覆蓋一次。滿足成對組合的最小測試用例集實(shí)際上是經(jīng)典的NP-Complete問題,目前主要采用啟發(fā)式算法或人工智能方法產(chǎn)生測試用例的最優(yōu)解。
測試用例最優(yōu)解的生成模型分析如下。設(shè)DC為道岔測試用例集合,DZ為其一個(gè)子集,對應(yīng)每個(gè)測試用例都有相應(yīng)的測試代價(jià),DR為測試需求。測試用例最優(yōu)解問題等價(jià)于如何從測試用例空間DC中選取最小數(shù)量的用例子集DZ,使DZ能夠以最小的測試代價(jià)覆蓋測試需求集DR。
設(shè)道岔測試有3個(gè)輸入?yún)?shù)A、B、C。A表示道岔,有2個(gè)值A(chǔ)1、A2,V(A)={1/3,5};B表示操縱,有4個(gè)值B1、B2、B3、B4,V(B)={定位單獨(dú)操縱, 反位單獨(dú)操縱,單獨(dú)解鎖,單獨(dú)鎖閉};C表示條件,有4個(gè)值C1、C2、C3、C4,V(C)={一般狀態(tài),進(jìn)路鎖閉,區(qū)段鎖閉,引導(dǎo)總鎖閉}。測試需求集DR可描述為DR={dr1,dr2,dr3,dr4,dr5},其中需求dr1為道岔定、反位單獨(dú)操縱,dr2為道岔單獨(dú)鎖閉、操縱、解鎖,dr3為進(jìn)路鎖閉后道岔單操測試,dr4為區(qū)段鎖閉后道岔單操測試,dr5為引導(dǎo)總鎖閉后道岔單操測試。按照全覆蓋準(zhǔn)則,共需2×4×4=32個(gè)測試用例。而應(yīng)用成對組合覆蓋可以只包含16個(gè)測試用例。
圖1 道岔測試用例生成過程
測試用例生成過程如圖1,采用的是AETG啟發(fā)式算法。AETG(Automatic Efficient Test Genera-tor,自動(dòng)高效測試生成器)開始于一個(gè)空的測試用例集,每次根據(jù)貪心算法產(chǎn)生一組候選用例,從中選取能夠覆蓋最多未被覆蓋的成對組合的用例為新的測試用例。最初未被覆蓋的成對組合集WZ={(A1,B1),(A1,B2),(A1,B3), (A1,B4),(A1,C1),(A1,C2),(A1,C3),(A1,C4),(A2,B1),(A2,B2),(A2,B3),(A2,B4),(A2,C1),(A2,C2),(A2,C3),(A2,C4),(B1,C1),(B1,C2),(B1,C3),(B1,C4),(B2,C1),(B2,C2),(B2,C3),(B2,C4), (B3,C1), (B3,C2),(B3,C3),(B3,C4),(B4,C1),(B4,C2),(B4,C3),(B4,C4)}。首先選擇測試用例DC1=(A1,B1,C1),然后去掉WZ中的(A1,B1)、(A1,C1)和(B1,C1), 以剩下的組合中出現(xiàn)次數(shù)最多的A2為中心選擇DC2=(A2,B2,C2)。按照同樣的方法依次遞歸產(chǎn)生新的測試子集,直到集合WZ為空。測試用例集和測試需求間的覆蓋關(guān)系如表1。
表1 測試用例與測試需求覆蓋表
此例中利用16個(gè)交互測試用例組合覆蓋測試需求,能有效地避免測試用例集之間產(chǎn)生的組合爆炸問題。采用傳統(tǒng)的貪心搜索方法求得的測試用例集并非最小化的測試用例子集,其中包含大量的冗余測試用例,影響了測試效率。
本文在設(shè)計(jì)遺傳算法時(shí)主要考慮3個(gè)因素:可靠性,收斂性,穩(wěn)定性。
解決滿足覆蓋需求的軟件測試用例集生成問題時(shí),通常先以隨機(jī)方法產(chǎn)生初始種群,然后將種群中的不可行個(gè)體通過選擇、交叉、變異轉(zhuǎn)化為可行個(gè)體,再根據(jù)種群中個(gè)體的適應(yīng)度函數(shù)值選取最優(yōu)的測試用例子集?;谏鲜鏊悸?,本文將GA嵌入到AETG中,并從貪心算法改進(jìn)為遺傳算法生成新的測試用例集。以道岔測試為例,所設(shè)計(jì)的算法框架如圖2。
圖2 算法的整體流程
其中遺傳算法的代碼結(jié)構(gòu)如下所示:
Genetic Algorithm Program
Begin
t<-0;
initialize(); //隨機(jī)產(chǎn)生N個(gè)個(gè)體進(jìn)行種群初始化
execute solution();//運(yùn)行N個(gè)初始個(gè)體
圖3 道岔測試用例的編碼表示
遺傳算法處理過程中參數(shù)編碼對算法的效率、性能有很大的影響。為了將問題的潛在解使用適合遺傳算法的基因編碼表示,本文將組合測試中的輸入?yún)?shù)映射到位串空間Bl={0,1}l上,然后在其上進(jìn)行遺傳操作,得到的結(jié)果再通過解碼過程還原成其表現(xiàn)型以進(jìn)行適應(yīng)度函數(shù)值的評估。根據(jù)各個(gè)參數(shù)的取值范圍確定其編碼長度。若一個(gè)參數(shù)的最大取值為Li,且2n-1
適應(yīng)度函數(shù)是用以區(qū)分種群中個(gè)體好壞的演進(jìn)過程。利用遺傳算法生成的測試用例集,在滿足成對組合覆蓋的前提下,其例數(shù)盡可能的少。關(guān)于進(jìn)化個(gè)體的適應(yīng)度可按以下公式計(jì)算:
其中Cov(DCj)是用例集DCj的測試覆蓋度,Cost(DCj) 是用例集DCj的測試運(yùn)行代價(jià)。Cov(DCj)可按式(2)計(jì)算,Cost(DCj)可按式(3)計(jì)算。
測試用例中的覆蓋信息由表1給出,在第j列中有多少個(gè)“X”,就代表測試用例DCj覆蓋了哪些測試需求。設(shè)向量Xj=[xj1,xj2,…,xjk]表示表1中第j列的信息,向量W=[w1,w2,…,wk]表示每個(gè)測試需求的權(quán)重,用例子集DZ覆蓋度可按下式計(jì)算:
從以上計(jì)算方法可以看出,F(xiàn)值越高表示單位測試代價(jià)下測試用例子集DZ的覆蓋度越大。
遺傳算法的基本操作包括3種:選擇、雜交和變異操作。
不同的選擇策略將導(dǎo)致不同的選擇壓力,從而影響算法的收斂速度。選用輪賭盤模型,選擇算子從當(dāng)前群體中按照某一概率選擇一些個(gè)體作為新生種群的父輩,某個(gè)體Xi被選擇的概率Pi與其適應(yīng)度函數(shù)值成正比。設(shè)累計(jì)函數(shù)Lj=∑i=1~jPi,每個(gè)個(gè)體DCj處于選擇區(qū)間[Lj,Lj+1),計(jì)算時(shí)每一輪產(chǎn)生一個(gè)[0,1]均勻分布的隨機(jī)數(shù),以該隨機(jī)數(shù)為指針來確定對應(yīng)選擇區(qū)間的個(gè)體。個(gè)體的適應(yīng)值越大,它被選擇到的機(jī)會(huì)越多,其基因被遺傳到下一代的可能性越大。
雜交運(yùn)算是遺傳算法區(qū)別于其他進(jìn)化算法的重要特征。它的設(shè)計(jì)與所研究的問題密切相關(guān),本文采用單點(diǎn)雜交操作,能較少的破壞優(yōu)良個(gè)體的性狀,同時(shí)有效地產(chǎn)生較好的新個(gè)體。單點(diǎn)雜交是指在個(gè)體編碼串中只隨機(jī)設(shè)計(jì)一個(gè)雜交點(diǎn),然后在該點(diǎn)相互交換兩個(gè)配對個(gè)體的部分染色體。兩個(gè)長度為n的個(gè)體編碼串進(jìn)行單點(diǎn)雜交的過程如圖4。
圖4 單點(diǎn)雜交示意圖
變異操作可改善遺傳算法的局部搜索能力,維持群體的多樣性,防止出現(xiàn)過早收斂。本文中二值基因鏈模型,采用基本位變異操作,即對指定的變異點(diǎn)進(jìn)行取反運(yùn)算。若測試用例子集A編碼為:10111010,對選取的第5位基因值取反后產(chǎn)生新的A編碼為:10110010。雜交算子和變異算子的相互配合,共同完成對搜索空間的全局搜索和局部搜索,實(shí)現(xiàn)測試用例最優(yōu)解的尋優(yōu)過程。
遺傳算法因其自身強(qiáng)大的魯棒性和全局尋優(yōu)搜索能力,在解決非線性、大空間的測試數(shù)據(jù)自動(dòng)生成中顯示出獨(dú)特的優(yōu)勢和高效性。將其嵌入到成對組合的啟發(fā)式算法AETG中,可有效的減少冗余測試用例,更快的收斂到全局近似最優(yōu)解,提高測試效率。本文以道岔測試為例,著重介紹了應(yīng)用基于成對組合覆蓋的遺傳算法進(jìn)行計(jì)算機(jī)聯(lián)鎖測試用例生成和優(yōu)化的新想法,并對其應(yīng)用過程進(jìn)行了分析探討,給出了具體的設(shè)計(jì)思路。