向日鋒,毛宇光
(南京航空航天大學計算機科學與技術學院,江蘇 南京 211106)
隨著信息技術的飛速發(fā)展,計算機軟件深入社會中的航天、零售、醫(yī)療、金融、汽車等各個領域。但是,在軟件的設計、開發(fā)等階段都可能引入錯誤從而導致軟件功能部分或者整體失效,甚至引發(fā)嚴重的生產安全問題,這使得軟件質量也不得不受到人們的關注。
軟件測試是保證軟件可靠性的重要手段,能夠有效地保證產品的質量。GUI測試是一個新的測試研究領域,隨著GUI應用的快速發(fā)展,GUI測試的研究卻相對滯后,這對整個軟件開發(fā)和測試過程都有著不可估量的影響。測試用例生成問題是GUI測試的核心所在,同時,因為GUI的圖形界面特點和巨大的狀態(tài)空間,使得測試評判的生成也存在諸多難點,所以研究針對GUI測試特有的測試用例生成和測試評判生成方法有極其重要的意義。
在生成GUI測試用例的過程中,有一個很重要的環(huán)節(jié),就是對GUI軟件進行行為建模。事件流圖(Event Flow Graph, EFG)是一種常見的基于行為模型的GUI測試方法。EFG模型中節(jié)點表示事件,有向邊表示事件之間的發(fā)生先后關系,根據相鄰節(jié)點的序列長度制定測試覆蓋準則,結合EFG模型生成測試用例。該模型最早是由Memon[1]在對GUI測試的覆蓋率研究時提出的,建立該模型的目的是為了更好地描述GUI中對象的事件和事件之間的交互關系。但是EFG模型只關注事件以及事件之間的交互,沒有關注事件所對應的事件處理函數的代碼結構以及事件處理函數之間的代碼依賴關系,導致生成的測試用例代碼覆蓋率不高,同時還會生成很多的無效測試用例。對于事件體積量不斷增大的GUI軟件,生成的測試用例數量呈指數級增長,大大制約了GUI軟件的測試效率[2]。
在EFG模型的基礎上,陳軍成[3-4]等人提出了基于事件處理函數模型(Event-Hander Function Graph, EHG)的GUI測試方法。EHG中節(jié)點表示事件處理函數,有向邊表示事件處理函數被觸發(fā)的先后關系。根據事件處理函數的代碼結構以及事件處理函數之間的代碼依賴關系制定測試覆蓋準則[5],結合EHG模型生成測試用例。EHG和EFG相比較,主要作了2方面的改進,一方面清晰地表述了代碼交互事件和默認事件的關系,不會生成沒有事件組合意義的無效測試用例,另一方面EHG模型要比EFG模型小,在控件越多的GUI軟件上尤為明顯。
一些事件對應的事件處理函數包含了較多的變量,或者事件處理函數之間的定義-引用對較多,包含越多這樣的事件的測試用例就越容易發(fā)現軟件的缺陷?;贓HG模型的測試方法未考慮到事件的權重值以及事件之間的依賴關系,這會導致在測試用例集數量較為龐大的條件下GUI軟件缺陷檢測的效率降低。本文提出一種基于帶權重的事件處理函數模型(Event-Hander Graph based on Weight, WEHG)的GUI測試方法。WEHG和EHG相比較,主要作了2方面的改進,一方面根據事件處理函數中定義變量和引用變量的數量和給對應的節(jié)點設置權重值,從而保證擁有更多變量的節(jié)點能夠優(yōu)先生成測試用例,另一方面根據事件處理函數的定義-引用對給節(jié)點之間的依賴關系設置依賴值,使依賴度高的節(jié)點能夠優(yōu)先加入測試序列中。通過該方法生成具有優(yōu)先級排序的測試用例集,在版本更新較快或者窗體界面較多的GUI軟件中能夠生成針對性更強的測試用例集,并且優(yōu)先執(zhí)行能更快發(fā)現軟件缺陷的測試用例,提高軟件測試的效率。
下面給出一些關于行為模型的定義,以便理解本文提出的基于WEHG模型的GUI軟件測試用例生成方法。
定義1GUI狀態(tài)。假設應用程序包括n個GUI窗體類w1,w2,…,wn和m個非窗體類靜態(tài)數據成員sd1,sd2,…,sdm,窗體類wi的k個數據成員DMwi={mvi1,mvi2,…,mvik} (0
定義2GUI事件。GUI事件是一個三元組:operator(evtName,precondition,effect),其中,evtName表示GUI事件的名稱及參數,precondition表示GUI事件發(fā)生的前提條件,effect表示GUI事件發(fā)生后的GUI狀態(tài)[6]。
定義3GUI變量。GUI變量包括GUI狀態(tài)變量、GUI控件變量、內部變量。其中窗體類數據成員和非窗體類靜態(tài)數據成員稱為GUI狀態(tài)變量。GUI窗體類中,聲明的GUI控件數據成員稱為GUI控件變量,其他非GUI控件變量的GUI狀態(tài)變量稱為GUI內部變量[3]。
定義4GUI事件處理函數。事件處理函數為一個三元組,其形式為ehf(se,source,ue)。其中,se表示觸發(fā)事件處理函數ehf執(zhí)行的代碼交互事件集合。source表示ehf所對應的事件處理函數的函數體,利用此信息可以分析事件處理函數的控制流圖、數據流圖等信息。ue表示ehf執(zhí)行時,接收的默認事件集合[7]。
定義5GUI事件依賴。GUI事件依賴[5]是一個三元組:dependent(u,e0,e1),其中,e0和e1表示待測軟件中的2個GUI事件,u表示e0和e1之間的依賴度,由e0和e1對應事件處理函數中的GUI變量決定。
定義6事件處理函數的定義-引用對。若事件處理函數ehf1和事件處理函數ehf2出現在同一個測試用例t中,存在一個GUI變量v在事件處理函數ehf1某條語句中被定義,在另一個事件處理函數ehf2某條語句中被使用到,那么稱(ehf1,ehf2,v)是測試用例t中關于變量v的事件處理函數的定義-引用對。
建立事件流圖EFG模型的目的是通過模擬窗體內的事件和事件之間的交互關系來生成滿足測試需求的測試用例集[2,8]。由一個三元組M=(E,R,I)組成,EFG中節(jié)點的集合E表示GUI中的事件,邊的集合R,即有序對(ex,ey)的集合,其中ex∈E, ey∈E,且(ex,ey)∈R,表示事件執(zhí)行的先后關系。I?R表示初始狀態(tài)下的事件集合,即剛啟動軟件用戶可以執(zhí)行的事件集合。
事件處理函數圖EHG模型由一個二元組EHG(V,E)組成,V表示事件處理函數集合,E表示V中元素對的有窮集合,即有序對(nx,ny)的集合,其中nx∈V, ny∈V,且(nx,ny)∈E,則事件處理函數nx執(zhí)行之后,可以執(zhí)行事件處理函數ny。
帶權重的事件處理函數圖WEHG由一個四元組EHG(V,E,ψ,Ω)組成,V表示事件處理函數集合,E表示V中元素對的有窮集合,即有序對(nx,ny)的集合,其中nx∈V, ny∈V,且(nx,ny)∈E,則事件處理函數nx執(zhí)行之后,可以執(zhí)行事件處理函數ny。ψ表示圖中所有有向邊的依賴度集合,邊(nx,u,ny)∈ψ表示節(jié)點之間的依賴關系。u∈N+表示e和e′之間的依賴度,Ω表示事件處理函數的權重值集合。
為了解決大量的測試用例無法盡快找到軟件缺陷的問題,本文提出一種基于帶權重的事件處理函數模型生成GUI軟件測試用例的方法對GUI軟件建模。其基本流程如下:
1)利用Windows操作系統(tǒng)提供的微軟用戶界面自動化(User Interface Automation, UIA)框架識別待測軟件(Application Under Test, AUT)中的所有控件以及控件的屬性,通過UIA提供的接口驅動AUT執(zhí)行,并生成該AUT的EFG模型。
2)利用Roslyn工具對AUT源代碼進行靜態(tài)分析,獲得所有事件處理函數之間的定義-引用對,根據定義-引用對給所有控件設置權重,在控件之間設置依賴度大小值,生成WEHG模型。
3)利用WEHG模型生成抽象的測試用例集。
4)將抽象的測試用例集每一個測試用例結合EFG模型生成完整的測試用例。
在上述步驟中,WEHG模型中節(jié)點之間的依賴關系和節(jié)點的權重值是指導測試用例生成的重要信息。本文接下來主要介紹構造WEHG模型的算法以及基于WEHG模型的GUI測試用例生成算法。
算法1描述了WEHG模型的構造過程,它的輸入是待測軟件AUT和EHG模型(V,E),輸出是WEHG模型(V′,E′,ψ,Ω),該算法的事件復雜度是O(n2),空間復雜度是O(1)。
算法1構造WEHG模型
輸入:AUT,EHG模型(V,E)
輸出:WEHG模型(V′,E′,ψ,W)
1. E′=E
2. V′=V //將EHG模型中節(jié)點和節(jié)點間的關系傳給WEHG模型
3. W={ }, R={ }, R′={ }
4. for each (e in E) do //給每個節(jié)點設置權重
5. W=getFieldsWritten(e,AUT)
6. R=getFieldsRead(e,AUT)
7. ω=|W∪R|
8. Ω=Ω∪(e,ω)
9. for each (e′ in E) do //給相關聯(lián)節(jié)點設置依賴度
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é)點可產生的測試用例的最大數目top,輸出是抽象測試用例集П。該算法的事件復雜度是O(n3),空間復雜度是O(1)。
算法2生成抽象測試用例
輸入:WEHG模型(V′,E′,ψ,Ω),抽象測試用例最大長度len,每個頭節(jié)點可產生的測試用例的最大數目top
輸出:抽象測試用例集П
1. П={}
/*將所有節(jié)點作為抽象測試用例第一個節(jié)點遍歷生成測試用例*/
2. while Ω≠Φ do
3. e=Max((e,ω),Ω)//優(yōu)先選擇權重大的節(jié)點
4. Ω=Ω-(e,ω)
5. Queue of abstract test cases П′={}
6. ψ′=ψ
7. while |П′| 8. Sequence of events π=e 9. Event e′=e 10. while |π| //查找和當前節(jié)點依賴度最大的節(jié)點加入當前抽象測試用例中 11. do 12. e′=Max((e,u,e′),ψ′) 13. π=π*e′ 14. end while 15. П′=П′∪π 16. end while 17. П=П+П′ 18. end while 19. return П 算法3描述了結合EFG模型和算法2生成的抽象測試用例集生成可執(zhí)行測試用例的過程,它的輸入是EFG模型(E,I,δ)和抽象測試用例集П,輸出是可執(zhí)行測試用例集T,該算法的事件復雜度是O(n2),空間復雜度是O(1)。 算法3生成可執(zhí)行測試用例 輸入:EFG模型(E,I,δ),抽象測試用例集П 輸出:可執(zhí)行測試用例集T 1. Sequences of events T={} /*對于抽象測試用例集П中所有測試用例進行遍歷生成可執(zhí)行的測試用例*/ 2. for each tc in П do 3. for each Sequence ei,…,ejin tc do /*在EFG模型中查找當前測試用例中每一個節(jié)點的可達路徑*/ 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軟件測試用例生成方法的有效性,本文設計并實現了基于UIA框架和Roslyn的GUI測試工具[9],其中Roslyn主要是對窗體上控件的源代碼進行靜態(tài)分析,UIA框架可獲得所有控件的詳細信息,并將控件之間的關系以樹形圖表示,同時可使用UIA框架提供的接口驅動被測軟件的執(zhí)行。 本文實驗選用的待測軟件是很多GUI測試研究都選用的Notepad記事本軟件,該軟件是由C#實現的開放源代碼的程序,雖然控件規(guī)模比較小,但是有很豐富的控件類型,GUI對象之間的關系也比較復雜,具有一定的代表性,適合缺陷注入和測試。為了充分測試該方法的缺陷偵測效率,并且盡量使缺陷的類型多樣化,給該待測軟件注入了10個缺陷[10],如表1所示。 表1 缺陷注入列表 注入位置缺陷描述菜單選項FileFile選項展開后缺少SaveAs選項Save選項快捷鍵未設置Gore>Bush>NaderNader>Gore>Bush菜單選項Edit的子選項Cut選中文字后,剪切操作無效Font設置字體設置無效About窗口中的Label單詞“Programmed”拼寫錯誤About窗口中的OK按鈕OK狀態(tài)變?yōu)镈isable將OK按鈕的功能設置為Cancel按鈕的功能Help菜單選項的Register子選項期望的Register對話框沒有彈出 本實驗全部在Windows 7操作系統(tǒng)上進行,硬件平臺為Intel Core i3-3110 2.4 GHz雙核,4 GB RAM。 本文為了測試用例生成方法的需要和對生成測試用例性能的評判,定義2個GUI測試用例評價準則。 定義7事件處理函數覆蓋準則。程序中的每一個事件處理函數對應的事件至少被執(zhí)行一次,即WEHG模型中每個節(jié)點至少被覆蓋一次。 使用事件處理函數覆蓋率來評判測試用例集的事件處理函數覆蓋情況,計算公式為: 其中,NODE(ST)表示測試用例集ST所覆蓋的WEHG模型中頂點的集合,NG表示事件WEHG模型中所有頂點的集合。 定義8事件處理函數交互覆蓋準則。檢查模型中可能的事件處理函數之間的交互關系,要求當事件處理函數nx執(zhí)行后,可執(zhí)行的事件處理函數ny至少被執(zhí)行一次,即WEHG模型中每條有向邊至少被覆蓋一次。 使用事件處理函數交互覆蓋率來評判測試用例集的事件處理函數的定義-引用對覆蓋情況,計算公式為: 其中,EDGE(ST)表示測試用例集ST所覆蓋的WEHG模型中有向邊的集合,EG表示WEHG模型中所有有向邊的集合。 表2給出了待測軟件Notepad在EFG模型、EHG模型以及WEHG模型中的規(guī)模,此外,通過Roslyn工具靜態(tài)分析得到待測軟件Notepad的事件處理函數定義-引用對個數為55。 表2 Notepad的EFG,EHG和WEHG規(guī)模 模型類型節(jié)點數/個邊數/條EFG34896EHG/WEHG29677 本次實驗基于EFG模型共生成692個測試用例,其中有32個無效測試用例,基于EHG模型和WEHG模型各生成386個測試用例,其中基于WEHG模型生成的測試用例做了優(yōu)先級排序。基于3種模型生成的前50個測試用例中事件處理函數的覆蓋情況如圖1所示,可以看到,在執(zhí)行相同數目的測試用例的時候,基于EFG模型生成的測試用例事件處理函數覆蓋率最低,基于EHG模型生成的測試用例事件處理函數覆蓋率次之,而基于WEHG模型生成的測試用例對事件處理函數的覆蓋效率最高,在執(zhí)行到第43個測試用例時就已經覆蓋了所有的事件處理函數。本次實驗說明了基于WEHG模型生成的測試用例能最快地執(zhí)行所有的事件處理函數,當單個事件處理函數對應的事件本身有缺陷時,使用本文提出的方法能夠盡快地發(fā)現缺陷。 圖1 前50個測試用例事件處理函數覆蓋率的變化圖 圖2反映了執(zhí)行基于3種模型生成的所有測試用例中事件處理函數的定義-引用對的覆蓋情況,從圖中可以看出,在執(zhí)行相同的測試用例數時,基于EFG模型生成的測試用例覆蓋的事件處理函數的定義-引用對數量最小,EHG模型次之,WEHG模型最大。這是由于建立EFG模型時未考慮代碼層中不同事件之間同一變量的相互關系,從而導致生成的測試用例事件處理函數的定義-引用對覆蓋不完全。而EHG模型雖然能夠覆蓋所有的事件處理函數的定義-引用對,但是沒有根據事件處理函數中變量和定義-引用對對模型中節(jié)點和邊設置權重值,導致一些定義-引用對在后部分測試用例中才能執(zhí)行到。WEHG模型就解決了這個問題,提高了定義-引用對的覆蓋效率。 圖2 事件處理函數的定義-引用對覆蓋數量的變化圖 圖3反映了執(zhí)行基于3種模型生成的所有測試用例中發(fā)現缺陷的情況,從圖中可以看出,基于EFG模型生成的測試用例有一個注入的缺陷沒有發(fā)現,基于EHG模型和WEHG模型生成的測試用例發(fā)現了所有注入的缺陷,相比EHG模型,WEHG模型能夠更快地發(fā)現GUI軟件中的缺陷。 圖3 發(fā)現缺陷的數目變化圖 綜上所述,本文提出的基于WEHG模型的GUI軟件測試用例生成方法能夠進一步提高GUI軟件測試的效率,降低GUI測試的開銷。且實驗證明了通過對事件處理函數的事件所對應WEFG模型中節(jié)點設置權重,以及事件處理函數中的定義-引用對所對應節(jié)點之間的邊設置依賴度,一方面能夠更快地覆蓋待測軟件中的事件處理函數和事件處理函數中的定義-引用對,另一方面能更快地發(fā)現軟件中的缺陷。 本文首先對EHG模型進行改進,通過對源代碼的靜態(tài)分析,對模型中的節(jié)點設置了權重,對邊設置了依賴度,接著提出了基于WEHG模型生成抽象測試用例的算法,并結合EFG模型生成可執(zhí)行測試用例。最后通過實驗驗證了本文提出的方法能有效提高覆蓋事件處理函數和事件處理函數中定義-引用對的覆蓋效率。在后續(xù)的研究中,將進一步提出對測試用例預判信息自動化生成的方法,并研究如何在能更多地發(fā)現缺陷的條件下進一步降低測試用例的數量。 參考文獻: [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] 陳軍成,薛云志,趙琛. 一種基于事件處理函數的GUI測試方法[J]. 軟件學報, 2013,24(12):2830-2842. [4] 陳軍成,薛云志,陶秋銘,等. 基于事件處理函數的GUI測試用例集約簡技術[J]. 軟件學報, 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]. 測控技術, 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]. 武漢:華中科技大學, 2007. [11] 郭晶晶. 基于調用堆棧的GUI測試研究[D]. 上海:上海師范大學, 2010. [12] 江琴,劉琳嵐,蘇曦,等. 基于事件權重的GUI測試路徑生成方法[J]. 計算機應用, 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)分析的克隆代碼自動重構方法[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 結合EFG模型生成可執(zhí)行測試用例算法
3 實驗分析
3.1 實驗環(huán)境
3.2 GUI測試用例評判準則
3.3 實驗數據
4 結束語