朱方祥 顧乃杰,3
1(中國(guó)科學(xué)技術(shù)大學(xué)計(jì)算機(jī)科學(xué)與技術(shù)學(xué)院 安徽 合肥 230027)2(安徽省計(jì)算與通信軟件重點(diǎn)實(shí)驗(yàn)室 安徽 合肥 230027)3(中國(guó)科學(xué)技術(shù)大學(xué)先進(jìn)技術(shù)研究院 安徽 合肥 230027)
互聯(lián)網(wǎng)發(fā)展至今日,各式各樣的軟件產(chǎn)品已經(jīng)滲透到人們生活的方方面面。用戶和軟件之間的交互主要依賴圖形用戶界面GUI(Graphical User Interface)。用戶通過(guò)軟件GUI觸發(fā)一定的事件,GUI響應(yīng)用戶事件并且把結(jié)果返回給用戶。在現(xiàn)代軟件的開發(fā)過(guò)程中,開發(fā)者會(huì)編寫大量GUI實(shí)現(xiàn)相關(guān)的代碼,其所占的比重大約是整個(gè)軟件代碼量的60%[1-2]。軟件GUI豐富和復(fù)雜的特性給軟件測(cè)試帶來(lái)非常多的不便[3-4]。
GUI測(cè)試可以分為人工測(cè)試和自動(dòng)化測(cè)試,自動(dòng)化測(cè)試相比人工測(cè)試能夠節(jié)省很多的人力成本和時(shí)間成本。學(xué)術(shù)界和工業(yè)界對(duì)GUI自動(dòng)化測(cè)試的研究非常多。其中一部分研究是基于腳本的自動(dòng)化測(cè)試,通過(guò)運(yùn)行腳本自動(dòng)執(zhí)行測(cè)試步驟。測(cè)試腳本生成手段包括人工編寫測(cè)試腳本和錄制測(cè)試腳本[5-6]。這兩種方法的自動(dòng)化程度有限,需要測(cè)試人員具有一定的測(cè)試經(jīng)驗(yàn),而且隨著軟件功能的增加和版本的迭代會(huì)給測(cè)試用例的維護(hù)帶來(lái)不便,并且測(cè)試用例能涵蓋的GUI數(shù)目也有限。另外一部分研究是測(cè)試用例的自動(dòng)生成,這種方法一般通過(guò)算法構(gòu)建軟件的GUI模型,并在模型基礎(chǔ)上自動(dòng)化生成測(cè)試用例。其中經(jīng)典的模型有事件流圖[7-9]EFG(Event Flow Graph)、事件序列圖[10]ESG(Event Sequence Graph)。在此基礎(chǔ)上文獻(xiàn)[11]提出使用有限狀態(tài)機(jī)FSM(Finite State Machine)可以得到更精簡(jiǎn)的模型。在這些GUI模型的研究中,GUI覆蓋率直接影響模型是否完整高效,研究表明純手工測(cè)試遍歷GUI的覆蓋率一般只有30.08%[12]。文獻(xiàn)[13]首次設(shè)計(jì)出一種GUI驅(qū)動(dòng)軟件的自動(dòng)化測(cè)試框架,其系統(tǒng)地提出了GUI模型構(gòu)建的方法??蚣苤蠮FCGUIRipper可以自動(dòng)遍歷基于JFC框架開發(fā)的應(yīng)用,其采用窗口名稱區(qū)分不同的界面,GUI覆蓋率不高。文獻(xiàn)[14]提出一種模擬用戶行為動(dòng)態(tài)探測(cè)Android應(yīng)用程序GUI的方法,其采用圖像對(duì)比區(qū)分不同的應(yīng)用界面,雖然比較簡(jiǎn)單方便,但是不能有效地解決遍歷過(guò)程中的回環(huán)問(wèn)題。而文獻(xiàn)[15]提出通過(guò)結(jié)合靜態(tài)分析遍歷Android應(yīng)用程序GUI的方法可以一定程度提高GUI覆蓋率,但是這種方法僅在Android操作系統(tǒng)上實(shí)現(xiàn)。上述的研究?jī)?nèi)容中,大部分都是針對(duì)移動(dòng)端GUI自動(dòng)化的研究。雖然Windows比移動(dòng)端的操作系統(tǒng)(Andorid、iOS)成熟要早很多,但是在自動(dòng)化測(cè)試領(lǐng)域,其發(fā)展卻不如移動(dòng)端。近年來(lái)鮮有關(guān)于Windows GUI自動(dòng)化測(cè)試的相關(guān)研究。
本文的主要貢獻(xiàn)是提出一種自動(dòng)遍歷Windows應(yīng)用程序GUI的方法,該方法基于GUI事件觸發(fā)和GUI狀態(tài)遷移模型,解決GUI遍歷過(guò)程中的回環(huán)、遍歷不充分、效率低三個(gè)關(guān)鍵問(wèn)題。通過(guò)相關(guān)實(shí)驗(yàn)驗(yàn)證,該方法可以得到較高的GUI覆蓋率,具有一定的實(shí)用性,可以作為其他基于模型自動(dòng)化測(cè)試研究的基礎(chǔ)。
一個(gè)普通的Windows GUI界面是一個(gè)由若干GUI元素組成的樹型視圖。GUI元素包括窗口、按鈕、標(biāo)簽、編輯框等。Windows控件樹是一種系統(tǒng)展示W(wǎng)indows應(yīng)用程序界面信息的分層結(jié)構(gòu),其基本數(shù)據(jù)結(jié)構(gòu)類似于多叉樹。對(duì)于控件樹的定義如下:
1) 樹中的節(jié)點(diǎn)代表單個(gè)GUI元素。
2) 節(jié)點(diǎn)信息包括GUI元素的各種屬性(位置、名稱等)。
3) 除葉子節(jié)點(diǎn)外,每個(gè)節(jié)點(diǎn)可以擁有任意數(shù)量的子節(jié)點(diǎn)。
4) 除根節(jié)點(diǎn)以外,每個(gè)節(jié)點(diǎn)只能擁有一個(gè)父親節(jié)點(diǎn)。
如圖1所示,左側(cè)為普通的Windows窗口,窗口包括一個(gè)普通的標(biāo)題欄、一個(gè)文本框和兩個(gè)按鈕。標(biāo)題欄中包括最小化、最大化、關(guān)閉按鈕。右側(cè)為相應(yīng)的控件樹表示。
圖1 控件樹結(jié)構(gòu)
這種控件樹表現(xiàn)方式的優(yōu)點(diǎn)是可以完整表現(xiàn)一個(gè)應(yīng)用界面的層次和嵌套關(guān)系,并且可以方便地通過(guò)遍歷控件樹找到所需的GUI元素。
一般來(lái)說(shuō),Windows軟件是一個(gè)多窗口應(yīng)用,其界面包含該應(yīng)用程序的多個(gè)窗口?,F(xiàn)對(duì)窗口狀態(tài)定義如下:
定義1窗口狀態(tài)是描述某一時(shí)刻應(yīng)用軟件某一個(gè)窗口內(nèi)部情況的抽象概念,單獨(dú)的一個(gè)窗口狀態(tài)可以由{O,P,V}三元組來(lái)定義。其具體描述如下:
1)O={o1,…,on}代表在GUI狀態(tài)中的所有GUI元素。
2)P={p1,…,pm}代表O中單個(gè)GUI元素的所有屬性。
3)V={(v11,…,v1m),…,(vn1,…,vnm)}代表O中每個(gè)GUI元素的所有屬性的值。
定義2GUI狀態(tài)是描述某一時(shí)刻應(yīng)用程序圖形用戶界面總體情況的抽象概念,單獨(dú)的一個(gè)GUI狀態(tài)可以由{wt,W}二元組來(lái)定義。
1)wt代表該GUI狀態(tài)下最頂層活動(dòng)窗口的窗口狀態(tài)。
2)W代表窗口集合,集合包括該GUI狀態(tài)下除了最頂層窗口的其他所有窗口狀態(tài)。
定義4遷移事件(Transition Event):在某一固定時(shí)刻,造成GUIV狀態(tài)遷移的用戶事件稱之為遷移事件,其包括可達(dá)事件和終止事件。
定義5可達(dá)事件(Reachability Event):在某一固定時(shí)刻,那些用于打開新窗口的事件稱之為可達(dá)事件。
定義6終止事件(Termination Event):在某一固定時(shí)刻,那些用于關(guān)閉當(dāng)前頂層窗口的事件稱之為終止事件。
在沒(méi)有用戶事件響應(yīng)時(shí),應(yīng)用軟件的界面趨于穩(wěn)定狀態(tài),只需要遍歷控件樹結(jié)構(gòu)即可獲得GUI元素,但這些GUI元素并不能覆蓋軟件中所有的GUI元素。一些GUI元素必須響應(yīng)特定的用戶事件才能顯示并出現(xiàn)在控件樹結(jié)構(gòu)中。想要盡可能探測(cè)越多的GUI元素需要不斷地觸發(fā)GUI事件。
在實(shí)際實(shí)現(xiàn)基于GUI觸發(fā)的遍歷過(guò)程中會(huì)遇到若干難點(diǎn)。這里先簡(jiǎn)單描述這些難點(diǎn),并闡明為什么要解決這些難點(diǎn)。
1.3.1 回環(huán)問(wèn)題
如圖2所示,在某一時(shí)刻的遍歷過(guò)程中,窗口A中只有Button,觸發(fā)Button后會(huì)打開新的窗口B,控件樹更新。B中只有取消按鈕,觸發(fā)Cancel后會(huì)關(guān)閉窗口B,控件樹更新。此時(shí)如果遍歷程序無(wú)法判斷窗口A已經(jīng)遍歷過(guò),則會(huì)把窗口A當(dāng)成新窗口繼續(xù)遍歷,遍歷到窗口A的Button然后觸發(fā)點(diǎn)擊事件,最后導(dǎo)致遍歷程序在窗口A和窗口B之間發(fā)生死循環(huán),使得遍歷無(wú)法繼續(xù)進(jìn)行。如何有效地識(shí)別遍歷過(guò)的應(yīng)用程序界面,成為解決回環(huán)問(wèn)題的關(guān)鍵。
圖2 回環(huán)問(wèn)題
1.3.2 遍歷不充分
遍歷算法在遍歷過(guò)程中存在一定概率會(huì)提前觸發(fā)終止事件并關(guān)閉當(dāng)前窗口,使得遍歷算法無(wú)法遍歷該窗口中的剩余元素。由于在遍歷過(guò)程中無(wú)法提前預(yù)知觸發(fā)的用戶事件是否是終止事件,因此需要增加步驟回溯機(jī)制來(lái)解決這種因?yàn)樘崆坝|發(fā)終止事件而造成的遍歷不充分問(wèn)題。另外對(duì)于需要驗(yàn)證步驟的窗口(比如用戶名、密碼登錄),如果沒(méi)有事先在指定控件中輸入正確信息,遍歷程序無(wú)法打開對(duì)應(yīng)的新窗口。這種情況同樣會(huì)導(dǎo)致遍歷不充分,針對(duì)這類問(wèn)題需要在遍歷過(guò)程中加入步驟引導(dǎo)。
1.3.3 遍歷效率低
軟件中存在一些與軟件本身功能無(wú)關(guān)的窗口,比如選擇文件窗口或者打開文件窗口。當(dāng)遍歷到類似于選擇文件的窗口是,文件瀏覽框中觸發(fā)文件選擇事件會(huì)不斷的出現(xiàn)新文件,導(dǎo)致窗口界面一直發(fā)生變化。遍歷程序會(huì)認(rèn)為每次操作打開了新的窗口繼續(xù)遍歷,顯然一直遍歷文件路徑是無(wú)意義的,會(huì)導(dǎo)致遍歷效率低下。
如何精確判斷遍歷過(guò)程中應(yīng)用程序的兩個(gè)界面是否相同是解決回環(huán)問(wèn)題的關(guān)鍵。由定義2可知,GUI狀態(tài)刻畫了某一時(shí)刻應(yīng)用程序圖形用戶界面的總體情況,所以判斷當(dāng)前應(yīng)用程序的界面是否遍歷過(guò)等價(jià)于判斷當(dāng)前應(yīng)用程序的GUI狀態(tài)是否已經(jīng)遍歷過(guò)。
本文提出對(duì)應(yīng)用程序的窗口集合進(jìn)行對(duì)比判斷GUI狀態(tài)是否遷移,具體判斷步驟如下:
1) 判斷兩個(gè)GUI狀態(tài)下窗口集合W的個(gè)數(shù)是否相同。
2) 判斷兩個(gè)GUI狀態(tài)下的頂層活動(dòng)窗口wt內(nèi)部控件樹是否相同。
對(duì)比頂層活動(dòng)窗口的控件樹時(shí),采用樹的度遍歷方法,對(duì)于控件樹的每個(gè)節(jié)點(diǎn)只會(huì)對(duì)比控件的類型是否相同,對(duì)屬性值不作比較。如果窗口狀態(tài)個(gè)數(shù)和頂層窗口的控件樹都相同,則判斷兩個(gè)GUI狀態(tài)相同。這種方法可以更加細(xì)粒度地對(duì)比應(yīng)用程序界面的變化,有效地判斷GUI狀態(tài)是否遷移。
為了解決遍歷過(guò)程中,提前觸發(fā)終止事件而造成遍歷不充分的問(wèn)題,需要增加遍歷的步驟可回溯的功能。
算法1描述了具體的基于GUI狀態(tài)變遷的步驟回溯算法。算法的輸入是某一時(shí)刻的GUI狀態(tài),輸出正確回退的GUI狀態(tài)。這里GUI狀態(tài)除了頂層窗口狀態(tài)wt和其他窗口狀態(tài)集合W之外還有四種屬性:element、isDone、terminate、lastEvent。element代表遍歷程序在該GUI狀態(tài)下已經(jīng)遍歷到的控件節(jié)點(diǎn),isDone代表當(dāng)前GUI狀態(tài)下是否已經(jīng)完成遍歷過(guò)程,terminate代表終止事件,lastEvent代表發(fā)生狀態(tài)遷移前所觸發(fā)的事件。GUI緩存(GUICache)類似于一個(gè)數(shù)組結(jié)構(gòu),緩存遍歷過(guò)程中發(fā)生變遷的GUIState。事件列表(EventList)也是一個(gè)數(shù)組,其保存遍歷過(guò)程的執(zhí)行路徑。EventList[i]是 GUICache[i-1]到GUICache[i]狀態(tài)變遷所發(fā)生的事件。
算法2描述了核心的遍歷算法,其輸入是啟動(dòng)的被測(cè)應(yīng)用。整個(gè)遍歷算法覆蓋遍歷過(guò)程的GUI狀態(tài)表示、遍歷方式、步驟回溯等關(guān)鍵問(wèn)題。其中使用深度優(yōu)先遍歷控件樹的主要原因是Windows應(yīng)用窗口模態(tài)(modal)和非模態(tài)(modelless)的特性。模態(tài)窗口指的是當(dāng)打開該窗口的時(shí)候用戶的交互只能聚焦在此窗口內(nèi),而非模態(tài)則沒(méi)有這樣的限制。然而Windows大部分的窗口都是模態(tài)窗口,所以在遍歷到新的模態(tài)窗口的時(shí)候無(wú)法對(duì)窗口外的控件觸發(fā)事件,只能觸發(fā)窗口內(nèi)部控件的事件。這從根本上否決類似于廣度優(yōu)先的其他遍歷策略,并且采用深度優(yōu)先的方式更符合用戶操作軟件的習(xí)慣,能夠有效地提升GUI探測(cè)的深度和廣度。
影響遍歷效率的一個(gè)重要因素是一直遍歷被測(cè)軟件主要功能無(wú)關(guān)的窗口界面。所以需要事先對(duì)一些無(wú)需遍歷的窗口界面進(jìn)行過(guò)濾。如果采用對(duì)窗口及窗口內(nèi)部元素一一對(duì)比的方式會(huì)非常麻煩。針對(duì)此問(wèn)題,考慮使用Windows中的樣式值作為過(guò)濾窗口頁(yè)面的標(biāo)準(zhǔn)。Windows中窗口或者控件的樣式值包含了繪制風(fēng)格等信息。比如是否可見、是否有水平滾動(dòng)條,是否有最小化按鈕等信息。通常來(lái)說(shuō),軟件中同樣功能類型的窗口繪制風(fēng)格相同,樣式值也相同。
在遍歷程序開始之前,將需要過(guò)濾的樣式值寫入配置文件的樣式黑名單中。在遍歷算法遍歷元素的每一步都與黑名單中的樣式值進(jìn)行對(duì)比,如果樣式值存在,則不再遍歷該元素及以該元素為根節(jié)點(diǎn)的子樹中的元素。窗口或者控件的樣式值可以事先通過(guò)微軟提供的spy++工具[16]獲得。通過(guò)這樣簡(jiǎn)單的方式可以有效地防止遍歷程序局限在某一不重要的軟件界面處,從而提升遍歷效率。
遍歷工具總體方法的架構(gòu)圖如圖3所示。主要分為四個(gè)模塊:UI提取模塊、遍歷模塊、UI驅(qū)動(dòng)模塊、緩存模塊。
緩存模塊主要存放一些模塊之間公用的數(shù)據(jù),包括GUI狀態(tài)的緩存、任務(wù)緩存、配置信息等,使用XML文件作為緩存的載體。
UI提取模塊獲取應(yīng)用程序當(dāng)前GUI狀態(tài)下的所有窗口集合以及頂層活動(dòng)窗口的控件樹結(jié)構(gòu)信息,并把這些信息傳遞給遍歷引擎。
遍歷模塊實(shí)現(xiàn)具體的遍歷算法,判斷GUI狀態(tài)是否變遷,更新緩存模塊中的緩存信息,并且在窗口控件樹的基礎(chǔ)上深度遍歷GUI元素。在遍歷到某一GUI元素需要觸發(fā)事件時(shí),則把元素的控件路徑和所需要觸發(fā)的事件信息交給UI驅(qū)動(dòng)模塊。
UI驅(qū)動(dòng)模塊主要用來(lái)對(duì)應(yīng)用程序控件觸發(fā)事件,從而模擬用戶動(dòng)作。通過(guò)簡(jiǎn)單調(diào)用驅(qū)動(dòng)API便可以在應(yīng)用程序上模擬用戶動(dòng)作。比如點(diǎn)擊按鈕、輸入文本等操作。
根據(jù)上述架構(gòu),實(shí)現(xiàn)Windows UI自動(dòng)化遍歷的原型工具。該工具使用Python語(yǔ)言實(shí)現(xiàn),運(yùn)行在Windows 系統(tǒng)的PC平臺(tái)上。UI提取模塊和UI驅(qū)動(dòng)模塊主要基于Pywinauto開源工具[17]實(shí)現(xiàn)。Pywinauto是一套用于Windows GUI自動(dòng)化的python庫(kù),其對(duì)Windows應(yīng)用程序自動(dòng)化測(cè)試相關(guān)的API進(jìn)行了封裝,可以支持WinForm、WPF、Qt、MFC等不同框架的Windows應(yīng)用程序。對(duì)Pywinauto的相關(guān)實(shí)現(xiàn)進(jìn)行修改和補(bǔ)充,實(shí)現(xiàn)控件樹從內(nèi)存到XML文件的轉(zhuǎn)換,使用XML的層級(jí)結(jié)構(gòu)正好可以映射控件樹結(jié)構(gòu)??丶渚彺嬉訶ML文件的形式存儲(chǔ),不需要保留在內(nèi)存中。在UI驅(qū)動(dòng)模塊,調(diào)用Pywinauto中封裝好的API可以方便地發(fā)送指定事件給應(yīng)用程序的GUI并執(zhí)行相關(guān)動(dòng)作。
遍歷時(shí)探測(cè)的GUI元素越多代表了越好的遍歷效果,可以使用GUI覆蓋率作為評(píng)估標(biāo)準(zhǔn)。
(1)
GUI覆蓋率一般形式如式(1),其中GC代表GUI覆蓋率,GT代表應(yīng)用程序包含的GUI狀態(tài)總數(shù),GE代表遍歷執(zhí)行過(guò)程中探測(cè)到的GUI狀態(tài)總數(shù),比值越高代表遍歷效果越好。但是在實(shí)際實(shí)驗(yàn)過(guò)程中,無(wú)法直接準(zhǔn)確獲得應(yīng)用程序的GUI狀態(tài)數(shù)目,如果使用人工統(tǒng)計(jì)的方式統(tǒng)計(jì)GUI狀態(tài)數(shù)目效率會(huì)很低并且存在誤差。為了盡可能得到準(zhǔn)確的GUI覆蓋率,采用基于簡(jiǎn)單抽樣的方式來(lái)近似估計(jì)GUI覆蓋率。
(2)
GUI平均近似覆蓋率計(jì)算公式如式(2)所示。首先對(duì)整個(gè)被測(cè)軟件的GUI元素進(jìn)行多次簡(jiǎn)單抽樣,每次抽樣保證GUI元素分布均勻,不會(huì)出現(xiàn)多個(gè)GUI元素在單一窗口內(nèi)部。AAC代表平均近似覆蓋率,ni代表被測(cè)應(yīng)用中第i次人工隨機(jī)抽樣選取的GUI元素的個(gè)數(shù),并將其作為第i次抽樣的樣本。在遍歷程序的過(guò)程中,每遍歷到一個(gè)GUI元素都與樣本中的元素進(jìn)行對(duì)比,如果相同則記錄。pi是遍歷過(guò)程中出現(xiàn)在第i次抽樣樣本中GUI元素的個(gè)數(shù),pi和ni的比值代表第i次抽樣的近似覆蓋率??偣膊蓸觡次取平均值,得到平均近似覆蓋率。使用GUI平均近似覆蓋率代替GUI覆蓋率進(jìn)行定量的實(shí)驗(yàn)評(píng)估更加方便高效。
實(shí)驗(yàn)工具運(yùn)行在Windows 10、內(nèi)存為8 GB的PC機(jī)上。被測(cè)應(yīng)用包括TapTap、Notepad、MSPaint、TeamViewer和KeePass五款Windows應(yīng)用程序。其中TapTap是我們自主研發(fā)的Windows應(yīng)用程序,其內(nèi)部總共包含132個(gè)窗口頁(yè)面,在功能上實(shí)現(xiàn)了窗口之間的相互切換。
遍歷程序運(yùn)行過(guò)程針對(duì)文件選擇、文件保存等軟件功能無(wú)關(guān)的窗口進(jìn)行個(gè)性化過(guò)濾。用戶可以觸發(fā)的事件包括左擊、雙擊、拖動(dòng)等簡(jiǎn)單事件。對(duì)于每個(gè)被測(cè)軟件進(jìn)行三次人工抽樣最后得到平均近似覆蓋率,結(jié)果如表1所示。
表1 實(shí)驗(yàn)結(jié)果
為了進(jìn)一步體現(xiàn)本文方法的優(yōu)越性,以上述提及的4個(gè)被測(cè)應(yīng)用作為測(cè)試數(shù)據(jù),將其與文獻(xiàn)[13-14]中的方法在平均近似覆蓋率進(jìn)行了性能比較。文獻(xiàn)[13]基于窗口標(biāo)題對(duì)比判斷應(yīng)用程序界面是否改變,文獻(xiàn)[14]基于軟件圖像對(duì)比判斷應(yīng)用程序界面是否改變。對(duì)三種方法進(jìn)行測(cè)試,得到平均近似覆蓋率進(jìn)行對(duì)比。結(jié)果如表2所示。
表2 不同方法的平均近似覆蓋率比較 %
TapTap軟件設(shè)計(jì)內(nèi)容簡(jiǎn)單、功能單一,其設(shè)計(jì)目的是對(duì)遍歷程序的正確性進(jìn)行測(cè)試。從表1可以看出,由于設(shè)計(jì)之初規(guī)避了回環(huán)問(wèn)題和遍歷不充分問(wèn)題,所以測(cè)試TapTap軟件的近似覆蓋率可以達(dá)到100%。對(duì)其他的Windows程序進(jìn)行測(cè)試,其平均近似覆蓋率在57.8%~74.3%之間。從表2以看出,相對(duì)于窗口標(biāo)題對(duì)比和基于軟件圖像對(duì)比判斷GUI狀態(tài)遷移的方法,本文提出的基于窗口集合對(duì)比判斷界面是否變化的方法對(duì)于GUI覆蓋率有平均21.8%的提升。仔細(xì)分析其原因可知,這主要是因?yàn)楸疚姆椒軌蚋蛹?xì)粒度地對(duì)比應(yīng)用程序界面的變化,有效地判斷GUI狀態(tài)是否遷移因此取得了更好的結(jié)果。
另外分析遍歷過(guò)程,普通Windows應(yīng)用軟件程序無(wú)法達(dá)到覆蓋率100%主要因素有兩個(gè)方面:第一,遍歷程序?qū)?fù)雜事件的支持不足,比如沒(méi)有處理鼠標(biāo)右鍵、滾輪鍵點(diǎn)擊事件。第二,應(yīng)用軟件中有的窗口必須連續(xù)觸發(fā)順序事件才能打開,自動(dòng)遍歷算法沒(méi)有考慮觸發(fā)事件的順序。
本文提出一種自動(dòng)遍歷Windows軟件GUI的方法。該方法基于GUI狀態(tài)變遷構(gòu)建完整的GUI遍歷算法,并且解決了遍歷過(guò)程中的回環(huán)、遍歷不充分、遍歷效率低三個(gè)關(guān)鍵問(wèn)題。實(shí)現(xiàn)相關(guān)工具,通過(guò)實(shí)驗(yàn)分析該方法在自主研發(fā)的應(yīng)用軟件中覆蓋率為100%,保證方法的正確性。對(duì)于普通的Windows應(yīng)用程序,該方法的GUI平均近似覆蓋率在57.8%~74.3%之間。
下一步工作方向:繼續(xù)優(yōu)化本文的遍歷工作,添加對(duì)更復(fù)雜事件的處理,并且支持驗(yàn)證步驟等功能?;赪indows的GUI遍歷可以適合多種測(cè)試場(chǎng)景。比如可以結(jié)合性能監(jiān)控,在無(wú)任何測(cè)試用例前提下,自動(dòng)檢測(cè)出被測(cè)應(yīng)用的性能瓶頸;也可以基于遍歷過(guò)程中GUI狀態(tài)變遷和事件的關(guān)系,構(gòu)造模型并自動(dòng)組織測(cè)試用例。