唐文博,熊彩鈴,王慧亞
(四川大學(xué)計(jì)算機(jī)學(xué)院,成都610065)
在過去的幾年中,我們目睹了移動(dòng)應(yīng)用程序業(yè)務(wù)的驚人增長(zhǎng)。根據(jù)最近的報(bào)道,目前最流行的Android 平臺(tái)應(yīng)用市場(chǎng)Google Play 提供了超過一百萬個(gè)應(yīng)用[1]。和傳統(tǒng)的軟件一樣,在應(yīng)用程序發(fā)布之前需要對(duì)其進(jìn)行充分測(cè)試,以確保其行為正確。隨著智能手機(jī)的快速發(fā)展以及日益激烈的市場(chǎng)競(jìng)爭(zhēng),廠商需要頻繁地更新應(yīng)用程序以吸引用戶,因而快速迭代周期導(dǎo)致測(cè)試所需的資源如時(shí)間、人力等受到很大的限制,使得傳統(tǒng)的手工測(cè)試方法難以實(shí)現(xiàn)有效的測(cè)試,因此自動(dòng)化測(cè)試的重要性越來越高。
GUI 具有良好的交互性,相對(duì)于傳統(tǒng)的DOS 界面,GUI 更加友好和直觀,用戶能夠更加輕松地使用Android 程序。目前幾乎所有的Android 應(yīng)用程序都有GUI,GUI 在整個(gè)應(yīng)用程序中的代碼量占比也達(dá)到了60%[2]。GUI 在應(yīng)用程序中占有非常重要的地位,因此目前GUI 測(cè)試已經(jīng)成為了Android 自動(dòng)化測(cè)試中最常用的方法[3]。
在GUI 自動(dòng)化測(cè)試過程中,測(cè)試輸入自動(dòng)生成是資源消耗最大,也是最關(guān)鍵的步驟。測(cè)試輸入的質(zhì)量與測(cè)試覆蓋率有直接關(guān)系,也能夠極大地影響自動(dòng)化測(cè)試的有效性。因此大量學(xué)者針對(duì)測(cè)試輸入自動(dòng)生成進(jìn)行了研究。本文對(duì)當(dāng)前Android 測(cè)試輸入自動(dòng)生成相關(guān)研究進(jìn)行綜述,分析了相關(guān)研究的優(yōu)缺點(diǎn)并指出了當(dāng)前研究面臨的挑戰(zhàn)。
Android 應(yīng)用測(cè)試輸入可分為事件輸入(將用戶的手勢(shì)動(dòng)作發(fā)送到GUI 上以觸發(fā)事件)與數(shù)據(jù)輸入(應(yīng)用數(shù)據(jù)輸入與環(huán)境輸入)[4],由于本文主要討論Android 平臺(tái)上的GUI 測(cè)試輸入,因此我們這里只考慮事件輸入,我們將測(cè)試輸入的生成過程定義如下:
(1)初始化一個(gè)運(yùn)行環(huán)境e,將被測(cè)應(yīng)用P 在其上運(yùn)行以到達(dá)一個(gè)初始狀態(tài)s0∈S0。
(2)循環(huán)地觀測(cè)應(yīng)用系統(tǒng)的狀態(tài)直到滿足某個(gè)終止條件,并利用觀測(cè)到的狀態(tài)構(gòu)建GUI 模型,GUI 模型能夠反映應(yīng)用程序上事件的轉(zhuǎn)換過程。
(3)根據(jù)GUI 模型,采取一定的策略生成測(cè)試輸入,將其發(fā)送到應(yīng)用系統(tǒng)上以探索應(yīng)用系統(tǒng)的狀態(tài)空間S。
為了保證測(cè)試質(zhì)量,應(yīng)用系統(tǒng)的狀態(tài)空間S 必須被有效地探索,也就是我們構(gòu)建的GUI 模型需要盡量完整。同時(shí)為了減少測(cè)試過程中時(shí)間的開銷,需要保證生成的測(cè)試輸入盡量不包含冗余路徑。大量的學(xué)者針對(duì)上述問題進(jìn)行了研究。
當(dāng)前針對(duì)GUI 測(cè)試輸入生成的研究,主要可以分為三種,分別是隨機(jī)策略、基于模型的策略以及基于目標(biāo)的策略,由于基于模型的策略能夠有效地避免生成冗余測(cè)試,同時(shí)幫助開發(fā)者快速定位出故障的地點(diǎn),因此基于模型的策略成為了當(dāng)前GUI 測(cè)試的常用方法,本節(jié)將著重介紹基于模型的策略。
隨機(jī)策略指隨機(jī)生成測(cè)試輸入并輸入到GUI 上,最典型的工具便是Google 官方提出的Monkey[5]工具,該工具能夠隨機(jī)生成類似用戶的測(cè)試輸入并輸入到手機(jī)界面上,然后模擬用戶的點(diǎn)擊等手勢(shì),以及一些系統(tǒng)級(jí)的事件。MonkeyRunner 同樣是Android SDK 自帶的測(cè)試工具,它可以用于做功能測(cè)試,回歸測(cè)試并且可以自己定義測(cè)試擴(kuò)展,靈活性較大。Dynodroid[6]對(duì)Monkey 進(jìn)行了改進(jìn),它能夠從隨機(jī)生成的測(cè)試輸入中刪除掉冗余測(cè)試,從而提高了測(cè)試效率。
基于模型的策略指通過構(gòu)建GUI 模型生成測(cè)試輸入。Choi.w[7]等人提出了SwiftHand 算法,該算法能夠自動(dòng)生成GUI 的測(cè)試輸入序列。該算法使用機(jī)器學(xué)習(xí)來在測(cè)試期間學(xué)習(xí)應(yīng)用程序的模型,使用學(xué)習(xí)后的模型來生成訪問應(yīng)用程序未探索狀態(tài)的用戶輸入,并在生成的輸入上使用應(yīng)用程序的執(zhí)行來完善模型。該算法的一個(gè)關(guān)鍵特征是它避免了重新啟動(dòng)應(yīng)用程序,因而提高了效率。此外,Choi.w 通過使用一種名為DetReduce 的啟發(fā)式技術(shù),在給定通過運(yùn)行自動(dòng)GUI測(cè)試工具生成的大型測(cè)試輸入的情況下,為GUI 應(yīng)用程序創(chuàng)建小型回歸測(cè)試輸入。DetReduce 通過識(shí)別和消除現(xiàn)有的自動(dòng)GUI 測(cè)試工具引入的某些常見形式的冗余,極大地減少了最小化GUI 測(cè)試輸入所需的時(shí)間。
D.Amalfitano[8]開發(fā)了一款名為AndroidRipper 測(cè)試工具,該工具將基于模型的技術(shù)用于Android 應(yīng)用程序并執(zhí)行自動(dòng)化測(cè)試,該研究成為了之后大量研究的基礎(chǔ)。R.Mahmood[9]等人開發(fā)了一個(gè)測(cè)試框架,通過構(gòu)建GUI 模型生成有效的測(cè)試輸入。Cao Y 等人[10]提出了一種針對(duì)Android 應(yīng)用的基于模型的GUI 測(cè)試技術(shù)。該方法將等效小部件分組到一種狀態(tài)中,并設(shè)計(jì)了一種新的基于反饋的探索策略,該策略根據(jù)已觸發(fā)的搜索項(xiàng)的執(zhí)行結(jié)果動(dòng)態(tài)調(diào)整操作的優(yōu)先級(jí),并傾向于選擇可以到達(dá)應(yīng)用的新狀態(tài)的操作,避免了局部和重復(fù)的探索。為了捕獲應(yīng)用程序運(yùn)行過程中的信息以構(gòu)建GUI 模型,Jamrozik K 等人[11]開發(fā)了Droidmate,Droidmate 能夠探索應(yīng)用程序,在運(yùn)行時(shí)反復(fù)讀取設(shè)備GUI并監(jiān)視對(duì)Android API 方法的調(diào)用,并且根據(jù)該數(shù)據(jù)決定要執(zhí)行的下一個(gè)GUI 操作(單擊、長(zhǎng)按、文本輸入等),并提供了探索策略。該過程一直持續(xù)到滿足某些終止標(biāo)準(zhǔn)為止。
W.Yang 等人[12]通過混合分析的方法提高了GUI模型生成的準(zhǔn)確性,混合分析指將動(dòng)態(tài)分析和靜態(tài)分析結(jié)合起來對(duì)應(yīng)用程序進(jìn)行探索,混合分析既能夠解決靜態(tài)分析方法無法獲取應(yīng)用程序動(dòng)態(tài)運(yùn)行時(shí)的狀態(tài)信息的問題,又能彌補(bǔ)動(dòng)態(tài)分析過程中遇到的路徑不可達(dá)的問題[13]。該研究通過對(duì)源代碼執(zhí)行靜態(tài)分析,并將得到的信息用于支持應(yīng)用程序的動(dòng)態(tài)探索和GUI 模型生成過程,提高了GUI 模型準(zhǔn)確性。
盡管混合方法能夠提高模型的準(zhǔn)確性,但由于大多數(shù)現(xiàn)有的方法都是通過逆向工程創(chuàng)建應(yīng)用程序的模型。而由于逆向工程方法的不完備性,應(yīng)用模型不能廣泛地捕捉應(yīng)用的動(dòng)態(tài)行為,因此混合分析方法往往缺乏全面性。為了解決這個(gè)問題,D.Amalfitano 等人[14]開發(fā)了Mobile GUITAR 工具,該工具提出了一個(gè)高效的應(yīng)用程序控件探索算法,在避免了靜態(tài)分析帶來的復(fù)雜性的同時(shí),提高了遍歷的效率,保證了生成的GUI模型的完整性,為高效的基于模型的Android GUI 測(cè)試鋪平了道路。
由于某些應(yīng)用程序行為只能在提供特定輸入后才能顯示。因此測(cè)試工具需要使用更復(fù)雜的技術(shù)(例如符號(hào)執(zhí)行和進(jìn)化算法)來指導(dǎo)探索以前未發(fā)現(xiàn)的代碼[15],這就是基于目標(biāo)的方法,該方法往往是針對(duì)某個(gè)特定行為進(jìn)行檢測(cè),典型的應(yīng)用場(chǎng)景是對(duì)應(yīng)用程序進(jìn)行惡意檢測(cè)[16],例如N.Mirzaei 等人使用符號(hào)執(zhí)行方法[17]進(jìn)行測(cè)試,試圖檢測(cè)出更深層次的故障。
盡管基于目標(biāo)的策略提高了故障/錯(cuò)誤檢測(cè)能力并揭示了其他工具無法發(fā)現(xiàn)的錯(cuò)誤,但是這些方法需要相對(duì)復(fù)雜的數(shù)據(jù)或分析技術(shù),例如使用完整源代碼的靜態(tài)分析,因此需要消耗大量的資源[18],同時(shí)該方法的拓展性較差,難以應(yīng)對(duì)頻繁的需求變更。
通過對(duì)當(dāng)前GUI 測(cè)試輸入自動(dòng)生成的相關(guān)研究,我們可以發(fā)現(xiàn)仍然存在以下幾點(diǎn)問題值得深入研究和改進(jìn):
(1)由于應(yīng)用程序的GUI 存在大量的UI 元素,而不同的UI 元素與用戶的交互方式不一定相同,UI 元素與其可能支持的交互行為的排列組合數(shù)目是非常巨大的,因此我們可以認(rèn)為GUI 狀態(tài)空間S 是無窮的。因此在構(gòu)建GUI 模型的過程中會(huì)不可避免的遇到了軟件界通用技術(shù)瓶頸——狀態(tài)爆炸問題,這使得測(cè)試輸入生成技術(shù)無法在有限的測(cè)試資源下遍歷整個(gè)狀態(tài)空間,只能探索一部分狀態(tài)。由于不同的測(cè)試過程目的不同,其對(duì)于不同的狀態(tài)有著不同的重要性評(píng)估。如何生成測(cè)試輸入以優(yōu)先探索到所服務(wù)的測(cè)試過程認(rèn)為更重要的狀態(tài),以更好地服務(wù)測(cè)試過程,是測(cè)試輸入生成技術(shù)的一大挑戰(zhàn)。
(2)由于狀態(tài)空間以及狀態(tài)轉(zhuǎn)移方式的未知性以及狀態(tài)空間的無窮性,很難在有限的測(cè)試資源內(nèi)精準(zhǔn)地構(gòu)建GUI 模型。測(cè)試輸入生成技術(shù)無法準(zhǔn)確地獲知生成什么測(cè)試輸入可以進(jìn)一步探索狀態(tài)空間未被探索的部分。有一些測(cè)試輸入不會(huì)導(dǎo)致應(yīng)用系統(tǒng)狀態(tài)的轉(zhuǎn)移,如應(yīng)用當(dāng)前不可處理的輸入。而有一些測(cè)試輸入只會(huì)探索已經(jīng)探索到的狀態(tài)。由于無法準(zhǔn)確識(shí)別這些輸入,狀態(tài)空間探索容易困于局部,影響生成的測(cè)試輸入的有效性。同時(shí),狀態(tài)空間中存在一些深層狀態(tài),需要特定的測(cè)試輸入序列才能夠探索到。一些狀態(tài)需要特定的數(shù)據(jù)輸入(如登錄賬號(hào)密碼等)才能夠探索到,而另一些狀態(tài)需要一個(gè)特定的長(zhǎng)測(cè)試輸入序列(如多次交替發(fā)送兩個(gè)點(diǎn)擊輸入)才能夠探索到。由于狀態(tài)空間的未知性,測(cè)試輸入生成技術(shù)無法準(zhǔn)確得知所需的測(cè)試輸入,從而很難探索到這些狀態(tài)。因此如何構(gòu)建完成的GUI 模型,是測(cè)試輸入生成技術(shù)的另一大挑戰(zhàn)。