向日鋒,毛宇光
(南京航空航天大學(xué)計算機科學(xué)與技術(shù)學(xué)院,江蘇 南京 211106)
隨著信息技術(shù)的飛速發(fā)展,計算機軟件深入社會中的航天、零售、醫(yī)療、金融、汽車等各個領(lǐng)域。但是,在軟件的設(shè)計、開發(fā)等階段都可能引入錯誤從而導(dǎo)致軟件功能部分或者整體失效,甚至引發(fā)嚴(yán)重的生產(chǎn)安全問題,這使得軟件質(zhì)量也不得不受到人們的關(guān)注。
軟件測試是保證軟件可靠性的重要手段,能夠有效地保證產(chǎn)品的質(zhì)量。GUI測試是一個新的測試研究領(lǐng)域,隨著GUI應(yīng)用的快速發(fā)展,GUI測試的研究卻相對滯后,這對整個軟件開發(fā)和測試過程都有著不可估量的影響。測試用例生成問題是GUI測試的核心所在,同時,因為GUI的圖形界面特點和巨大的狀態(tài)空間,使得測試評判的生成也存在諸多難點,所以研究針對GUI測試特有的測試用例生成和測試評判生成方法有極其重要的意義。
在生成GUI測試用例的過程中,有一個很重要的環(huán)節(jié),就是對GUI軟件進(jìn)行行為建模。事件流圖(Event Flow Graph, EFG)是一種常見的基于行為模型的GUI測試方法。EFG模型中節(jié)點表示事件,有向邊表示事件之間的發(fā)生先后關(guān)系,根據(jù)相鄰節(jié)點的序列長度制定測試覆蓋準(zhǔn)則,結(jié)合EFG模型生成測試用例。該模型最早是由Memon[1]在對GUI測試的覆蓋率研究時提出的,建立該模型的目的是為了更好地描述GUI中對象的事件和事件之間的交互關(guān)系。但是EFG模型只關(guān)注事件以及事件之間的交互,沒有關(guān)注事件所對應(yīng)的事件處理函數(shù)的代碼結(jié)構(gòu)以及事件處理函數(shù)之間的代碼依賴關(guān)系,導(dǎo)致生成的測試用例代碼覆蓋率不高,同時還會生成很多的無效測試用例。對于事件體積量不斷增大的GUI軟件,生成的測試用例數(shù)量呈指數(shù)級增長,大大制約了GUI軟件的測試效率[2]。
在EFG模型的基礎(chǔ)上,陳軍成[3-4]等人提出了基于事件處理函數(shù)模型(Event-Hander Function Graph, EHG)的GUI測試方法。EHG中節(jié)點表示事件處理函數(shù),有向邊表示事件處理函數(shù)被觸發(fā)的先后關(guān)系。根據(jù)事件處理函數(shù)的代碼結(jié)構(gòu)以及事件處理函數(shù)之間的代碼依賴關(guān)系制定測試覆蓋準(zhǔn)則[5],結(jié)合EHG模型生成測試用例。EHG和EFG相比較,主要作了2方面的改進(jìn),一方面清晰地表述了代碼交互事件和默認(rèn)事件的關(guān)系,不會生成沒有事件組合意義的無效測試用例,另一方面EHG模型要比EFG模型小,在控件越多的GUI軟件上尤為明顯。
一些事件對應(yīng)的事件處理函數(shù)包含了較多的變量,或者事件處理函數(shù)之間的定義-引用對較多,包含越多這樣的事件的測試用例就越容易發(fā)現(xiàn)軟件的缺陷。基于EHG模型的測試方法未考慮到事件的權(quán)重值以及事件之間的依賴關(guān)系,這會導(dǎo)致在測試用例集數(shù)量較為龐大的條件下GUI軟件缺陷檢測的效率降低。本文提出一種基于帶權(quán)重的事件處理函數(shù)模型(Event-Hander Graph based on Weight, WEHG)的GUI測試方法。WEHG和EHG相比較,主要作了2方面的改進(jìn),一方面根據(jù)事件處理函數(shù)中定義變量和引用變量的數(shù)量和給對應(yīng)的節(jié)點設(shè)置權(quán)重值,從而保證擁有更多變量的節(jié)點能夠優(yōu)先生成測試用例,另一方面根據(jù)事件處理函數(shù)的定義-引用對給節(jié)點之間的依賴關(guān)系設(shè)置依賴值,使依賴度高的節(jié)點能夠優(yōu)先加入測試序列中。通過該方法生成具有優(yōu)先級排序的測試用例集,在版本更新較快或者窗體界面較多的GUI軟件中能夠生成針對性更強的測試用例集,并且優(yōu)先執(zhí)行能更快發(fā)現(xiàn)軟件缺陷的測試用例,提高軟件測試的效率。
下面給出一些關(guān)于行為模型的定義,以便理解本文提出的基于WEHG模型的GUI軟件測試用例生成方法。
定義1GUI狀態(tài)。假設(shè)應(yīng)用程序包括n個GUI窗體類w1,w2,…,wn和m個非窗體類靜態(tài)數(shù)據(jù)成員sd1,sd2,…,sdm,窗體類wi的k個數(shù)據(jù)成員DMwi={mvi1,mvi2,…,mvik} (0
定義2GUI事件。GUI事件是一個三元組:operator(evtName,precondition,effect),其中,evtName表示GUI事件的名稱及參數(shù),precondition表示GUI事件發(fā)生的前提條件,effect表示GUI事件發(fā)生后的GUI狀態(tài)[6]。
定義3GUI變量。GUI變量包括GUI狀態(tài)變量、GUI控件變量、內(nèi)部變量。其中窗體類數(shù)據(jù)成員和非窗體類靜態(tài)數(shù)據(jù)成員稱為GUI狀態(tài)變量。GUI窗體類中,聲明的GUI控件數(shù)據(jù)成員稱為GUI控件變量,其他非GUI控件變量的GUI狀態(tài)變量稱為GUI內(nèi)部變量[3]。
定義4GUI事件處理函數(shù)。事件處理函數(shù)為一個三元組,其形式為ehf(se,source,ue)。其中,se表示觸發(fā)事件處理函數(shù)ehf執(zhí)行的代碼交互事件集合。source表示ehf所對應(yīng)的事件處理函數(shù)的函數(shù)體,利用此信息可以分析事件處理函數(shù)的控制流圖、數(shù)據(jù)流圖等信息。ue表示ehf執(zhí)行時,接收的默認(rèn)事件集合[7]。
定義5GUI事件依賴。GUI事件依賴[5]是一個三元組:dependent(u,e0,e1),其中,e0和e1表示待測軟件中的2個GUI事件,u表示e0和e1之間的依賴度,由e0和e1對應(yīng)事件處理函數(shù)中的GUI變量決定。
定義6事件處理函數(shù)的定義-引用對。若事件處理函數(shù)ehf1和事件處理函數(shù)ehf2出現(xiàn)在同一個測試用例t中,存在一個GUI變量v在事件處理函數(shù)ehf1某條語句中被定義,在另一個事件處理函數(shù)ehf2某條語句中被使用到,那么稱(ehf1,ehf2,v)是測試用例t中關(guān)于變量v的事件處理函數(shù)的定義-引用對。
建立事件流圖EFG模型的目的是通過模擬窗體內(nèi)的事件和事件之間的交互關(guān)系來生成滿足測試需求的測試用例集[2,8]。由一個三元組M=(E,R,I)組成,EFG中節(jié)點的集合E表示GUI中的事件,邊的集合R,即有序?qū)?ex,ey)的集合,其中ex∈E, ey∈E,且(ex,ey)∈R,表示事件執(zhí)行的先后關(guān)系。I?R表示初始狀態(tài)下的事件集合,即剛啟動軟件用戶可以執(zhí)行的事件集合。
事件處理函數(shù)圖EHG模型由一個二元組EHG(V,E)組成,V表示事件處理函數(shù)集合,E表示V中元素對的有窮集合,即有序?qū)?nx,ny)的集合,其中nx∈V, ny∈V,且(nx,ny)∈E,則事件處理函數(shù)nx執(zhí)行之后,可以執(zhí)行事件處理函數(shù)ny。
帶權(quán)重的事件處理函數(shù)圖WEHG由一個四元組EHG(V,E,ψ,Ω)組成,V表示事件處理函數(shù)集合,E表示V中元素對的有窮集合,即有序?qū)?nx,ny)的集合,其中nx∈V, ny∈V,且(nx,ny)∈E,則事件處理函數(shù)nx執(zhí)行之后,可以執(zhí)行事件處理函數(shù)ny。ψ表示圖中所有有向邊的依賴度集合,邊(nx,u,ny)∈ψ表示節(jié)點之間的依賴關(guān)系。u∈N+表示e和e′之間的依賴度,Ω表示事件處理函數(shù)的權(quán)重值集合。
為了解決大量的測試用例無法盡快找到軟件缺陷的問題,本文提出一種基于帶權(quán)重的事件處理函數(shù)模型生成GUI軟件測試用例的方法對GUI軟件建模。其基本流程如下:
1)利用Windows操作系統(tǒng)提供的微軟用戶界面自動化(User Interface Automation, UIA)框架識別待測軟件(Application Under Test, AUT)中的所有控件以及控件的屬性,通過UIA提供的接口驅(qū)動AUT執(zhí)行,并生成該AUT的EFG模型。
2)利用Roslyn工具對AUT源代碼進(jìn)行靜態(tài)分析,獲得所有事件處理函數(shù)之間的定義-引用對,根據(jù)定義-引用對給所有控件設(shè)置權(quán)重,在控件之間設(shè)置依賴度大小值,生成WEHG模型。
3)利用WEHG模型生成抽象的測試用例集。
4)將抽象的測試用例集每一個測試用例結(jié)合EFG模型生成完整的測試用例。
在上述步驟中,WEHG模型中節(jié)點之間的依賴關(guān)系和節(jié)點的權(quán)重值是指導(dǎo)測試用例生成的重要信息。本文接下來主要介紹構(gòu)造WEHG模型的算法以及基于WEHG模型的GUI測試用例生成算法。
算法1描述了WEHG模型的構(gòu)造過程,它的輸入是待測軟件AUT和EHG模型(V,E),輸出是WEHG模型(V′,E′,ψ,Ω),該算法的事件復(fù)雜度是O(n2),空間復(fù)雜度是O(1)。
算法1構(gòu)造WEHG模型
輸入:AUT,EHG模型(V,E)
輸出:WEHG模型(V′,E′,ψ,W)
1. E′=E
2. V′=V //將EHG模型中節(jié)點和節(jié)點間的關(guān)系傳給WEHG模型
3. W={ }, R={ }, R′={ }
4. for each (e in E) do //給每個節(jié)點設(shè)置權(quán)重
5. W=getFieldsWritten(e,AUT)
6. R=getFieldsRead(e,AUT)
7. ω=|W∪R|
8. Ω=Ω∪(e,ω)
9. for each (e′ in E) do //給相關(guān)聯(lián)節(jié)點設(shè)置依賴度
10. R′=getFieldsRead(e′,AUT)
11. if (W∩R′≠Φ) then
12. u=|W∪R′|
13. ψ=(e,u,e′)
14. end if
15. end for
16. end for
算法2描述了基于WEHG模型生成抽象測試用例的過程,它的輸入是WEHG模型(V′,E′,ψ,Ω),抽象測試用例最大長度len,每個頭節(jié)點可產(chǎn)生的測試用例的最大數(shù)目top,輸出是抽象測試用例集П。該算法的事件復(fù)雜度是O(n3),空間復(fù)雜度是O(1)。
算法2生成抽象測試用例
輸入:WEHG模型(V′,E′,ψ,Ω),抽象測試用例最大長度len,每個頭節(jié)點可產(chǎn)生的測試用例的最大數(shù)目top
輸出:抽象測試用例集П
1. П={}
/*將所有節(jié)點作為抽象測試用例第一個節(jié)點遍歷生成測試用例*/
2. while Ω≠Φ do
3. e=Max((e,ω),Ω)//優(yōu)先選擇權(quán)重大的節(jié)點
4. Ω=Ω-(e,ω)
5. Queue of abstract test cases П′={}
6. ψ′=ψ
7. while |П′| 8. Sequence of events π=e 9. Event e′=e 10. while |π| //查找和當(dāng)前節(jié)點依賴度最大的節(jié)點加入當(dāng)前抽象測試用例中 11. do 12. e′=Max((e,u,e′),ψ′) 13. π=π*e′ 14. end while 15. П′=П′∪π 16. end while 17. П=П+П′ 18. end while 19. return П 算法3描述了結(jié)合EFG模型和算法2生成的抽象測試用例集生成可執(zhí)行測試用例的過程,它的輸入是EFG模型(E,I,δ)和抽象測試用例集П,輸出是可執(zhí)行測試用例集T,該算法的事件復(fù)雜度是O(n2),空間復(fù)雜度是O(1)。 算法3生成可執(zhí)行測試用例 輸入:EFG模型(E,I,δ),抽象測試用例集П 輸出:可執(zhí)行測試用例集T 1. Sequences of events T={} /*對于抽象測試用例集П中所有測試用例進(jìn)行遍歷生成可執(zhí)行的測試用例*/ 2. for each tc in П do 3. for each Sequence ei,…,ejin tc do /*在EFG模型中查找當(dāng)前測試用例中每一個節(jié)點的可達(dá)路徑*/ 4. pick e0from I 5. Path tc=shortestPath(e0,ei) 6. for k=i to j-1 do 7. tc=tc*shortestPath(ek,ek+1) 8. end for 9. end for 10.T=T∪{tc}//將生成的測試用例加入可執(zhí)行測試用例集T中 11. end for 12. return T 為了驗證提出的基于WEHG模型的GUI軟件測試用例生成方法的有效性,本文設(shè)計并實現(xiàn)了基于UIA框架和Roslyn的GUI測試工具[9],其中Roslyn主要是對窗體上控件的源代碼進(jìn)行靜態(tài)分析,UIA框架可獲得所有控件的詳細(xì)信息,并將控件之間的關(guān)系以樹形圖表示,同時可使用UIA框架提供的接口驅(qū)動被測軟件的執(zhí)行。 本文實驗選用的待測軟件是很多GUI測試研究都選用的Notepad記事本軟件,該軟件是由C#實現(xiàn)的開放源代碼的程序,雖然控件規(guī)模比較小,但是有很豐富的控件類型,GUI對象之間的關(guān)系也比較復(fù)雜,具有一定的代表性,適合缺陷注入和測試。為了充分測試該方法的缺陷偵測效率,并且盡量使缺陷的類型多樣化,給該待測軟件注入了10個缺陷[10],如表1所示。 表1 缺陷注入列表 注入位置缺陷描述菜單選項FileFile選項展開后缺少SaveAs選項Save選項快捷鍵未設(shè)置Gore>Bush>NaderNader>Gore>Bush菜單選項Edit的子選項Cut選中文字后,剪切操作無效Font設(shè)置字體設(shè)置無效About窗口中的Label單詞“Programmed”拼寫錯誤About窗口中的OK按鈕OK狀態(tài)變?yōu)镈isable將OK按鈕的功能設(shè)置為Cancel按鈕的功能Help菜單選項的Register子選項期望的Register對話框沒有彈出 本實驗全部在Windows 7操作系統(tǒng)上進(jìn)行,硬件平臺為Intel Core i3-3110 2.4 GHz雙核,4 GB RAM。 本文為了測試用例生成方法的需要和對生成測試用例性能的評判,定義2個GUI測試用例評價準(zhǔn)則。 定義7事件處理函數(shù)覆蓋準(zhǔn)則。程序中的每一個事件處理函數(shù)對應(yīng)的事件至少被執(zhí)行一次,即WEHG模型中每個節(jié)點至少被覆蓋一次。 使用事件處理函數(shù)覆蓋率來評判測試用例集的事件處理函數(shù)覆蓋情況,計算公式為: 其中,NODE(ST)表示測試用例集ST所覆蓋的WEHG模型中頂點的集合,NG表示事件WEHG模型中所有頂點的集合。 定義8事件處理函數(shù)交互覆蓋準(zhǔn)則。檢查模型中可能的事件處理函數(shù)之間的交互關(guān)系,要求當(dāng)事件處理函數(shù)nx執(zhí)行后,可執(zhí)行的事件處理函數(shù)ny至少被執(zhí)行一次,即WEHG模型中每條有向邊至少被覆蓋一次。 使用事件處理函數(shù)交互覆蓋率來評判測試用例集的事件處理函數(shù)的定義-引用對覆蓋情況,計算公式為: 其中,EDGE(ST)表示測試用例集ST所覆蓋的WEHG模型中有向邊的集合,EG表示W(wǎng)EHG模型中所有有向邊的集合。 表2給出了待測軟件Notepad在EFG模型、EHG模型以及WEHG模型中的規(guī)模,此外,通過Roslyn工具靜態(tài)分析得到待測軟件Notepad的事件處理函數(shù)定義-引用對個數(shù)為55。 表2 Notepad的EFG,EHG和WEHG規(guī)模 模型類型節(jié)點數(shù)/個邊數(shù)/條EFG34896EHG/WEHG29677 本次實驗基于EFG模型共生成692個測試用例,其中有32個無效測試用例,基于EHG模型和WEHG模型各生成386個測試用例,其中基于WEHG模型生成的測試用例做了優(yōu)先級排序?;?種模型生成的前50個測試用例中事件處理函數(shù)的覆蓋情況如圖1所示,可以看到,在執(zhí)行相同數(shù)目的測試用例的時候,基于EFG模型生成的測試用例事件處理函數(shù)覆蓋率最低,基于EHG模型生成的測試用例事件處理函數(shù)覆蓋率次之,而基于WEHG模型生成的測試用例對事件處理函數(shù)的覆蓋效率最高,在執(zhí)行到第43個測試用例時就已經(jīng)覆蓋了所有的事件處理函數(shù)。本次實驗說明了基于WEHG模型生成的測試用例能最快地執(zhí)行所有的事件處理函數(shù),當(dāng)單個事件處理函數(shù)對應(yīng)的事件本身有缺陷時,使用本文提出的方法能夠盡快地發(fā)現(xiàn)缺陷。 圖1 前50個測試用例事件處理函數(shù)覆蓋率的變化圖 圖2反映了執(zhí)行基于3種模型生成的所有測試用例中事件處理函數(shù)的定義-引用對的覆蓋情況,從圖中可以看出,在執(zhí)行相同的測試用例數(shù)時,基于EFG模型生成的測試用例覆蓋的事件處理函數(shù)的定義-引用對數(shù)量最小,EHG模型次之,WEHG模型最大。這是由于建立EFG模型時未考慮代碼層中不同事件之間同一變量的相互關(guān)系,從而導(dǎo)致生成的測試用例事件處理函數(shù)的定義-引用對覆蓋不完全。而EHG模型雖然能夠覆蓋所有的事件處理函數(shù)的定義-引用對,但是沒有根據(jù)事件處理函數(shù)中變量和定義-引用對對模型中節(jié)點和邊設(shè)置權(quán)重值,導(dǎo)致一些定義-引用對在后部分測試用例中才能執(zhí)行到。WEHG模型就解決了這個問題,提高了定義-引用對的覆蓋效率。 圖2 事件處理函數(shù)的定義-引用對覆蓋數(shù)量的變化圖 圖3反映了執(zhí)行基于3種模型生成的所有測試用例中發(fā)現(xiàn)缺陷的情況,從圖中可以看出,基于EFG模型生成的測試用例有一個注入的缺陷沒有發(fā)現(xiàn),基于EHG模型和WEHG模型生成的測試用例發(fā)現(xiàn)了所有注入的缺陷,相比EHG模型,WEHG模型能夠更快地發(fā)現(xiàn)GUI軟件中的缺陷。 圖3 發(fā)現(xiàn)缺陷的數(shù)目變化圖 綜上所述,本文提出的基于WEHG模型的GUI軟件測試用例生成方法能夠進(jìn)一步提高GUI軟件測試的效率,降低GUI測試的開銷。且實驗證明了通過對事件處理函數(shù)的事件所對應(yīng)WEFG模型中節(jié)點設(shè)置權(quán)重,以及事件處理函數(shù)中的定義-引用對所對應(yīng)節(jié)點之間的邊設(shè)置依賴度,一方面能夠更快地覆蓋待測軟件中的事件處理函數(shù)和事件處理函數(shù)中的定義-引用對,另一方面能更快地發(fā)現(xiàn)軟件中的缺陷。 本文首先對EHG模型進(jìn)行改進(jìn),通過對源代碼的靜態(tài)分析,對模型中的節(jié)點設(shè)置了權(quán)重,對邊設(shè)置了依賴度,接著提出了基于WEHG模型生成抽象測試用例的算法,并結(jié)合EFG模型生成可執(zhí)行測試用例。最后通過實驗驗證了本文提出的方法能有效提高覆蓋事件處理函數(shù)和事件處理函數(shù)中定義-引用對的覆蓋效率。在后續(xù)的研究中,將進(jìn)一步提出對測試用例預(yù)判信息自動化生成的方法,并研究如何在能更多地發(fā)現(xiàn)缺陷的條件下進(jìn)一步降低測試用例的數(shù)量。 參考文獻(xiàn): [1] Memon A M. A Comprehensive Framework for Testing Graphical User Interfaces[D]. University of Pittsburgh, 2001. [2] Dietrich C, Hoffmann M, Lohmann D. Cross-kernel control-flow-graph analysis for event-driven real-time systems[C]// Proceedings of the 16th ACM SIGPLAN/SIGBED Conference on Languages, Compilers and Tools for Embedded Systems. 2015: Article No. 6. [3] 陳軍成,薛云志,趙琛. 一種基于事件處理函數(shù)的GUI測試方法[J]. 軟件學(xué)報, 2013,24(12):2830-2842. [4] 陳軍成,薛云志,陶秋銘,等. 基于事件處理函數(shù)的GUI測試用例集約簡技術(shù)[J]. 軟件學(xué)報, 2015,26(8):1871-1885. [5] Qian Siyou, Jiang Fan. An event interaction structure for GUI test case generation[C]// Proceedings of the 2nd IEEE International Conference on Computer Science and Information Technology. 2009:619-622. [6] Yuan Xun, Memon A M. Iterative execution-feedback model-directed GUI testing[J]. Information and Software Technology, 2010,52(5):559-575. [7] Zhao Lei, Gao Dongdong. GUI test case generation based on activity-flow graph[C]// Proceedings of the 7th IEEE International Conference on Software Engineering and Service Science. 2016:738-741. [8] 路斯瑤,胡飛. 基于事件流圖的用戶界面測試優(yōu)化[J]. 測控技術(shù), 2010,29(5):72-76. [9] Tovinkere V, Voss M. Flow graph designer: A tool for designing and analyzing Intel?threading building blocks flow graphs[C]// Proceedings of the 43rd International Conference on Parallel Processing Workshops. 2014:149-158. [10] 汪春. 基于事件流圖的GUI自動化測試模型研究[D]. 武漢:華中科技大學(xué), 2007. [11] 郭晶晶. 基于調(diào)用堆棧的GUI測試研究[D]. 上海:上海師范大學(xué), 2010. [12] 江琴,劉琳嵐,蘇曦,等. 基于事件權(quán)重的GUI測試路徑生成方法[J]. 計算機應(yīng)用, 2009,29(5):1382-1384. [13] Brooks P A, Memon A M. Automated GUI testing guided by usage profiles[C]// Proceedings of the 22nd IEEE/ACM International Conference on Automated Software Engineering. 2007:333-342. [14] Suman, Chhillar R S. Generate optimized GUI test sequence using GA and fuzzy logic[J]. International Journal of Computer Applications, 2014,102(12):8-11. [15] 于冬琦,彭鑫,趙文耘. 使用抽象語法樹和靜態(tài)分析的克隆代碼自動重構(gòu)方法[J]. 小型微型計算機系統(tǒng), 2009,30(9):1752-1760. [16] He Wei, Wang Yueke, Xing Kefei, et al. Error-rate estimation based on multi-signal flow graph model and accelerated radiation tests[J]. PLoS One, 2016,11(9), doi: 10.1371/journal.pone.0161378.2.4 結(jié)合EFG模型生成可執(zhí)行測試用例算法
3 實驗分析
3.1 實驗環(huán)境
3.2 GUI測試用例評判準(zhǔn)則
3.3 實驗數(shù)據(jù)
4 結(jié)束語