曹 捷,黃 翰+,雷豐強(qiáng),劉方青
1.華南理工大學(xué) 軟件學(xué)院,廣州 510006
2.微科智檢(佛山市)科技有限公司,廣東 佛山 528000
隨著終端影像技術(shù)和處理器芯片技術(shù)的不斷進(jìn)步,移動(dòng)智能終端正步入高速發(fā)展的時(shí)代。據(jù)中國(guó)信通院[1]發(fā)布的數(shù)據(jù),2022 年中國(guó)智能移動(dòng)終端用戶規(guī)模突破12 億人?;仡欀悄芙K端的歷史,1994 年IBM 發(fā)布的Simon被公認(rèn)為是第一款智能手機(jī),其搭載的ZOLUS 系統(tǒng)只有一個(gè)第三方應(yīng)用程序,雖然現(xiàn)在看來(lái)有些笨重,但它敲開(kāi)了智能終端系統(tǒng)的大門(mén)。2007 年1 月9 日,蘋(píng)果公司發(fā)布了基于Objective-C、C、C++語(yǔ)言編寫(xiě)的閉源類Unix 系統(tǒng)iOS(iPhone OS)系統(tǒng)。同年11月5日,谷歌公司推出了首個(gè)為智能移動(dòng)終端開(kāi)發(fā)的開(kāi)源安卓(Android)操作系統(tǒng)。由于安卓操作系統(tǒng)的開(kāi)源性,自發(fā)布以來(lái)一直占據(jù)了市場(chǎng)的主導(dǎo)地位,目前安卓系統(tǒng)已經(jīng)擁有超過(guò)80%的市場(chǎng)份額和10 億臺(tái)活躍設(shè)備[2]。安卓系統(tǒng)的開(kāi)放源代碼特性也促進(jìn)了安卓系統(tǒng)建立起強(qiáng)大的生態(tài)圈。我國(guó)的一流智能手機(jī)廠商全部采用基于安卓系統(tǒng)開(kāi)發(fā)的自研操作系統(tǒng),如小米的MIUI[3]、魅族的Flyme[4]等。同時(shí),安卓系統(tǒng)不斷引入新功能并進(jìn)行優(yōu)化,例如人工智能和虛擬現(xiàn)實(shí)等技術(shù),從而滿足用戶需求并保持市場(chǎng)競(jìng)爭(zhēng)力。
智能終端系統(tǒng)的安全性和質(zhì)量是至關(guān)重要的,而軟件測(cè)試是確保這一目標(biāo)的關(guān)鍵[5]。在智能終端系統(tǒng)投入使用之前,必須對(duì)可能出現(xiàn)的問(wèn)題進(jìn)行檢測(cè),并通過(guò)相關(guān)技術(shù)手段對(duì)問(wèn)題進(jìn)行排除。通常情況下,軟件測(cè)試占整個(gè)軟件開(kāi)發(fā)工作量的40%~50%[6]。如何高效地進(jìn)行智能終端測(cè)試以保障系統(tǒng)的可靠性和穩(wěn)定性已經(jīng)成為企業(yè)面臨的重要問(wèn)題之一。
如今越來(lái)越多的惡意應(yīng)用程序利用智能終端系統(tǒng)的漏洞來(lái)竊取用戶信息,進(jìn)而獲取用戶的精準(zhǔn)畫(huà)像、突破系統(tǒng)限制并最終促進(jìn)交易轉(zhuǎn)化[7]。近期,反病毒軟件公司卡巴斯基正式開(kāi)展對(duì)某大型購(gòu)物應(yīng)用程序(application,App)的調(diào)查。調(diào)查發(fā)現(xiàn)該App 的安裝程序中含有惡意代碼,可以利用安卓系統(tǒng)漏洞安裝后門(mén)并獲得未經(jīng)授權(quán)的用戶數(shù)據(jù)和通知信息,以達(dá)到獲客、促交易、提高活躍度三個(gè)目的[8]。由于用戶量過(guò)億的大型應(yīng)用都會(huì)利用其智能終端載體的漏洞來(lái)牟利,有必要對(duì)智能終端領(lǐng)域做一次全面的自動(dòng)化測(cè)試技術(shù)總結(jié)分析,供研究人員隨時(shí)參照相關(guān)內(nèi)容,方便開(kāi)展后續(xù)的研究工作。
為了梳理面向智能終端自動(dòng)化測(cè)試技術(shù)發(fā)展現(xiàn)狀,本文首先通過(guò)“Android auto test”“iOS auto test”等關(guān)鍵詞檢索與綜述主題相關(guān)的論文。然后對(duì)相關(guān)論文進(jìn)行了人工篩選,通過(guò)分析論文的題目、關(guān)鍵字和摘要,識(shí)別并移除與綜述主題無(wú)關(guān)的論文。最后根據(jù)確定的文獻(xiàn)中的引文,再次補(bǔ)充相關(guān)的論文。需要注意的是,關(guān)于iOS系統(tǒng)的自動(dòng)化測(cè)試相關(guān)技術(shù)論文占比低,大多數(shù)有關(guān)文獻(xiàn)都是以跨平臺(tái)測(cè)試框架出現(xiàn)[9-11]。
綜合研究iOS 相關(guān)文獻(xiàn)后發(fā)現(xiàn),iOS 系統(tǒng)的閉源特性導(dǎo)致相關(guān)技術(shù)和工具覆蓋面相對(duì)較少,但也因其閉源而在安全性上普遍優(yōu)于安卓系統(tǒng)[12]。蘋(píng)果官方市場(chǎng)AppStore 是iOS 開(kāi)發(fā)者發(fā)布應(yīng)用程序的唯一途徑[13]。在提交應(yīng)用程序之前,開(kāi)發(fā)者需要向蘋(píng)果注冊(cè)并進(jìn)行隱私和安全違規(guī)測(cè)試。這個(gè)長(zhǎng)達(dá)兩周的審查過(guò)程可以有效防止黑客編寫(xiě)惡意應(yīng)用程序并在商店出售。開(kāi)發(fā)者需要提供身份信息以完成注冊(cè),并將其嵌入到應(yīng)用程序中。這種數(shù)字簽名流程旨在確保應(yīng)用程序開(kāi)發(fā)者和應(yīng)用程序的身份都不會(huì)被修改或篡改。通過(guò)認(rèn)證流程,iOS 鼓勵(lì)軟件開(kāi)發(fā)人員制作高質(zhì)量的應(yīng)用程序。一旦應(yīng)用程序提交并通過(guò)蘋(píng)果公司認(rèn)證,任何修改該應(yīng)用程序的嘗試都會(huì)打破數(shù)字簽名封條。最后,只有符合許可協(xié)議的應(yīng)用程序才能被接受并在AppStore中發(fā)布。因此,在iOS應(yīng)用程序開(kāi)發(fā)和發(fā)布過(guò)程中,注重應(yīng)用的隱私和安全測(cè)試是十分必要的。
安卓系統(tǒng)的開(kāi)源和自由度理念雖然帶來(lái)了很多好處,但也導(dǎo)致了其在安全性方面相對(duì)被動(dòng)。與iOS不同[14],安卓不要求應(yīng)用程序開(kāi)發(fā)者向Google Play注冊(cè)或獲得谷歌頒發(fā)的簽名證書(shū),這使得開(kāi)發(fā)人員可以為應(yīng)用程序創(chuàng)建任意數(shù)量的簽名證書(shū)。同時(shí),攻擊者可以在互聯(lián)網(wǎng)的任何網(wǎng)站上發(fā)布未經(jīng)谷歌審核的應(yīng)用程序[15],從而利用該開(kāi)放生態(tài)系統(tǒng)傳播有害軟件。盡管谷歌試圖防止黑客篡改合法應(yīng)用程序,但是依然很難確保應(yīng)用程序開(kāi)發(fā)人員不會(huì)創(chuàng)建匿名證書(shū)或避免被谷歌捕獲。此外,黑客還可以使用著名公司名稱欺騙用戶,將公司名稱放入證書(shū)中,在合法應(yīng)用程序中插入惡意代碼并創(chuàng)建特洛伊木馬,這是Android最大的安全問(wèn)題之一。
除了iOS 和安卓外,其他諸如HarmonyOS[16]、FuchsiaOS[17]等的整體分層架構(gòu)和接口定義與安卓系統(tǒng)類似,但它們的生態(tài)系統(tǒng)還未完全建立起來(lái)。因此,本文將以安卓智能終端為主要研究對(duì)象,探索該領(lǐng)域未來(lái)潛在的發(fā)展方向,并對(duì)相關(guān)技術(shù)和工具方法進(jìn)行綜述。
首先,本文從安卓系統(tǒng)的應(yīng)用結(jié)構(gòu)出發(fā),介紹架構(gòu)特點(diǎn)、關(guān)鍵組件以及相關(guān)的運(yùn)行環(huán)境。然后,以黑盒和白盒作為安卓智能終端自動(dòng)化測(cè)試技術(shù)的分類標(biāo)準(zhǔn),詳細(xì)討論了自動(dòng)化測(cè)試技術(shù)和工具的研究進(jìn)展。最后,對(duì)安卓智能終端自動(dòng)化測(cè)試技術(shù)所面臨的挑戰(zhàn)和未來(lái)潛在的發(fā)展方向進(jìn)行了分析和展望。
安卓[18]是智能終端設(shè)備上最受歡迎的平臺(tái)之一,作為開(kāi)源的智能終端操作系統(tǒng),它擁有眾多應(yīng)用軟件開(kāi)發(fā)者和用戶。如圖1所示,安卓系統(tǒng)架構(gòu)包括五個(gè)層次,從上往下分別為應(yīng)用程序?qū)?、?yīng)用程序框架層、系統(tǒng)運(yùn)行庫(kù)層、硬件抽象層以及Linux內(nèi)核層。
圖1 安卓平臺(tái)架構(gòu)Fig.1 Architecture of Android system
應(yīng)用程序?qū)影ㄒ恍╊A(yù)裝于安卓系統(tǒng)中的應(yīng)用程序,例如短信、相冊(cè)、地圖以及視頻播放器等。該層還包括開(kāi)發(fā)者自身通過(guò)使用應(yīng)用程序框架層提供的API(application programming interface)開(kāi)發(fā)的應(yīng)用程序。
應(yīng)用程序框架層為應(yīng)用程序?qū)犹峁〢PI接口,涵蓋了應(yīng)用程序開(kāi)發(fā)過(guò)程中需要使用的各種功能。新的框架版本需要幾個(gè)月的時(shí)間才能在安卓設(shè)備上占據(jù)主導(dǎo)地位,因此大多數(shù)設(shè)備都運(yùn)行舊版本的框架。這意味著安卓開(kāi)發(fā)人員必須花費(fèi)大量精力使自己的應(yīng)用程序與較舊的框架版本兼容,其引發(fā)的跨版本兼容問(wèn)題也是造成安卓應(yīng)用穩(wěn)定性不足的重要原因。
系統(tǒng)運(yùn)行庫(kù)層包含了一系列可以供安卓系統(tǒng)各組件使用的C/C++靜態(tài)庫(kù),這些庫(kù)通過(guò)應(yīng)用程序框架層為安卓應(yīng)用開(kāi)發(fā)者提供相應(yīng)功能服務(wù)。安卓運(yùn)行環(huán)境由Dalvik 虛擬機(jī)[19]和基礎(chǔ)的Java 類庫(kù)構(gòu)成。由于Dalvik 每次執(zhí)行都需要進(jìn)行字節(jié)碼到機(jī)器碼的轉(zhuǎn)換,導(dǎo)致應(yīng)用程序運(yùn)行速度較慢。同時(shí)Dalvik的垃圾回收機(jī)制效率不高,容易引起系統(tǒng)卡頓,使得系統(tǒng)的穩(wěn)定性降低。從安卓5.0 開(kāi)始,針對(duì)上面所提及的問(wèn)題,谷歌在系統(tǒng)運(yùn)行庫(kù)層上進(jìn)行了根本性的更改,引入了ART(Android runtime),這是一種新的運(yùn)行時(shí)環(huán)境,可以顯著提高應(yīng)用程序性能[20],并最終取代Dalvik虛擬機(jī)。
硬件抽象層是位于操作系統(tǒng)內(nèi)核與硬件電路之間的接口層,其目的在于將硬件抽象化。為了保護(hù)硬件廠商的知識(shí)產(chǎn)權(quán),它隱藏了特定平臺(tái)的硬件接口細(xì)節(jié),為操作系統(tǒng)提供虛擬硬件平臺(tái),使其具有硬件無(wú)關(guān)性,可在多種平臺(tái)上進(jìn)行移植。
Linux 內(nèi)核層包括了以Linux 內(nèi)核為基礎(chǔ)的安卓操作系統(tǒng)和各種驅(qū)動(dòng)程序,是安卓系統(tǒng)將底層硬件和系統(tǒng)服務(wù)連接起來(lái)的核心與基礎(chǔ)。
安卓應(yīng)用程序主要是用Java 語(yǔ)言編寫(xiě)。Java 源代碼首先被編譯成Java 字節(jié)碼,然后通過(guò)Dalvik 編譯器將Java字節(jié)碼轉(zhuǎn)換成Dalvik字節(jié)碼,并以.dex格式存儲(chǔ)在機(jī)器可執(zhí)行文件中。應(yīng)用程序最終以apk文件的形式分發(fā),其中包含了dex 文件、本機(jī)代碼和其他應(yīng)用程序資源的壓縮文件夾。
除了原生的安卓系統(tǒng),智能終端設(shè)備提供商為了提升用戶體驗(yàn)和產(chǎn)品銷量,通常會(huì)基于原生安卓系統(tǒng)開(kāi)發(fā)自己的定制化操作系統(tǒng),并將操作系統(tǒng)的升級(jí)速度作為賣(mài)點(diǎn)之一。然而,各廠商的定制化程度和質(zhì)量不同,導(dǎo)致智能終端設(shè)備的可靠性和穩(wěn)定性參差不齊。因此,對(duì)軟件進(jìn)行全面可靠的測(cè)試顯得尤為重要。
軟件測(cè)試是保證軟件系統(tǒng)質(zhì)量的最重要的分析性措施之一?,F(xiàn)有的軟件測(cè)試方法基本上可以分為黑盒測(cè)試和白盒測(cè)試。在黑盒測(cè)試中,測(cè)試用例是根據(jù)被測(cè)程序的需求規(guī)范確定的,而在白盒測(cè)試中,測(cè)試用例是從內(nèi)部結(jié)構(gòu)派生的。無(wú)論是哪種方法,自動(dòng)生成測(cè)試數(shù)據(jù)都很困難。
在過(guò)去的幾年里,人們見(jiàn)證了移動(dòng)應(yīng)用業(yè)務(wù)的驚人增長(zhǎng),移動(dòng)應(yīng)用開(kāi)發(fā)公司對(duì)自動(dòng)測(cè)試移動(dòng)應(yīng)用工具的需求也與日俱增,這一領(lǐng)域的研究也隨之增多。由于多種原因,大多數(shù)研究人員和開(kāi)發(fā)人員將重點(diǎn)放在安卓平臺(tái)上。首先,安卓目前在移動(dòng)市場(chǎng)占據(jù)最大份額,使得該平臺(tái)對(duì)業(yè)內(nèi)從業(yè)者極具吸引力。其次,由于設(shè)備和操作系統(tǒng)版本的碎片化,安卓應(yīng)用程序經(jīng)常會(huì)遇到跨平臺(tái)和跨版本的不兼容問(wèn)題,手動(dòng)測(cè)試這些應(yīng)用程序的成本特別高,因此其自動(dòng)化測(cè)試技術(shù)具有十分重要的意義。最后,安卓平臺(tái)及其相關(guān)技術(shù)的開(kāi)源特性,使其成為更適合學(xué)術(shù)研究人員的研究對(duì)象,可以更方便地訪問(wèn)應(yīng)用程序和底層操作系統(tǒng)。
盡管安卓應(yīng)用程序主要由Java 編寫(xiě)且基于用戶圖形界面(graphical user interface,GUI),但與Java 獨(dú)立的GUI 應(yīng)用程序相比,其存在很大的不同,并表現(xiàn)出不同種類的缺陷。因此,現(xiàn)有的大多數(shù)Java 測(cè)試用例生成工具并不能直接用于測(cè)試安卓應(yīng)用程序。為此,研究人員在此方面進(jìn)行了大量的研究,并提出了多種針對(duì)安卓應(yīng)用的測(cè)試用例生成技術(shù)和工具。如圖2所示,本文將從黑盒測(cè)試和白盒測(cè)試兩個(gè)方面對(duì)安卓智能終端軟件測(cè)試技術(shù)進(jìn)行綜述。
圖2 安卓測(cè)試技術(shù)結(jié)構(gòu)圖Fig.2 Android testing technology structure
黑盒測(cè)試,也稱為功能測(cè)試。在測(cè)試中,程序被視為一個(gè)無(wú)法打開(kāi)的黑盒子,測(cè)試員模擬真實(shí)用戶對(duì)程序的使用場(chǎng)景,幫助發(fā)現(xiàn)可能存在的問(wèn)題,確保程序的穩(wěn)定性和可靠性。黑盒測(cè)試主要關(guān)注程序外部結(jié)構(gòu),不涉及內(nèi)部的邏輯結(jié)構(gòu),主要針對(duì)軟件界面和軟件功能進(jìn)行測(cè)試,以確保程序能夠按照需求規(guī)格說(shuō)明書(shū)的規(guī)定正常使用,并能夠適當(dāng)?shù)亟邮蛰斎霐?shù)據(jù)并產(chǎn)生正確的輸出信息。
用戶界面(user interface,UI)測(cè)試是安卓應(yīng)用持續(xù)開(kāi)發(fā)過(guò)程的重要組成部分。它的目的是檢查UI是否符合設(shè)計(jì)要求,每個(gè)UI的布局是否顯示正確,每個(gè)按鈕的功能是否按預(yù)期執(zhí)行。根據(jù)Alegroth 等人[21]提供的GUI測(cè)試工具分類,UI測(cè)試方法可以分為三代。
第一代UI測(cè)試技術(shù)使用在手動(dòng)交互過(guò)程中記錄的精確坐標(biāo)點(diǎn),并錄制支持自動(dòng)重放的測(cè)試用例來(lái)進(jìn)行回歸測(cè)試。然而,由于存在對(duì)軟件自動(dòng)化測(cè)試(automation testing,AUT)的UI 變化的魯棒性不足、對(duì)屏幕分辨率依賴性大等缺陷,這種方法有著極高的維護(hù)成本,因此被逐漸放棄。
第二代UI 測(cè)試技術(shù)通過(guò)UI 控件屬性和數(shù)值直接針對(duì)UI 模型進(jìn)行操作。該方法對(duì)AUT 的UI 變化更具魯棒性,測(cè)試執(zhí)行性能高且穩(wěn)定,支持測(cè)試記錄和用例錄制。但是,第二代技術(shù)對(duì)需要訪問(wèn)AUT 的底層GUI 庫(kù)依賴性強(qiáng),因此對(duì)使用不同GUI API、不同編程語(yǔ)言編寫(xiě)的AUT的適用性很差。同時(shí)對(duì)于動(dòng)態(tài)UI,它的控件屬性和值可能會(huì)隨著時(shí)間的推移而發(fā)生變化,因此需要定期更新測(cè)試腳本,增加了測(cè)試維護(hù)成本。
第三代UI 測(cè)試技術(shù)使用圖像識(shí)別技術(shù)對(duì)UI 模型進(jìn)行操作,也稱為可視化GUI 測(cè)試。該技術(shù)通過(guò)對(duì)用戶顯示器上呈現(xiàn)的圖形GUI 進(jìn)行交互和斷言AUT的正確性,實(shí)現(xiàn)了高效、準(zhǔn)確的UI測(cè)試。圖像識(shí)別技術(shù)能夠識(shí)別UI 控件的位置、大小、顏色、文本等屬性,從而模擬用戶對(duì)UI進(jìn)行操作,并通過(guò)比對(duì)預(yù)期結(jié)果和實(shí)際結(jié)果來(lái)判斷測(cè)試是否通過(guò)。雖然該技術(shù)存在一定的誤差和測(cè)試維護(hù)成本,但其測(cè)試覆蓋范圍廣,能夠有效提高測(cè)試效率和測(cè)試質(zhì)量。
2.1.1 基于系統(tǒng)控件屬性的自動(dòng)化測(cè)試技術(shù)
常用的基于系統(tǒng)控件屬性的測(cè)試工具有Appium[22]、UI Automator[23]等,其中Appium是目前最為主流的框架和工具。如圖3 所示,Appium 的核心是一個(gè)Web服務(wù)器,可以接受來(lái)自客戶端的連接,監(jiān)聽(tīng)命令并在移動(dòng)設(shè)備上執(zhí)行,最終通過(guò)HTTP 響應(yīng)來(lái)描述執(zhí)行結(jié)果。Appium在執(zhí)行腳本前會(huì)在服務(wù)端默認(rèn)開(kāi)啟兩個(gè)網(wǎng)絡(luò)端口,4723 端口接收Webdriver 請(qǐng)求,4724 端口則將執(zhí)行命令發(fā)送到事先推送到安卓系統(tǒng)中的bootstrap.jar中,bootstrap.jar接收到命令請(qǐng)求后,調(diào)用底層的基礎(chǔ)測(cè)試框架來(lái)完成測(cè)試人員要求的測(cè)試指令。Coppola等人[24]對(duì)混合移動(dòng)應(yīng)用程序的測(cè)試用例所需的維護(hù)以及相關(guān)的脆弱性原因進(jìn)行了評(píng)估。他們使用Appium 和一個(gè)可視化的工具對(duì)一個(gè)不斷版本迭代的應(yīng)用程序進(jìn)行測(cè)試,并觀察自動(dòng)化測(cè)試用例腳本所需的變化。研究發(fā)現(xiàn),每次軟件版本更新后,至少有20%的基于系統(tǒng)控件屬性的測(cè)試用例需要進(jìn)行修改。而造成這些測(cè)試用例脆弱性的原因主要有以下幾點(diǎn):控件屬性更改,開(kāi)發(fā)者沒(méi)有為用戶界面元素提供唯一標(biāo)識(shí)符,定位器僅基于組件文本作判斷,組件排列被更改,組件被替換等情況。
圖3 Appium原理圖Fig.3 Appium schematic diagram
2.1.2 基于圖像識(shí)別的自動(dòng)化測(cè)試技術(shù)
Airtest[25]是一個(gè)跨平臺(tái)的、基于圖像識(shí)別的UI自動(dòng)化測(cè)試框架,適用于安卓智能終端的游戲和App的UI 測(cè)試工作。Airtest 使用圖像識(shí)別技術(shù)在當(dāng)前安卓智能終端畫(huà)面中查找對(duì)應(yīng)的圖片,然而圖像識(shí)別并不能達(dá)到人眼識(shí)別的準(zhǔn)確度,它只能盡可能地尋找一個(gè)最符合預(yù)期的結(jié)果。這就導(dǎo)致了測(cè)試人員認(rèn)為不存在的圖片,Airtest 認(rèn)為存在,或者測(cè)試人員認(rèn)為在畫(huà)面上一眼就能找到的內(nèi)容,Airtest 認(rèn)為不存在。因此圖像識(shí)別不是萬(wàn)能的,它是有成功率的。假設(shè)一個(gè)腳本里有10 張圖片,每張圖片的識(shí)別成功率都能達(dá)到95%,但合算10 張圖片全部都正確識(shí)別的概率也不超過(guò)60%。因此基于圖像識(shí)別的自動(dòng)化測(cè)試技術(shù)的核心在于提升圖片識(shí)別算法的準(zhǔn)確率。Li 等人[26]設(shè)計(jì)一個(gè)基于YOLOv3(you only look once v3)的輕量級(jí)卷積網(wǎng)絡(luò),用于識(shí)別手機(jī)截屏中的UI 頁(yè)面和按鈕等特征,并建立了一個(gè)有向圖模型存儲(chǔ)訪問(wèn)的UI 頁(yè)面及切換關(guān)系。該方法可以快速檢查UI 是否符合設(shè)計(jì)要求,模擬測(cè)試用戶點(diǎn)擊行為。研究結(jié)果顯示,該方法的UI頁(yè)面和按鈕覆蓋率超過(guò)85%。
表1 從代表工作、門(mén)檻、性能、失敗風(fēng)險(xiǎn)、適用場(chǎng)景和研究方向幾個(gè)方面對(duì)三代用戶界面測(cè)試技術(shù)進(jìn)行了概括總結(jié)。
表1 安卓UI測(cè)試工具比較Table 1 Comparison of Android UI testing tools
模糊測(cè)試通過(guò)向程序或系統(tǒng)輸入隨機(jī)、不合法或異常的數(shù)據(jù),刻意造成輸入錯(cuò)誤,推動(dòng)程序或系統(tǒng)進(jìn)入不合理的狀態(tài),從而觸發(fā)潛在的漏洞或錯(cuò)誤,尋找漏洞并加以修復(fù)。模糊測(cè)試的主要流程如圖4 所示。Monkey[27]是一款安卓自帶的命令行測(cè)試工具,通過(guò)模擬用戶點(diǎn)擊滑動(dòng)屏幕、輸入文本、按鍵等操作,Monkey 能夠快速有效地檢測(cè)應(yīng)用程序的穩(wěn)定性和魯棒性。Monkey支持對(duì)安裝在模擬器或手機(jī)設(shè)備上的應(yīng)用程序包進(jìn)行測(cè)試,并可根據(jù)用戶設(shè)置的包、注入事件等約束,限制測(cè)試范圍。Monkey 還能夠在程序崩潰、無(wú)法響應(yīng)或出現(xiàn)異常時(shí)立即停止并報(bào)告錯(cuò)誤。盡管Monkey 能夠生成大量事件序列,但由于其隨機(jī)性較強(qiáng),無(wú)法執(zhí)行自定義的特定事件序列,并且對(duì)如來(lái)電或地理位置變化等系統(tǒng)級(jí)事件的支持不夠強(qiáng)。
圖4 模糊測(cè)試的幾個(gè)階段Fig.4 Several stages of fuzz testing
Machiry 等人[28]提出了一個(gè)使用“觀察-選擇-執(zhí)行”原理來(lái)高效地生成測(cè)試用例的系統(tǒng)Dynodroid。通過(guò)選擇頻率、隨機(jī)或基于偏好三種策略,Dynodroid捕獲應(yīng)用程序當(dāng)前的空間列表并映射產(chǎn)生一組UI事件。同時(shí)Dynodroid 通過(guò)插樁監(jiān)聽(tīng)系統(tǒng)事件的注冊(cè)和注銷,并把被注冊(cè)的事件加入可執(zhí)行系統(tǒng)事件的集合中。然后,工具會(huì)選擇一個(gè)事件來(lái)執(zhí)行并檢測(cè)應(yīng)用的狀態(tài)。最終,在滿足策略指定條件的時(shí)候停止執(zhí)行。與Monkey 相比,Dynodroid 是一種向?qū)诫S機(jī)測(cè)試工具,它可以生成用戶界面事件和更多的系統(tǒng)級(jí)事件,并且支持策略性的停止條件而非固定注入次數(shù)。但Dynodroid 僅支持在比較老的安卓2.3版本模擬器上運(yùn)行,這在現(xiàn)今主流版本中顯得有些落后,因此在適用性方面不如安卓原生的Monkey工具。
Li 等人[29]提出了基于狀態(tài)轉(zhuǎn)換模型的UI 引導(dǎo)的測(cè)試輸入生成工具Droidbot。Droidbot的模型會(huì)根據(jù)實(shí)際的程序運(yùn)行信息動(dòng)態(tài)變化,并基于該轉(zhuǎn)換模型生成基于深度優(yōu)先策略的測(cè)試用例。此外,用戶還可以編寫(xiě)腳本來(lái)定制探索策略,或通過(guò)擴(kuò)展事件生成模塊來(lái)集成自己的測(cè)試用例。Droidbot 還提供了一種新的測(cè)試用例有效性評(píng)估方法,能夠?yàn)槊總€(gè)測(cè)試用例生成調(diào)用堆棧跟蹤,其中包含由測(cè)試用例觸發(fā)的App方法和系統(tǒng)方法,以便使用調(diào)用堆棧作為一個(gè)近似度量來(lái)量化測(cè)試用例的有效性。Droidbot 具有與Monkey 類似的易用性和適用性,同時(shí)提供了包括基于模型的輸入生成和可擴(kuò)展腳本編寫(xiě)等高級(jí)特性,類似于DynoDroid等其他工具。
Jamrozik 等人[30]提出并開(kāi)發(fā)了工具DroidMate。DroidMate 通過(guò)在運(yùn)行時(shí)重復(fù)讀取設(shè)備的頁(yè)面控件信息并監(jiān)視對(duì)安卓API 方法的調(diào)用來(lái)動(dòng)態(tài)生成測(cè)試數(shù)據(jù)。與DroidBot 類似,DroidMate 也試圖探索不同的UI元素,但前者采用的是深度優(yōu)先策略,后者則采用偏隨機(jī)游走策略。從實(shí)驗(yàn)結(jié)果看,DroidMate 有著更好的性能并且可以在短時(shí)間內(nèi)達(dá)到更高的覆蓋率。
進(jìn)一步的Li 等人[31]提出了Humanoid。Humanoid是一個(gè)能夠?qū)W習(xí)人類如何與移動(dòng)應(yīng)用程序交互,然后像人類測(cè)試人員一樣使用所學(xué)的模型來(lái)指導(dǎo)測(cè)試生成的GUI 測(cè)試生成器。借助從人類與設(shè)備交互中學(xué)習(xí)到的知識(shí),Humanoid 可對(duì)GUI 頁(yè)面上可能的交互進(jìn)行優(yōu)先級(jí)排序,并生成能夠?qū)е轮匾獱顟B(tài)的測(cè)試用例。該工具核心是深度神經(jīng)網(wǎng)絡(luò)模型,預(yù)測(cè)哪些UI 元素更容易與人類用戶交互,并指導(dǎo)測(cè)試用例生成過(guò)程。與前面所提及的幾種工具不同,Humanoid利用了GUI 的可視化信息,這是用戶探索應(yīng)用程序時(shí)的重要參考,也讓測(cè)試執(zhí)行過(guò)程更加貼近于用戶操作。
針對(duì)應(yīng)用存在部分特殊交互邏輯場(chǎng)景而導(dǎo)致測(cè)試效率低下和覆蓋率不理想的問(wèn)題,葉佳等人[32]提出了結(jié)合先驗(yàn)知識(shí)和測(cè)試路徑約束的規(guī)則驅(qū)動(dòng)測(cè)試輸入生成工具RDTA(rule-driven testing platform for Android)。RDTA 內(nèi)置驅(qū)動(dòng)引擎,可根據(jù)實(shí)時(shí)界面元素來(lái)篩選出特定符合規(guī)則的子集。這些規(guī)則定義了遍歷子集合的順序、驅(qū)動(dòng)事件的操作方式以及子集合在整個(gè)集合中的優(yōu)先級(jí)。相比其他測(cè)試工具,RDTA 可以針對(duì)性地快速進(jìn)入具有復(fù)雜前置操作步驟的頁(yè)面,避免因其引起的狀態(tài)爆炸問(wèn)題。
Adamo 等人[33]提出了一種強(qiáng)化學(xué)習(xí)方法來(lái)實(shí)現(xiàn)安卓應(yīng)用程序的GUI 自動(dòng)化測(cè)試。在缺少預(yù)先定義的抽象模型前提下,他們采用一種基于Q_Learning的測(cè)試生成算法,通過(guò)探索被測(cè)應(yīng)用程序的GUI,根據(jù)存儲(chǔ)在Q-table 中的Q 值來(lái)選擇可獲得最大收益的動(dòng)作并執(zhí)行。此外,瑞典開(kāi)發(fā)商King 使用人工智能技術(shù)訓(xùn)練人工智能測(cè)試工具,該工具結(jié)合了蒙特卡洛樹(shù)搜索算法、自動(dòng)啟發(fā)式構(gòu)建算法和增強(qiáng)拓?fù)涞纳窠?jīng)元演化算法來(lái)模擬人類交互并運(yùn)用于自動(dòng)化測(cè)試中。
雖然上述提及了許多新興的模糊測(cè)試工具,但目前除了Monkey 以外,Dynodroid、Droidbot、DroidMate 及Humanoid 都并未廣泛應(yīng)用于智能終端的集成測(cè)試體系中。這是由于這些新興的模糊測(cè)試技術(shù)都依賴于特定的安卓版本,無(wú)法支持新版本中出現(xiàn)的全新接口或修改后的接口。此外,安卓系統(tǒng)也在不斷更新自身的接口權(quán)限,部分工具使用的動(dòng)作事件注入技術(shù)在后續(xù)的安卓版本中被視為非法權(quán)限操作,這也使得這部分工具無(wú)法在新版本的安卓系統(tǒng)中正常使用。表2 對(duì)安卓模糊測(cè)試方法中常用的工具在原理、性能、適用性、準(zhǔn)確性等方面進(jìn)行了概括和總結(jié)。
表2 安卓模糊測(cè)試方法比較Table 2 Comparison of Android fuzz testing approaches
綜上所述,UI 測(cè)試和模糊測(cè)試等面向黑盒的安卓智能終端軟件測(cè)試技術(shù)在可靠性和穩(wěn)定性方面都存在著不可避免的缺陷。UI測(cè)試由于自身對(duì)于控件或圖片強(qiáng)關(guān)聯(lián),使其在測(cè)試執(zhí)行的穩(wěn)定性和復(fù)用率方面效率低下。模糊測(cè)試則因?yàn)闊o(wú)法快速支持新版本,被認(rèn)為在可移植性方面無(wú)法提供可靠的測(cè)試執(zhí)行。針對(duì)這些缺陷需要考慮引入其他新興技術(shù),如人工智能[34]、自適應(yīng)識(shí)別[35]等。
白盒測(cè)試主要用于檢測(cè)軟件編碼過(guò)程中的錯(cuò)誤,而程序員的編程經(jīng)驗(yàn)、對(duì)編程軟件的掌握程度、工作狀態(tài)等因素都會(huì)對(duì)編程質(zhì)量造成影響,導(dǎo)致代碼錯(cuò)誤。雖然普通的語(yǔ)法錯(cuò)誤在軟件調(diào)試時(shí)很容易發(fā)現(xiàn),但是邏輯順序、執(zhí)行路徑方面的錯(cuò)誤在調(diào)試時(shí)很難被走查覆蓋。通過(guò)白盒測(cè)試,可以檢測(cè)編程代碼中的每條分支和路徑,并找到隱藏在代碼中的錯(cuò)誤,對(duì)代碼進(jìn)行全面的測(cè)試,達(dá)到優(yōu)化的目的。
安卓應(yīng)用程序是基于Java 開(kāi)發(fā)的,它們被編譯成Dalvik字節(jié)碼,也有多種框架可以將Dalvik字節(jié)碼轉(zhuǎn)換成更熟悉、更易于分析和檢測(cè)的中間文件格式(例如Java字節(jié)碼、Jimple和Smali等)。因此,人們對(duì)安卓應(yīng)用程序的靜態(tài)分析和白盒測(cè)試技術(shù)進(jìn)行了大量的研究。本文將從面向?qū)ο蟮膯卧獪y(cè)試、污點(diǎn)分析、第三方庫(kù)檢測(cè)和安卓權(quán)限檢測(cè)四個(gè)方面對(duì)白盒的安卓智能終端軟件測(cè)試技術(shù)進(jìn)行綜述。雖然靜態(tài)污點(diǎn)分析、第三方庫(kù)檢測(cè)和權(quán)限檢測(cè)等白盒測(cè)試技術(shù)不是嚴(yán)格意義上的自動(dòng)化測(cè)試技術(shù),但它們是安卓安全測(cè)試的重要組成部分。同時(shí)這些技術(shù)可以與其他自動(dòng)化測(cè)試技術(shù)相結(jié)合,如可以結(jié)合污點(diǎn)分析和模糊測(cè)試,在模擬測(cè)試輸入的同時(shí)監(jiān)控安全信息流,形成一個(gè)完整的包含可靠性、穩(wěn)定性和安全性的安卓測(cè)試鏈。故本文將這三種技術(shù)視為自動(dòng)化測(cè)試的一部分,并進(jìn)行了簡(jiǎn)單的歸納總結(jié),方便讀者理解全面的安卓測(cè)試鏈并幫助應(yīng)用到實(shí)際項(xiàng)目中。
隨著軟件迭代速度的加快,開(kāi)發(fā)工程師在持續(xù)集成和敏捷開(kāi)發(fā)的大背景下,需要快速發(fā)現(xiàn)軟件缺陷,針對(duì)新的代碼執(zhí)行相應(yīng)的單元測(cè)試。然而,自動(dòng)化測(cè)試最大的挑戰(zhàn)在于需求變化,需要修改、擴(kuò)展、調(diào)試自動(dòng)化腳本以適應(yīng)新的功能。如果自動(dòng)化測(cè)試的投入產(chǎn)出比太低,其價(jià)值也失去意義。因此,越來(lái)越多的學(xué)者和企業(yè)工程師投入到實(shí)現(xiàn)自動(dòng)生成單元測(cè)試用例的方法開(kāi)發(fā)研究當(dāng)中。圖5 展示了單元測(cè)試用例自動(dòng)生成的四個(gè)主要研究方向。
圖5 測(cè)試用例生成的各種技術(shù)Fig.5 Various techniques of test case generation
3.1.1 基于隨機(jī)的測(cè)試用例自動(dòng)生成
隨機(jī)測(cè)試是最基本的單元測(cè)試生成技術(shù)之一。當(dāng)定向測(cè)試所需的時(shí)間過(guò)長(zhǎng)或問(wèn)題的復(fù)雜性使得無(wú)法測(cè)試每個(gè)組合時(shí),人們往往會(huì)優(yōu)先考慮進(jìn)行隨機(jī)測(cè)試?;陔S機(jī)的測(cè)試用例自動(dòng)生成可以在短時(shí)間內(nèi)達(dá)到較高的覆蓋率,并且生成的測(cè)試用例可以快速應(yīng)用于持續(xù)集成流程中進(jìn)行回歸測(cè)試。
Artho 等人[36]介紹了隨機(jī)測(cè)試原理:在面向?qū)ο蟮膯卧獪y(cè)試中,測(cè)試用例由一系列方法調(diào)用組成,每個(gè)步驟調(diào)用一個(gè)對(duì)象object 的方法method,表示為o.m(T1v1,T2v2,…,Tnvn),其中調(diào)用方法傳入的Tivi是對(duì)應(yīng)參數(shù)類型的值。生成一個(gè)隨機(jī)測(cè)試用例,首先是創(chuàng)建object 使它可以接受method 的調(diào)用,其次構(gòu)建Tivi類型的值作為調(diào)用method 的參數(shù),對(duì)method 的成功調(diào)用將返回一個(gè)result,該值可在后續(xù)測(cè)試中用作其他方法的參數(shù),如果調(diào)用過(guò)程中出現(xiàn)異常,則認(rèn)為method沒(méi)有通過(guò)測(cè)試。
由于隨機(jī)生成算法沒(méi)有考慮測(cè)試用例之間的關(guān)系以及測(cè)試用例對(duì)受測(cè)系統(tǒng)的影響,從而導(dǎo)致測(cè)試用例的重復(fù)性和低效性。因此,基于隨機(jī)的測(cè)試用例生成方法,需要在考慮測(cè)試用例的全面性和適度性的同時(shí),結(jié)合模型驅(qū)動(dòng)、覆蓋分析、數(shù)據(jù)挖掘等相關(guān)技術(shù)增量式、智能化地生成測(cè)試用例,從而實(shí)現(xiàn)更高效率和準(zhǔn)確率的測(cè)試。
Chen等人[37]介紹了一種增強(qiáng)形式的隨機(jī)測(cè)試——自適應(yīng)隨機(jī)測(cè)試(adaptive random testing,ART),它尋求在輸入空間內(nèi)更均勻地分布測(cè)試用例。同時(shí)實(shí)驗(yàn)證明ART 相較于傳統(tǒng)的隨機(jī)測(cè)試可以提升50%的缺陷檢測(cè)效率。Csallner 等人[38]提出了一種針對(duì)Java代碼的無(wú)向隨機(jī)測(cè)試工具JCrasher。相比其他ART工具,JCrasher 對(duì)被測(cè)軟件的構(gòu)造沒(méi)有任何假設(shè)和限制,它能夠自動(dòng)測(cè)試多個(gè)方法并執(zhí)行大量測(cè)試用例,從而提高軟件測(cè)試的覆蓋率和精度。但是,JCrasher也存在一些問(wèn)題,例如忽略異??赡芙沂镜腻e(cuò)誤,以及創(chuàng)建冗余和非法輸入,這些問(wèn)題也導(dǎo)致其執(zhí)行效率較低。Pacheco等人[39]提出了一種用于改進(jìn)隨機(jī)測(cè)試生成的技術(shù)。該技術(shù)可以通過(guò)測(cè)試用例執(zhí)行過(guò)程中的反饋來(lái)增量地構(gòu)建輸入,在構(gòu)建輸入后,根據(jù)過(guò)濾器進(jìn)行過(guò)濾從而拋棄冗余、非法或違反預(yù)設(shè)規(guī)則的輸入。同時(shí)該技術(shù)被應(yīng)用到基于反饋定向的單元測(cè)試用例工具Randoop上。Randoop相較于JCrasher,能在相同的被測(cè)庫(kù)下實(shí)現(xiàn)更高的覆蓋率,發(fā)現(xiàn)更多的有效問(wèn)題并減少冗余非法輸入。Yatoh等人[40]研究了反饋定向隨機(jī)測(cè)試生成的特點(diǎn),并提出了一種利用過(guò)度反饋限制測(cè)試多樣性的方法。首先,證明了反饋定向生成算法的反饋回路是一個(gè)正反饋回路,會(huì)放大候選值池中出現(xiàn)的偏差,從而過(guò)度指導(dǎo)生成并限制生成測(cè)試的多樣性。因此,限制反饋的數(shù)量可以提高生成測(cè)試的多樣性和有效性。其次,提出了一種反饋控制的隨機(jī)測(cè)試生成方法,通過(guò)對(duì)反饋的主動(dòng)控制來(lái)提高生成測(cè)試的多樣性。與原來(lái)的反饋導(dǎo)向算法相比,該方法至少提高了78%的分支覆蓋率。
3.1.2 基于符號(hào)執(zhí)行的測(cè)試用例自動(dòng)生成
符號(hào)執(zhí)行是一種功能強(qiáng)大的程序分析技術(shù),其概念誕生于20 世紀(jì)70 年代,可以同時(shí)探索一個(gè)程序在不同輸入下可能采取的多種程序路徑。由于其計(jì)算需要大量的處理能力和系統(tǒng)內(nèi)存,在最近幾年才被實(shí)踐運(yùn)用于測(cè)試用例生成。
符號(hào)執(zhí)行將程序的執(zhí)行路徑表示為對(duì)輸入值的約束,如圖6 所示[41]。其中動(dòng)態(tài)符號(hào)執(zhí)行是一種常見(jiàn)的符號(hào)執(zhí)行方法,它通過(guò)系統(tǒng)化地遍歷程序的各個(gè)路徑來(lái)生成新的測(cè)試用例。在每次迭代中,它會(huì)否定路徑約束中的一個(gè)分支條件,并使用約束求解器為該路徑生成一個(gè)新的測(cè)試用例。這類方法主要的目標(biāo)是生成特定的輸入數(shù)據(jù),需要手工構(gòu)建相應(yīng)的測(cè)試驅(qū)動(dòng)程序。另一種符號(hào)執(zhí)行方法是靜態(tài)符號(hào)執(zhí)行,它在每個(gè)分支節(jié)點(diǎn)上更新路徑條件,然后使用約束求解器判斷路徑是否可行。如果路徑不可行,就回溯到上一個(gè)節(jié)點(diǎn),因此只執(zhí)行可行路徑。然而,由于安卓框架非常復(fù)雜,而且是用多種語(yǔ)言構(gòu)建,很難將符號(hào)執(zhí)行技術(shù)應(yīng)用于面向框架的安卓應(yīng)用。此外,安卓框架不能在安卓設(shè)備/模擬器之外執(zhí)行,這也成為使用符號(hào)執(zhí)行技術(shù)測(cè)試的一大難題。
圖6 符號(hào)執(zhí)行示例圖Fig.6 Symbol execution example diagram
Mirzaei 等人[42]提出了一種適用于安卓應(yīng)用程序的新符號(hào)執(zhí)行方法。該方法擴(kuò)展了JPF(Java Pathfinder),并結(jié)合安卓系統(tǒng)的調(diào)用圖模型生成測(cè)試用例。該方法通過(guò)創(chuàng)建存根、編譯和運(yùn)行應(yīng)用程序、創(chuàng)建模擬類來(lái)解決路徑分歧,并自動(dòng)生成模擬用戶行為的驅(qū)動(dòng)程序,從而有效地提高符號(hào)執(zhí)行的效率。Luo 等人[43]提出了一種用于安卓框架符號(hào)執(zhí)行的路徑探索系統(tǒng)Centaur。為解決符號(hào)執(zhí)行的狀態(tài)空間爆炸問(wèn)題,Centaur使用了分階段符號(hào)執(zhí)行的方法,在初始化階段運(yùn)行,并使用微小污染分析的方式獲得來(lái)自惡意應(yīng)用程序的變量識(shí)別作為符號(hào)輸入。同時(shí)Centaur 完整分析了中間件的服務(wù)接口方法,為安卓符號(hào)執(zhí)行提供了完整的上下文,極大地提高了探索安卓路徑的準(zhǔn)確率。Gao 等人[44]為安卓應(yīng)用程序構(gòu)建了一個(gè)動(dòng)態(tài)符號(hào)執(zhí)行引擎。引擎支持自動(dòng)建模執(zhí)行環(huán)境,自動(dòng)推斷庫(kù)的表示,并通過(guò)多次運(yùn)行相應(yīng)的庫(kù)動(dòng)態(tài)優(yōu)化相應(yīng)表示,以提高行為覆蓋率和緩解路徑分歧問(wèn)題。此外,引擎支持上下文,可以為給定的上下文生成更精確的表達(dá)式,從而提高合成效率。該符號(hào)執(zhí)行引擎相比JPF 可以在相同執(zhí)行時(shí)間內(nèi)覆蓋更多的分支目標(biāo)。
綜合來(lái)說(shuō),近年來(lái)研究人員提出的面向安卓的符號(hào)執(zhí)行優(yōu)化方向,主要集中于約束縮減、上下文理解、處理Android 特有的功能和特性等方法,這些方法可以緩解路徑爆炸問(wèn)題并一定程度地提高測(cè)試效率。目前,雖然面向安卓的基于符號(hào)執(zhí)行的測(cè)試用例自動(dòng)生成方法相關(guān)工作已經(jīng)在安卓應(yīng)用程序的測(cè)試領(lǐng)域得到了一定的應(yīng)用,但依然受限于路徑爆炸、安卓特性、跨應(yīng)用程序路徑等問(wèn)題。
3.1.3 基于搜索的測(cè)試用例自動(dòng)生成
基于搜索的軟件測(cè)試(search-based software testing,SBST)是測(cè)試用例自動(dòng)生成的一個(gè)子領(lǐng)域,最初由Harman 和Jones[45]于2001 年提出。SBST 的重點(diǎn)是元啟發(fā)式搜索算法和進(jìn)化算法的使用,如爬山算法(hill-climbing,HC)、模擬退火算法(simulated annealing,SA)、遺傳算法(genetic algorithm,GA)等。這些基于搜索的算法每一個(gè)都強(qiáng)烈地依賴于所考慮問(wèn)題的領(lǐng)域,并使用與問(wèn)題領(lǐng)域相關(guān)的啟發(fā)式知識(shí),各有優(yōu)缺點(diǎn)[46]。SBST可以定義不同的適應(yīng)度函數(shù)來(lái)針對(duì)不同的測(cè)試目標(biāo),從而允許將相同的基于搜索的總體優(yōu)化策略應(yīng)用于不同的測(cè)試用例生成場(chǎng)景。因此,問(wèn)題的表示和適應(yīng)度函數(shù)的定義是應(yīng)用基于搜索的優(yōu)化技術(shù)的兩個(gè)關(guān)鍵要素。在軟件測(cè)試領(lǐng)域應(yīng)用最廣泛的算法如下所述。
爬山算法是一種局部貪心搜索算法,旨在目標(biāo)函數(shù)的最大化。它從搜索空間隨機(jī)選擇的初始解開(kāi)始,在每次迭代中研究當(dāng)前解的鄰域,一旦出現(xiàn)更好的臨近解,就會(huì)取代當(dāng)前的解決方案。然而,爬山方法可能會(huì)陷入搜索到局部最優(yōu)解而不是全局最優(yōu)解的問(wèn)題。模擬退火算法基于退火的化學(xué)過(guò)程,允許在搜索空間周圍的限制條件下概率移動(dòng)到較差的臨近解以避免局部極大值。然而,模擬退火算法也存在一些問(wèn)題,如初始溫度設(shè)置問(wèn)題和計(jì)算時(shí)間問(wèn)題。遺傳算法是一種基于種群的搜索算法,由美國(guó)密執(zhí)安大學(xué)的Holland 教授于1975 年提出,是一種通過(guò)模擬自然進(jìn)化過(guò)程搜索最優(yōu)解的方法。它創(chuàng)造并維持由染色體代表的個(gè)體群體,這些染色體按照選擇、突變和繁殖的規(guī)則進(jìn)行進(jìn)化。每個(gè)個(gè)體都接受一個(gè)環(huán)境適應(yīng)性的度量,高適應(yīng)值的個(gè)體通過(guò)交叉和變異得到一個(gè)新的群體,其中的個(gè)體可以更好地適應(yīng)環(huán)境。算法將不斷迭代,直到群體進(jìn)化形成問(wèn)題的解決方案,或者迭代次數(shù)達(dá)到最大值。雖然爬山算法和模擬退火算法也可用于基于搜索的測(cè)試用例自動(dòng)生成,但由于遺傳算法搜索空間更大、更容易跳出局部最優(yōu)解等特點(diǎn),在尋找全局最優(yōu)解方面更具優(yōu)勢(shì)。因此,遺傳算法被更廣泛地應(yīng)用于基于搜索的測(cè)試用例自動(dòng)生成中。
如圖7所示,遺傳算法在測(cè)試用例自動(dòng)生成上的主要過(guò)程有以下幾步:首先,對(duì)待測(cè)程序進(jìn)行靜態(tài)分析,獲取生成用例時(shí)所需要的參數(shù)信息(類型、數(shù)量、范圍等);其次,根據(jù)控制流程圖確定要進(jìn)行測(cè)試的目標(biāo)分支路徑;接著,根據(jù)測(cè)試要求構(gòu)造適應(yīng)度函數(shù),利用插樁技術(shù)對(duì)被測(cè)代碼進(jìn)行插樁,生成對(duì)應(yīng)樁程序;最后,通過(guò)遺傳算法生成覆蓋目標(biāo)路徑的測(cè)試用例。EvoSuite[47]是一個(gè)被廣泛使用的基于搜索的單元測(cè)試用例生成工具,支持使用常規(guī)遺傳算法、動(dòng)態(tài)多目標(biāo)排序算法(dynamic many-objective sorting algorithm,DynaMOSA)等,優(yōu)化過(guò)程由一組個(gè)體適應(yīng)度函數(shù)驅(qū)動(dòng),每個(gè)覆蓋目標(biāo)都對(duì)應(yīng)一個(gè)適應(yīng)度函數(shù),測(cè)試用例的編碼由可變長(zhǎng)度的Java 語(yǔ)句序列組成,優(yōu)化目標(biāo)是找到一個(gè)最大化代碼覆蓋率的測(cè)試集[48]。EvoSuite具有高度的自動(dòng)化、代碼覆蓋率高以及可解釋性強(qiáng)等優(yōu)點(diǎn),但也存在著無(wú)法完全檢測(cè)所有可能的執(zhí)行路徑、無(wú)法支持安卓原生語(yǔ)句、生成的測(cè)試用例質(zhì)量不穩(wěn)定等缺點(diǎn),這些缺點(diǎn)需要在實(shí)際應(yīng)用中加以注意和克服。
圖7 SBST流程圖Fig.7 SBST flow chart
單一的未經(jīng)過(guò)優(yōu)化的智能算法往往存在固有缺陷,遺傳算法也不例外。在使用傳統(tǒng)遺傳算法生成單元測(cè)試用例時(shí),常常會(huì)出現(xiàn)穩(wěn)定性較差、計(jì)算量大、約束失效、早熟收斂等一系列問(wèn)題。因此許多學(xué)者和機(jī)構(gòu)都投入到了優(yōu)化遺傳算法的研究中。目前,改進(jìn)遺傳算法的應(yīng)用大致可以分為四個(gè)方向:改進(jìn)遺傳算子,改善適應(yīng)度函數(shù),融合其他算法,遺傳算法并行化。
改進(jìn)遺傳算子:遺傳算法中有選擇算子、交叉算子和變異算子三種主要的遺傳算子控制著搜索過(guò)程。Zhu 等人[49]提出了三種基于約束的針對(duì)性改進(jìn)SBST 遺傳算子。首先,針對(duì)選擇算子,使用符號(hào)執(zhí)行技術(shù)來(lái)輔助選擇具有更多有用啟發(fā)式信息的測(cè)試用例。然后,基于約束的交叉算子對(duì)概率較大的測(cè)試用例進(jìn)行重組,產(chǎn)生更好的后代個(gè)體。最后,利用基于約束的變異算子對(duì)測(cè)試用例進(jìn)行改進(jìn),以滿足特定的約束條件。Cruz-Salinas 等人[50]提出了一種自適應(yīng)算子進(jìn)化算法。該算法定義了一種懲罰-獎(jiǎng)勵(lì)機(jī)制,使個(gè)體根據(jù)算子的質(zhì)量進(jìn)化,再使用輪盤(pán)賭算法對(duì)算子進(jìn)行重組,使其按質(zhì)量成比例演化。這種方式可以加快收斂速度,豐富種群多樣性,并且不會(huì)陷入早熟收斂。另外,Doerr 等人[51]提出了一種使用冪律分布選擇的隨機(jī)突變率策略,這種新的變異算子在測(cè)試集函數(shù)中有著最優(yōu)的性能。
改善適應(yīng)度函數(shù):Kim 等人[52]提出了基于局部?jī)?yōu)化算法(local optimization procedure,LOP)評(píng)估適應(yīng)度函數(shù)的遺傳算法,用于解決進(jìn)化過(guò)程中產(chǎn)生大量的候選解使得評(píng)估時(shí)間過(guò)長(zhǎng)的問(wèn)題。該方法在早期生成階段只使用部分邊緣子集計(jì)算解的近似適應(yīng)度,并逐步增加邊緣子集直到精確擬合,有效減少了運(yùn)行時(shí)間。楊瑞等人[53]提出了一種新的測(cè)試用例生成方法。該方法利用開(kāi)發(fā)的可執(zhí)行模型動(dòng)態(tài)獲取運(yùn)行時(shí)反饋信息,結(jié)合分散搜索技術(shù)自動(dòng)生成測(cè)試數(shù)據(jù),并創(chuàng)建預(yù)言信息。相較于傳統(tǒng)方法,該方法中的適應(yīng)度函數(shù)計(jì)算代價(jià)較低,可以忽略不同數(shù)據(jù)類型的差異性問(wèn)題,使其更具通用性。該方法充分利用運(yùn)行時(shí)信息計(jì)算適應(yīng)度,適用于多種數(shù)據(jù)類型的測(cè)試用例生成,是一種高效通用的測(cè)試用例自動(dòng)生成方法。Wang等人[54]提出了一種改進(jìn)的用戶偏好多目標(biāo)遺傳算法(user-preference multi-objective optimization algorithm,UPMOA),將用戶偏好指標(biāo)定義并集成到算法當(dāng)中。該算法根據(jù)用戶對(duì)各種目標(biāo)的偏好來(lái)評(píng)估特定解決方案的質(zhì)量,并將指標(biāo)分為需要最大化的有效性目標(biāo)和需要最小化的成本目標(biāo)。在均勻分布權(quán)重策略下,UPMOA 可以在問(wèn)題復(fù)雜性不斷增加的情況下提高軟件性能。Xu 等人[55]提出了一種基于分支硬度的自適應(yīng)適應(yīng)度函數(shù),通過(guò)建模吸收離散時(shí)間馬爾可夫鏈來(lái)度量程序中每個(gè)分支的預(yù)期訪問(wèn)次數(shù),通過(guò)啟發(fā)式地調(diào)整分支硬度參數(shù),可以使生成測(cè)試用例的搜索硬度最小化。該方法比傳統(tǒng)適應(yīng)度函數(shù)更加靈活。后續(xù)他們又提出了一種動(dòng)態(tài)的適應(yīng)度函數(shù)[56]來(lái)提高自動(dòng)生成測(cè)試用例的分支覆蓋性能。
融合其他算法:Braione 等人[57]使用符號(hào)執(zhí)行來(lái)生成描述程序路徑和輸入結(jié)構(gòu)之間依賴關(guān)系的路徑條件,并將路徑條件轉(zhuǎn)換為優(yōu)化問(wèn)題,再使用基于搜索的技術(shù)生成實(shí)例化這些輸入的方法調(diào)用序列。該方法可以實(shí)例化從具有復(fù)雜數(shù)據(jù)結(jié)構(gòu)的程序的符號(hào)執(zhí)行派生的路徑條件,從而為依賴于復(fù)雜輸入的測(cè)試目標(biāo)生成具體的測(cè)試用例。Kim 等人[58]提出了用深度神經(jīng)網(wǎng)絡(luò)訓(xùn)練一個(gè)雙深度Q網(wǎng)絡(luò)(double deep Qnetworks,DDQN)智能體,并代理學(xué)習(xí)SBST 的元啟發(fā)式算法,將SBST 理解為強(qiáng)化學(xué)習(xí)問(wèn)題,通過(guò)不斷地迭代試錯(cuò)從適應(yīng)度函數(shù)的反饋中找到最優(yōu)算法。Ayari 等人[59]提出了一種基于蟻群算法的進(jìn)化方法來(lái)降低自動(dòng)生成單元測(cè)試中的成本,使用概率密度估計(jì)技術(shù)指導(dǎo)連續(xù)輸入?yún)?shù)的搜索,并定義適應(yīng)度函數(shù)用于衡量測(cè)試用例殺死突變體的程度?;谙伻核惴ǜ倪M(jìn)的遺傳算法在迭代次數(shù)和搜索時(shí)間上,都優(yōu)于標(biāo)準(zhǔn)的遺傳算法。Ji[60]引入了模擬退火算法,將環(huán)境適應(yīng)度作為可變參數(shù)進(jìn)行處理,并建立環(huán)境適應(yīng)度與迭代次數(shù)直接的拉伸關(guān)系。同時(shí)引入輪盤(pán)賭選擇機(jī)制,保證產(chǎn)生的后代與環(huán)境適應(yīng)度正相關(guān),實(shí)現(xiàn)后代進(jìn)化的可持續(xù)優(yōu)化選擇。實(shí)驗(yàn)結(jié)果表明,改進(jìn)后的遺傳算法可以解決優(yōu)化過(guò)程中易陷于局部最優(yōu)、搜索初值依賴性等問(wèn)題。張大林等人[61]提出了一種基于主動(dòng)學(xué)習(xí)和預(yù)測(cè)引導(dǎo)的自動(dòng)化測(cè)試工具Auto-Unit。AutoUnit 引入了缺陷預(yù)測(cè)算法模型,對(duì)待測(cè)文件池中的所有文件進(jìn)行缺陷預(yù)測(cè),然后對(duì)最可疑的文件進(jìn)行測(cè)試用例生成,之后將實(shí)際測(cè)試用例執(zhí)行結(jié)果反饋給缺陷預(yù)測(cè)模型并更新該預(yù)測(cè)模型,最后根據(jù)召回率判斷是否進(jìn)入下一輪測(cè)試。與EvoSuite相比,AutoUnit能以更少的測(cè)試代價(jià)發(fā)現(xiàn)同等水平的代碼缺陷,有效地提高了測(cè)試效率。
遺傳算法并行化:遺傳算法的長(zhǎng)時(shí)間運(yùn)行與問(wèn)題維數(shù)很大、需要定制運(yùn)算符、復(fù)雜目標(biāo)函數(shù)需要幾分鐘計(jì)算、處理大型數(shù)據(jù)集、大量非線性限制等原因有關(guān)。由于遺傳算法是基于種群的方法,所有候選解都可以并行處理,非常適合并行化。Paduraru等人[62]提出了一種分布式實(shí)現(xiàn)的遺傳算法,并設(shè)計(jì)了基于特定“概率”的適應(yīng)度函數(shù),即某些分支條件以某種順序出現(xiàn),并使用它們指導(dǎo)測(cè)試走向尚未探索的領(lǐng)域。
3.1.4 其他測(cè)試用例自動(dòng)生成
除了上文提到的方法,還有其他一些基于目標(biāo)導(dǎo)向的方法來(lái)自動(dòng)生成測(cè)試用例。Ferguson等人[63]提出了一種基于鏈?zhǔn)降淖詣?dòng)生成軟件測(cè)試用例的方法。鏈?zhǔn)椒椒ㄊ褂脭?shù)據(jù)相關(guān)性分析來(lái)指導(dǎo)搜索過(guò)程。數(shù)據(jù)相關(guān)性分析能自動(dòng)識(shí)別影響代碼執(zhí)行的語(yǔ)句,鏈?zhǔn)椒椒▌t使用這些語(yǔ)句來(lái)準(zhǔn)確生成測(cè)試用例。Korel等人[64]提出了一種基于斷言自動(dòng)測(cè)試用例生成方法。該方法是鏈?zhǔn)椒椒ǖ臄U(kuò)展,將斷言插入約束條件來(lái)識(shí)別違反斷言的測(cè)試用例,并利用其揭示程序中的錯(cuò)誤。最終將查找違反斷言的程序輸入的問(wèn)題簡(jiǎn)化為查找執(zhí)行選定語(yǔ)句的程序輸入的問(wèn)題。表3 展示了不同面向?qū)ο蟮膯卧獪y(cè)試技術(shù)對(duì)比。
表3 面向?qū)ο蟮膯卧獪y(cè)試技術(shù)對(duì)比Table 3 Comparison of object-oriented unit testing techniques
綜上所述,目前已實(shí)現(xiàn)的自動(dòng)生成單元測(cè)試用例技術(shù)在覆蓋標(biāo)準(zhǔn)上,選擇的都是條件覆蓋、語(yǔ)句覆蓋、分支覆蓋這三種標(biāo)準(zhǔn),而忽略了路徑覆蓋。這是由于路徑覆蓋的測(cè)試用例生成存在路徑爆炸、循環(huán)控制流處理困難、分支語(yǔ)句嵌套復(fù)雜、動(dòng)態(tài)路徑無(wú)法探測(cè)等問(wèn)題,使得路徑覆蓋用例生成技術(shù)無(wú)法滿足正常的測(cè)試實(shí)踐。但與其他覆蓋標(biāo)準(zhǔn)相比,路徑覆蓋測(cè)試可以更有效地覆蓋程序中的每個(gè)可能路徑,包括所有的代碼分支和語(yǔ)句,以確保所有的情況都被考慮到,測(cè)試用例的覆蓋率也更高。且路徑覆蓋測(cè)試可以發(fā)現(xiàn)程序中的更多缺陷,包括隱藏的或難以發(fā)現(xiàn)的缺陷,因此路徑覆蓋可以更有效地提高程序的可靠性和穩(wěn)定性。未來(lái)的自動(dòng)生成單元測(cè)試用例技術(shù)需要更加重視路徑覆蓋標(biāo)準(zhǔn)的技術(shù)實(shí)現(xiàn)。
安卓智能終端的安全問(wèn)題一直是安卓測(cè)試技術(shù)研究的重點(diǎn)。在移動(dòng)支付、電子商務(wù)和社交網(wǎng)絡(luò)等活動(dòng)中,大量的用戶隱私數(shù)據(jù)容易在第三方移動(dòng)應(yīng)用程序中泄露,因此保護(hù)用戶隱私已成為一項(xiàng)緊迫任務(wù)。污點(diǎn)分析技術(shù)是一種信息流分析方法,可通過(guò)標(biāo)記系統(tǒng)中的敏感數(shù)據(jù)來(lái)跟蹤它們?cè)诔绦蛑械膫鞑?,進(jìn)而自動(dòng)檢測(cè)系統(tǒng)中的安全問(wèn)題。對(duì)于安卓應(yīng)用的隱私泄露問(wèn)題而言,污點(diǎn)分析是一種相對(duì)有效的解決方法。例如,當(dāng)存在一段安卓應(yīng)用程序代碼,該程序運(yùn)行會(huì)導(dǎo)致用戶的密碼數(shù)據(jù)通過(guò)發(fā)送短信的方式泄露時(shí),污點(diǎn)分析技術(shù)首先識(shí)別引入敏感數(shù)據(jù)的接口,并進(jìn)行相應(yīng)的標(biāo)記。如果被標(biāo)記的變量又通過(guò)程序依賴關(guān)系傳播到其他變量,那么根據(jù)相關(guān)傳播規(guī)則繼續(xù)標(biāo)記對(duì)應(yīng)的變量。當(dāng)被標(biāo)記的變量到達(dá)信息泄露的位置時(shí),就可以根據(jù)預(yù)先設(shè)定的安全策略進(jìn)行檢測(cè)。這樣,污點(diǎn)分析技術(shù)可以較為準(zhǔn)確地檢測(cè)出安卓應(yīng)用程序中的隱私泄露問(wèn)題,從而提高系統(tǒng)的安全性。污點(diǎn)分析又分為靜態(tài)和動(dòng)態(tài)的污點(diǎn)分析。
3.2.1 動(dòng)態(tài)污點(diǎn)分析
動(dòng)態(tài)污點(diǎn)分析是一種基于動(dòng)態(tài)信息流分析的技術(shù),其主要原理是在應(yīng)用程序運(yùn)行時(shí)標(biāo)記相關(guān)數(shù)據(jù),并通過(guò)跟蹤其在內(nèi)存中的顯式傳播過(guò)程來(lái)監(jiān)控應(yīng)用程序的行為,如圖8 所示。要實(shí)現(xiàn)動(dòng)態(tài)污點(diǎn)分析,需要解決三個(gè)主要問(wèn)題:確定污點(diǎn)源,制定污點(diǎn)傳播規(guī)則,以及選取污點(diǎn)檢測(cè)點(diǎn)。通過(guò)這些步驟,可以對(duì)敏感數(shù)據(jù)進(jìn)行有效的跟蹤和分析,從而增強(qiáng)系統(tǒng)的安全性。
圖8 動(dòng)態(tài)污點(diǎn)分析流程圖Fig.8 Dynamic taint analysis flow chart
Enck 等人[65]提出了一個(gè)支持實(shí)時(shí)監(jiān)控第三方應(yīng)用程序訪問(wèn)和操作用戶個(gè)人數(shù)據(jù)的高效動(dòng)態(tài)污點(diǎn)跟蹤和分析系統(tǒng)TaintDroid。為了獲取分析應(yīng)用程序行為所需的上下文信息,TaintDroid 通過(guò)修改Dakvik虛擬機(jī)并對(duì)字節(jié)碼執(zhí)行過(guò)程進(jìn)行動(dòng)態(tài)插樁來(lái)給隱私敏感源的數(shù)據(jù)添加標(biāo)簽,并在敏感數(shù)據(jù)通過(guò)程序變量、文件和進(jìn)程間消息傳播時(shí)傳遞應(yīng)用標(biāo)簽。當(dāng)污染數(shù)據(jù)通過(guò)網(wǎng)絡(luò)傳輸或以其他方式離開(kāi)系統(tǒng)時(shí),TaintDroid 會(huì)記錄該標(biāo)簽所對(duì)應(yīng)的應(yīng)用程序以及隱私數(shù)據(jù)的發(fā)送鏈接,以此識(shí)別存在安全風(fēng)險(xiǎn)的應(yīng)用程序。但由于需要修改虛擬機(jī)、彈性和透明度低等問(wèn)題,TaintDroid 無(wú)法被廣泛應(yīng)用到各個(gè)版本的安卓系統(tǒng)中。
Xu 等人[66]提出了一個(gè)能夠?qū)Π沧繎?yīng)用程序進(jìn)行細(xì)粒度區(qū)分的動(dòng)態(tài)污點(diǎn)策略分析工具Aurasium。相較于TaintDroid,Aurasium 不需要修改安卓操作系統(tǒng)或虛擬機(jī),它通過(guò)重新打包將沙盒代碼直接附加到三方應(yīng)用程序本身,并通過(guò)上層的沙盒代碼對(duì)應(yīng)用程序進(jìn)行監(jiān)視和實(shí)施安全隱私策略。通過(guò)沙盒代碼,Aurasium 能夠在應(yīng)用程序和操作系統(tǒng)之間插入各種功能的監(jiān)視模塊,執(zhí)行比安卓?jī)?nèi)置權(quán)限系統(tǒng)更細(xì)粒度的安全隱私策略。但Aurasium 使用較為單一的沙盒程序,也使得其容易被惡意應(yīng)用程序規(guī)避檢測(cè)。
Tam等人[67]提出了一個(gè)基于虛擬手機(jī)設(shè)備(virtual mobile infrastructure,VMI)的自動(dòng)動(dòng)態(tài)污點(diǎn)分析系統(tǒng)CopperDroid。CopperDroid 通過(guò)在VMI 中運(yùn)行應(yīng)用程序,對(duì)執(zhí)行過(guò)程進(jìn)行跟蹤和監(jiān)視,收集應(yīng)用程序的行為數(shù)據(jù),并對(duì)這些數(shù)據(jù)進(jìn)行可視化展示和分析。同時(shí)CopperDroid 還支持自定義規(guī)則和插件,可用于檢測(cè)和分析應(yīng)用程序中的各種攻擊和漏洞類型,如隱私泄露、惡意軟件、代碼注入等。相較于其他工具,CopperDroid 基于VMI 的以系統(tǒng)調(diào)用為中心的分析,可以有效地防止應(yīng)用程序規(guī)避檢測(cè),同時(shí)也使系統(tǒng)的內(nèi)部信息變化更加直觀和透明。但因?yàn)镃opperDroid 是在模擬器環(huán)境中執(zhí)行應(yīng)用程序,所以分析結(jié)果并不完全可靠,可能存在誤報(bào)或漏報(bào)等情況。
3.2.2 靜態(tài)污點(diǎn)分析
靜態(tài)污點(diǎn)分析是一種基于程序變量之間數(shù)據(jù)依賴關(guān)系的污點(diǎn)分析技術(shù),在不運(yùn)行代碼的情況下對(duì)應(yīng)用程序進(jìn)行安全檢測(cè)。相對(duì)于動(dòng)態(tài)污點(diǎn)分析,靜態(tài)污點(diǎn)分析具有一些明顯的優(yōu)勢(shì):首先,它可以在程序發(fā)布前對(duì)應(yīng)用程序的安全性進(jìn)行檢測(cè),避免發(fā)布后造成安全問(wèn)題;其次,它具有較高的分析覆蓋率,無(wú)需依賴測(cè)試集合;此外,它不需要程序插樁,避免了可能導(dǎo)致程序運(yùn)行開(kāi)銷的問(wèn)題。在進(jìn)行靜態(tài)污點(diǎn)分析時(shí),通常會(huì)對(duì)程序的控制流圖和數(shù)據(jù)流圖進(jìn)行分析,并根據(jù)變量之間的數(shù)據(jù)依賴關(guān)系來(lái)標(biāo)記敏感數(shù)據(jù)的源頭及其傳播路徑。通過(guò)這種方式可以快速識(shí)別可能存在的信息泄露風(fēng)險(xiǎn),并提出有效的修復(fù)措施。
Arzt等人[68]提出了一個(gè)高精度、高性能靜態(tài)污點(diǎn)分析系統(tǒng)FlowDroid。FlowDroid 利用反編譯工具Dexpler 和Java 分析工具Soot[69]將apk 文件轉(zhuǎn)化成Soot 中間表示Jimple,隨后在Jimple 上進(jìn)行靜態(tài)的污點(diǎn)分析。FlowDroid 根據(jù)上下文精確地建模整個(gè)安卓生命周期信息,可以有效提高精確度和召回率,并減少漏檢和錯(cuò)檢。但FlowDroid 不支持組件間通信的檢測(cè),且不能準(zhǔn)確地解析和跟蹤部分高級(jí)操作的意圖。王蕾等人[70]在FlowDroid的基礎(chǔ)上優(yōu)化并提出了一種多源污點(diǎn)分析系統(tǒng)MultiFlow。針對(duì)FlowDroid結(jié)果數(shù)量多但精度低的問(wèn)題,MultiFlow利用多源綁定特性增強(qiáng)污點(diǎn)分析,使其可以判斷多個(gè)污點(diǎn)源是否可在一次執(zhí)行中綁定發(fā)生,從而顯著提高安卓應(yīng)用隱私泄露檢測(cè)的精度。Wei 等人[71]提出了實(shí)現(xiàn)流和上下文敏感的組件內(nèi)數(shù)據(jù)流污點(diǎn)分析工具AmAndroid。在過(guò)程間控制流圖和數(shù)據(jù)流圖的基礎(chǔ)上,AmAndroid創(chuàng)新性地為每個(gè)組件構(gòu)建一個(gè)數(shù)據(jù)依賴圖,并生成一個(gè)匯總表,以記錄可能的組件通信連接。相較于FlowDroid,AmAndroid 可以基于專有的組件間和應(yīng)用程序間流分析來(lái)進(jìn)行組件間通信和應(yīng)用程序間通信的污點(diǎn)檢測(cè)。然而,由于處理異常和反射的能力有限,AmAndroid無(wú)法檢測(cè)并分析隱式污點(diǎn)流。Gordon 等人[72]提出了一個(gè)對(duì)象敏感和流不敏感的污點(diǎn)分析工具DroidSafe。DroidSafe專門(mén)為安卓構(gòu)建了一個(gè)執(zhí)行模型以精確地跟蹤通過(guò)安卓API 的流。同時(shí)DroidSafe使用字符串分析將反射調(diào)用替換為對(duì)目標(biāo)方法的直接調(diào)用,也使得污點(diǎn)分析流更加完整。但由于真實(shí)項(xiàng)目代碼量大且復(fù)雜,DroidSafe分析及調(diào)試過(guò)程成本高等問(wèn)題,DroidSafe 也未被廣泛應(yīng)用于實(shí)際的軟件工程項(xiàng)目。
表4 展示了動(dòng)靜態(tài)污點(diǎn)分析在技術(shù)優(yōu)勢(shì)、局限性、性能、準(zhǔn)確率這幾個(gè)評(píng)價(jià)指標(biāo)下的對(duì)比結(jié)果。污點(diǎn)分析技術(shù)雖然在安卓應(yīng)用的識(shí)別和修復(fù)潛在的安全漏洞方面取得了一定的成果,但在可靠性和穩(wěn)定性方面仍存在十分明顯的缺陷和難點(diǎn)。首先,由于計(jì)算機(jī)程序的控制流和數(shù)據(jù)流非常復(fù)雜,污點(diǎn)分析往往會(huì)遇到路徑爆炸問(wèn)題。當(dāng)程序中存在大量循環(huán)和分支語(yǔ)句時(shí),污點(diǎn)分析的路徑數(shù)會(huì)呈指數(shù)級(jí)增長(zhǎng),導(dǎo)致分析時(shí)間和空間成本極其不穩(wěn)定。其次,在污點(diǎn)分析中,程序執(zhí)行的上下文環(huán)境非常重要,例如程序的輸入、輸出和狀態(tài)等,但是目前技術(shù)很難精確地獲取和分析這些上下文信息,導(dǎo)致污點(diǎn)分析的準(zhǔn)確性和可靠性受到影響。再次,已有的污點(diǎn)分析技術(shù)往往會(huì)產(chǎn)生大量的誤報(bào),即將正常的程序行為誤認(rèn)為是安全漏洞。這是由于程序中存在大量的復(fù)雜控制流和數(shù)據(jù)流,而污點(diǎn)分析很難準(zhǔn)確地區(qū)分哪些行為是正常的,哪些行為是異常的。最后,污點(diǎn)分析技術(shù)的可擴(kuò)展性比較差,即難以應(yīng)對(duì)大規(guī)模、復(fù)雜的程序分析。這是由于污點(diǎn)分析需要對(duì)程序的控制流和數(shù)據(jù)流進(jìn)行深入分析,而這些分析往往需要消耗大量的計(jì)算資源和存儲(chǔ)空間。
表4 安卓污點(diǎn)分析技術(shù)方法比較Table 4 Comparison of Android taint analysis technique approaches
除單元測(cè)試和污點(diǎn)分析外,還有其他安卓白盒測(cè)試技術(shù)可以通過(guò)了解和分析應(yīng)用程序的內(nèi)部實(shí)現(xiàn)和結(jié)構(gòu),以及程序運(yùn)行時(shí)的行為情況,來(lái)發(fā)現(xiàn)軟件中可能存在的問(wèn)題和缺陷,如第三方庫(kù)安全測(cè)試、安卓權(quán)限安全測(cè)試等。
3.3.1 第三方庫(kù)安全測(cè)試
第三方庫(kù)是軟件開(kāi)發(fā)的重要組成部分。在安卓生態(tài)系統(tǒng)中,開(kāi)發(fā)人員可以借助第三方庫(kù)的不同功能來(lái)提高應(yīng)用程序的開(kāi)發(fā)效率。然而,第三方庫(kù)使用的普及也帶來(lái)了新的挑戰(zhàn)和威脅。惡意或易受攻擊的代碼可能會(huì)隱藏在第三方庫(kù)中,這些代碼可能會(huì)感染廣泛使用的應(yīng)用程序,對(duì)用戶的信息安全構(gòu)成威脅。
通常,檢測(cè)第三方庫(kù)有基于白名單和基于特征提取兩種方式,如圖9所示。最初的重打包檢測(cè)和惡意軟件檢測(cè)大多采用基于白名單的方式,即過(guò)濾掉已知的惡意第三方庫(kù)。例如,Chen 等人[73]使用了一份包含73 個(gè)經(jīng)過(guò)篩選的第三方庫(kù)的白名單。Lin 等人[74]以手動(dòng)方式對(duì)接近400 個(gè)第三方庫(kù)進(jìn)行了標(biāo)記,并對(duì)它們進(jìn)行了功能分類。Zhou 等人[75]開(kāi)發(fā)了應(yīng)用程序相似性度量系統(tǒng)DroidMOSS,基于白名單并利用模糊哈希技術(shù)來(lái)檢測(cè)應(yīng)用程序重打包行為的變化。然而,這種方法很容易被包重命名所規(guī)避,并且隨著混淆技術(shù)的興起,基于白名單的方法的有效性也大大降低。因此,越來(lái)越多的研究者開(kāi)始使用基于特征提取的方式,直接從第三方庫(kù)中提取關(guān)鍵特征來(lái)識(shí)別惡意程序。Liu等人[76]針對(duì)安卓程序中的廣告第三方庫(kù),使用基于字節(jié)碼靜態(tài)分析提取特征的機(jī)器分類器,提出了一種高效、準(zhǔn)確、自動(dòng)且抗混淆的方法PEDAL,用于識(shí)別嵌入在應(yīng)用程序二進(jìn)制文件中的廣告庫(kù)。Ishio 等人[77]提出了一種自動(dòng)檢測(cè)目標(biāo)程序中包含類文件jar的方法。該方法使用貪婪算法檢索可疑三方j(luò)ar文件列表。報(bào)告的文件列表可幫助開(kāi)發(fā)人員和用戶評(píng)估由應(yīng)用程序中的第三方庫(kù)引起的潛在風(fēng)險(xiǎn)。Backes 等人[78]提出了LibScout,用于確定第三方庫(kù)是否被混淆并準(zhǔn)確判斷庫(kù)的版本。LibScout使用哈希特征進(jìn)行檢測(cè),重點(diǎn)提取類之間的層次結(jié)構(gòu)信息。黃思榮等人[79]提出了LibSeeker,它在LibScout基礎(chǔ)上增加了對(duì)方法特征的提取,完善了LibScout 的不足。LibSeeker 利用置信區(qū)間上界算法和ROC 曲線簡(jiǎn)化參數(shù)自整定,提高了第三方庫(kù)檢測(cè)的效率。
圖9 第三方庫(kù)安全測(cè)試技術(shù)Fig.9 Third-party library testing technology
雖然現(xiàn)在已有成熟的商業(yè)產(chǎn)品廣泛應(yīng)用于安卓移動(dòng)終端的第三方庫(kù)檢測(cè),但仍存在一些不足。首先,應(yīng)用程序中使用的第三方庫(kù)通常具有復(fù)雜的依賴關(guān)系,如嵌套依賴、版本沖突等,使得已有檢測(cè)工具需要考慮多個(gè)庫(kù)之間的交互影響,增加了檢測(cè)的難度,可靠性降低。其次,由于不同的應(yīng)用程序使用的第三方庫(kù)不同,檢測(cè)工具需要具有一定的適配性。但是由于庫(kù)的數(shù)量龐大,工具開(kāi)發(fā)者需要花費(fèi)大量時(shí)間來(lái)適配各種庫(kù),限制了工具的覆蓋率和穩(wěn)定性。因此,需要進(jìn)一步地研究和改進(jìn),以提高第三方庫(kù)檢測(cè)技術(shù)的可靠性和穩(wěn)定性。表5 展示了安卓第三方庫(kù)檢測(cè)不同代表工作的優(yōu)劣勢(shì)對(duì)比。
表5 安卓第三方庫(kù)檢測(cè)方法比較Table 5 Comparison of Android third-party library detection approaches
3.3.2 安卓權(quán)限安全測(cè)試
安卓因其開(kāi)源性,長(zhǎng)期以來(lái)一直是惡意軟件攻擊的主要目標(biāo)。其中一個(gè)主要漏洞來(lái)源就是權(quán)限機(jī)制。為保障用戶數(shù)據(jù)的安全,安卓要求應(yīng)用程序在訪問(wèn)用戶敏感數(shù)據(jù)(如聯(lián)系人和短信)以及某些系統(tǒng)功能(如攝像頭和網(wǎng)絡(luò)訪問(wèn))時(shí)請(qǐng)求相應(yīng)的權(quán)限。安卓的安全性在很大程度上取決于這種權(quán)限機(jī)制的有效性。然而,惡意軟件可能會(huì)偷偷地申請(qǐng)額外權(quán)限,以獲取用戶的敏感和私人數(shù)據(jù),而這也是安卓系統(tǒng)的潛在危險(xiǎn)之一。
為了應(yīng)對(duì)這一風(fēng)險(xiǎn),安卓權(quán)限檢測(cè)技術(shù)被不斷提升和完善。目前,安卓權(quán)限檢測(cè)技術(shù)大致可以分為三種類型。第一種是基于描述的權(quán)限檢測(cè)技術(shù)。該技術(shù)使用靜態(tài)分析方法,解析應(yīng)用程序相關(guān)的代碼權(quán)限,并分析應(yīng)用程序?qū)嶋H調(diào)用的權(quán)限,從而得到應(yīng)用程序最小權(quán)限集。Xiao 等人[80]提出了一種超聲明權(quán)限識(shí)別算法MPDroid。MPDroid 采用線性判別分析(linear discriminant analysis,LDA)技術(shù)和改進(jìn)的協(xié)同過(guò)濾推薦算法來(lái)識(shí)別和刪除應(yīng)用程序過(guò)度聲明的權(quán)限。徐尉等人[81]提出了基于應(yīng)用功能類別分析的安卓應(yīng)用權(quán)限泄露檢測(cè)系統(tǒng)PACS(permission abuse checking system)。該系統(tǒng)通過(guò)分析應(yīng)用評(píng)論數(shù)據(jù)和簡(jiǎn)介文本判斷功能類別,反編譯apk 文件獲取權(quán)限信息,統(tǒng)計(jì)同類應(yīng)用頻繁申請(qǐng)的權(quán)限構(gòu)建權(quán)限頻繁項(xiàng)集,并根據(jù)類別下的頻繁權(quán)限集判斷應(yīng)用是否存在異常權(quán)限申請(qǐng),從而檢測(cè)權(quán)限濫用行為,實(shí)現(xiàn)了基于應(yīng)用功能對(duì)權(quán)限濫用情況進(jìn)行有針對(duì)性檢測(cè)的系統(tǒng)。第二種是基于接口的權(quán)限檢測(cè)技術(shù)。該技術(shù)通過(guò)數(shù)據(jù)融合方法和基于挖掘的技術(shù),根據(jù)應(yīng)用程序使用的API和API描述,為給定的應(yīng)用程序推薦權(quán)限。Liu等人[82]提出了一個(gè)新的安卓應(yīng)用權(quán)限推薦系統(tǒng)PerRec,其中協(xié)作過(guò)濾組件和基于內(nèi)容的推薦組件的結(jié)合使系統(tǒng)性能更佳。但由于安卓系統(tǒng)版本迭代速度不斷加快,第三方庫(kù)不斷地被各應(yīng)用所使用,API 的數(shù)量也不斷地增加,功能和描述也隨之變化,這就造成了該方法的適用性略顯不足。第三種是基于隱私政策的權(quán)限檢測(cè)技術(shù)。Yu 等人[83]提出利用應(yīng)用程序的隱私策略及其字節(jié)碼來(lái)增強(qiáng)基于描述和權(quán)限的惡意軟件檢測(cè),自動(dòng)分析隱私策略,并在隱私策略、字節(jié)碼、描述和權(quán)限之間執(zhí)行交叉驗(yàn)證。該模型描述了個(gè)人信息是如何被處理和傳輸?shù)?,并指?dǎo)軟件定義語(yǔ)義,包括數(shù)據(jù)聚合、完整性和安全性。但由于隱私政策是開(kāi)發(fā)者自己撰寫(xiě)的,可能其聲明的隱私權(quán)限未必是應(yīng)用程序所需要的,部分使用到的權(quán)限也可能并未在隱私政策中提及。
除了上述內(nèi)容,安卓權(quán)限檢測(cè)技術(shù)還需要考慮用戶態(tài)與內(nèi)核態(tài)權(quán)限管理、安全性與用戶體驗(yàn)的平衡、動(dòng)態(tài)越權(quán)、設(shè)備多樣性等問(wèn)題,這些問(wèn)題也導(dǎo)致了安卓權(quán)限檢測(cè)技術(shù)在可靠性和穩(wěn)定性方面無(wú)法達(dá)到最優(yōu)的測(cè)試實(shí)踐。
測(cè)試技術(shù)是智能終端系統(tǒng)中至關(guān)重要的基礎(chǔ)技術(shù),它可以顯著提高智能終端系統(tǒng)的可靠性和穩(wěn)定性。盡管軟件測(cè)試在過(guò)去幾年中已經(jīng)取得了重大進(jìn)步,但仍存在一些重要的歷史問(wèn)題,如成本高、效率低、精度差等。而現(xiàn)在,隨著新興技術(shù)(如人工智能大模型)的出現(xiàn),這些問(wèn)題變得更加復(fù)雜和具有挑戰(zhàn)性,同時(shí)也引出復(fù)雜性、異構(gòu)性、不透明性等新問(wèn)題。因此,本文將從歷史技術(shù)和人工智能新技術(shù)兩個(gè)角度探討這些問(wèn)題和挑戰(zhàn),并為其提供解決思路,如圖10所示。
圖10 安卓智能終端自動(dòng)化測(cè)試技術(shù)挑戰(zhàn)與展望Fig.10 Challenges and prospects of Android intelligent terminal automation testing
在黑盒測(cè)試方面,隨著新興技術(shù)的涌現(xiàn),應(yīng)用程序變得更加復(fù)雜,交付速度也越來(lái)越快,這給軟件測(cè)試帶來(lái)了更多的挑戰(zhàn)。對(duì)于安卓智能終端黑盒測(cè)試的可靠性和穩(wěn)定性,存在以下幾個(gè)關(guān)鍵問(wèn)題:
第一,高維護(hù)成本。隨著項(xiàng)目迭代速度的提高,黑盒自動(dòng)化測(cè)試需要不斷調(diào)試代碼以適應(yīng)新版本UI的更新,導(dǎo)致維護(hù)成本升高。
第二,非全自動(dòng)化運(yùn)行。盡管部分自動(dòng)化執(zhí)行步驟可以自動(dòng)生成和運(yùn)行,但某些步驟仍需要人工干預(yù),例如設(shè)置環(huán)境和運(yùn)行數(shù)據(jù)等。此外,自動(dòng)化運(yùn)行有時(shí)可能會(huì)誤報(bào)結(jié)果,而誤報(bào)排查往往也需要人工確認(rèn)。
第三,長(zhǎng)時(shí)間執(zhí)行。黑盒自動(dòng)化測(cè)試會(huì)隨著用例數(shù)量的不斷增加,導(dǎo)致執(zhí)行時(shí)間越來(lái)越長(zhǎng),問(wèn)題暴露得也越來(lái)越晚。為了跟上版本迭代速度,開(kāi)發(fā)人員可能會(huì)選擇直接發(fā)布最新版本,從而使自動(dòng)化測(cè)試工作形同虛設(shè)。
在白盒測(cè)試方面,盡管單元測(cè)試用例自動(dòng)生成技術(shù)已經(jīng)在許多軟件領(lǐng)域得到廣泛應(yīng)用,但對(duì)于安卓智能終端領(lǐng)域的系統(tǒng)測(cè)試仍然存在許多挑戰(zhàn)。
對(duì)于符號(hào)執(zhí)行,研究人員仍然面臨提高可拓展性和可用性的雙重挑戰(zhàn)。可拓展性是指如何在有限的資源下提高符號(hào)執(zhí)行的效率,以更快地達(dá)到最終目標(biāo)。路徑空間爆炸和約束求解就是可拓展性的兩個(gè)主要難點(diǎn)。目前主要的研究有四個(gè)方面:(1)針對(duì)具體目標(biāo)提供高效的搜索策略;(2)通過(guò)約束輸入范圍、削減或合并路徑等方式來(lái)減少程序的路徑空間;(3)在調(diào)用求解器之前對(duì)路徑條件的查詢進(jìn)行優(yōu)化,以減少求解器的調(diào)用次數(shù)或縮短求解時(shí)間;(4)支持覆蓋程序特征的高效編碼。在可行性方面,環(huán)境建模和多形態(tài)分析目標(biāo)支持則是主要難點(diǎn)。主要的研究方向是在分析的精確性、可靠性、建模工作量之間進(jìn)行權(quán)衡和折中,并不斷探索更多的語(yǔ)言和應(yīng)用領(lǐng)域。
對(duì)于遺傳算法,研究人員則面臨非數(shù)值行變量的處理和初始參數(shù)確定兩個(gè)方面的挑戰(zhàn)。對(duì)于初始參數(shù),遺傳算法中的種群大小和遺傳算子概率等參數(shù)通常是隨機(jī)設(shè)置的,如何進(jìn)行智能設(shè)置以提高測(cè)試生成的效率和準(zhǔn)確性是一個(gè)亟待解決的問(wèn)題。在安卓智能終端領(lǐng)域,由于存在復(fù)雜的變量類型和類成員變量,如何選擇合適的編碼策略也是需要研究的問(wèn)題。研究人員需要針對(duì)不同場(chǎng)景和應(yīng)用,選擇最佳的編碼策略和參數(shù)配置,以實(shí)現(xiàn)更加準(zhǔn)確和高效的遺傳算法測(cè)試生成。
在新興技術(shù)方面,越來(lái)越多的智能終端設(shè)備已經(jīng)開(kāi)始搭載了包括語(yǔ)音助手、圖像識(shí)別和光學(xué)字符識(shí)別(optical character recognition,OCR)提取在內(nèi)的各種深度學(xué)習(xí)模型。盡管這些模型增強(qiáng)了智能終端系統(tǒng)的功能性,但是同時(shí)也給系統(tǒng)中的測(cè)試帶來(lái)了新的挑戰(zhàn)。以目前廣泛使用的人工智能大模型技術(shù)GPT(generative pre-trained transformer)為例,其在復(fù)雜性、異構(gòu)性和不透明性方面都對(duì)測(cè)試提出了更高的要求。復(fù)雜性主要體現(xiàn)在人工智能系統(tǒng)內(nèi)部組件之間的相互依存關(guān)系和交互作用上,這種交互作用使得測(cè)試人員很難預(yù)測(cè)系統(tǒng)在不同條件下的行為,從而增加了系統(tǒng)中缺陷識(shí)別的難度。異構(gòu)性的挑戰(zhàn)則來(lái)自于系統(tǒng)集成了多種可能具有不同特征和行為的組件,導(dǎo)致測(cè)試結(jié)果存在差異和錯(cuò)誤。不透明性則指的是測(cè)試人員時(shí)常無(wú)法理解人工智能系統(tǒng)如何完成某些任務(wù)或產(chǎn)生特定輸出。在深度學(xué)習(xí)模型中,模型通常被視為“黑盒”,這使得在發(fā)現(xiàn)缺陷時(shí)準(zhǔn)確確定系統(tǒng)是如何作出特定響應(yīng)變得十分困難。
針對(duì)傳統(tǒng)黑盒測(cè)試出現(xiàn)的高成本、低效率等問(wèn)題,可以考慮優(yōu)化歷史算法模型,運(yùn)用微搜索算法思想來(lái)解決。測(cè)試用例編碼空間的多樣性、大規(guī)模和復(fù)雜性會(huì)造成測(cè)試用例生成需要高計(jì)算代價(jià),影響測(cè)試效率。借鑒微搜索算法思想,研究人員可以獲取測(cè)試用例的編碼空間,然后通過(guò)流形優(yōu)化獲取滿足約束的測(cè)試用例[84]。筆者所在的課題組研究了一種交互式測(cè)試用例的自動(dòng)生成方法[85],該方法通過(guò)遍歷應(yīng)用程序UI 界面中的可點(diǎn)擊視圖,自動(dòng)生成與用戶點(diǎn)擊交互相關(guān)的測(cè)試用例。當(dāng)應(yīng)用程序的UI界面顯示后,通過(guò)算法遍歷應(yīng)用程序UI 界面對(duì)應(yīng)的視圖樹(shù)中的所有視圖,并記錄其中可點(diǎn)擊視圖在視圖樹(shù)中的路徑,進(jìn)行智能的出入棧操作,獲得UI界面中所有可點(diǎn)擊視圖在視圖樹(shù)中的路徑信息的集合。對(duì)該路徑信息集合中的每一路徑信息分別生成對(duì)應(yīng)的測(cè)試用例,在測(cè)試用例中,根據(jù)待測(cè)試視圖在視圖樹(shù)中的路徑信息,在應(yīng)用程序UI界面中查找到該視圖,并觸發(fā)其點(diǎn)擊事件,即完成對(duì)該視圖的點(diǎn)擊交互測(cè)試,然后將操作對(duì)應(yīng)的代碼寫(xiě)入測(cè)試用例文件,生成該視圖對(duì)應(yīng)的測(cè)試用例。該方法還有待在主流的安卓應(yīng)用上進(jìn)行覆蓋率、誤報(bào)率等驗(yàn)證。
白盒測(cè)試方面,安卓系統(tǒng)需要在自己的Dalvik虛擬機(jī)上運(yùn)行而非JVM(Java virtual machine),如何更好地自動(dòng)生成安卓能執(zhí)行的單元測(cè)試用例依舊是一個(gè)技術(shù)空白。目前課題組開(kāi)始研究如何在JVM 上運(yùn)行安卓測(cè)試,并自動(dòng)化生成測(cè)試用例[86]。該研究通過(guò)演化算法生成隨機(jī)且覆蓋邊界計(jì)算、斷言以及測(cè)試數(shù)據(jù)多樣化的測(cè)試用例,并直接基于JVM 的環(huán)境構(gòu)建進(jìn)行安卓單元測(cè)試執(zhí)行的框架??蚣芸梢苑譃閮纱竽K,即測(cè)試用例生成模塊和測(cè)試用例執(zhí)行模塊。測(cè)試用例生成模塊是該測(cè)試框架的核心部分,主要負(fù)責(zé)生成可執(zhí)行的測(cè)試用例集。在該模塊中,首先需要對(duì)源測(cè)試文件進(jìn)行解構(gòu)分析,然后執(zhí)行演化算法,根據(jù)不同的操作,如產(chǎn)生新的測(cè)試分支、對(duì)原值進(jìn)行突變修改或直接隨機(jī)插入新的測(cè)試片段語(yǔ)句,來(lái)構(gòu)建一個(gè)獨(dú)立的測(cè)試用例集,直到生成一個(gè)完整的測(cè)試用例集。同時(shí),在安卓組件的構(gòu)造中會(huì)涉及到一些特殊的語(yǔ)句,如new 語(yǔ)句等,因此在初始化種群的過(guò)程中需要進(jìn)行安卓化語(yǔ)句替換,以滿足安卓組件的構(gòu)造要求。測(cè)試用例執(zhí)行模塊則是負(fù)責(zé)將測(cè)試用例集加載到指定的測(cè)試環(huán)境中進(jìn)行測(cè)試執(zhí)行,直到返回測(cè)試結(jié)果。在該模塊中,使用JunitCore 作為測(cè)試運(yùn)行器,查找到對(duì)應(yīng)的運(yùn)行器并采用該運(yùn)行器執(zhí)行測(cè)試用例。由于測(cè)試用例中可能包含需要依賴于安卓運(yùn)行環(huán)境的代碼片段,但預(yù)先設(shè)置的運(yùn)行器本身就是具有該安卓測(cè)試環(huán)境的,即使在JVM 中,也可以正常通過(guò)該第三方測(cè)試框架執(zhí)行用例。
另外,針對(duì)基于JVM 的單元測(cè)試執(zhí)行對(duì)安卓文件編譯的大量耗時(shí)問(wèn)題,課題組提出了一種新的技術(shù)方案,通過(guò)目標(biāo)信息插樁和預(yù)先設(shè)置的靜態(tài)類初始化測(cè)試用例語(yǔ)句直接執(zhí)行安卓語(yǔ)句,從而避免動(dòng)態(tài)編譯過(guò)程。這種方案本質(zhì)上采用了hook 技術(shù),通過(guò)測(cè)試容器的靜態(tài)接口獲取測(cè)試語(yǔ)句運(yùn)行。與直接執(zhí)行字節(jié)碼形式的單元測(cè)試相比,該方法可以避免安卓文件編譯的大量耗時(shí),并且能夠更快速地執(zhí)行測(cè)試用例。課題組計(jì)劃將用例生成算法和測(cè)試容器開(kāi)發(fā)成可直接執(zhí)行的Gradle 插件,并通過(guò)對(duì)幾款主流開(kāi)源應(yīng)用進(jìn)行逆向技術(shù)測(cè)試和驗(yàn)證優(yōu)化,以證明該技術(shù)方案的效果。如果達(dá)到預(yù)期目標(biāo),還計(jì)劃將該用例生成算法和測(cè)試容器應(yīng)用到谷歌應(yīng)用商店上的主流應(yīng)用安裝包,以進(jìn)一步優(yōu)化測(cè)試效率和準(zhǔn)確性。
隨著人工智能技術(shù)的持續(xù)發(fā)展,人們可以利用更多的數(shù)據(jù)和更先進(jìn)的技術(shù)來(lái)訓(xùn)練更復(fù)雜的人工智能模型。這些模型通常使用數(shù)以億計(jì)的參數(shù),并依托于龐大的訓(xùn)練數(shù)據(jù)集,可以提供更高的準(zhǔn)確率和泛化能力。該能力可以為自動(dòng)化測(cè)試等需要處理大量數(shù)據(jù)和高復(fù)雜性任務(wù)的應(yīng)用場(chǎng)景提供非常重要的幫助。同時(shí),這些模型也可以通過(guò)訓(xùn)練數(shù)據(jù)的深度學(xué)習(xí)來(lái)形成更強(qiáng)的智能化和自適應(yīng)性,能夠更好地適應(yīng)復(fù)雜的測(cè)試數(shù)據(jù)和編碼場(chǎng)景。
對(duì)于黑盒測(cè)試,首先,針對(duì)傳統(tǒng)的測(cè)試用例設(shè)計(jì)方法需要大量的人力和時(shí)間,并且難以保證覆蓋所有功能點(diǎn)的痛點(diǎn),人工智能大模型可以充當(dāng)測(cè)試想法生成器,根據(jù)測(cè)試人員提供的信息,提供新的測(cè)試用例設(shè)計(jì)思路和建議,從而幫助測(cè)試人員更好地設(shè)計(jì)測(cè)試用例,并覆蓋更多的功能點(diǎn)。如基于GPT-3模型的ChatGPT 已被應(yīng)用到很多領(lǐng)域,其支持在用戶的提示下,生成所需要的任何專業(yè)想法,可以有效幫助用戶擴(kuò)展或優(yōu)化思路[87]。雖然ChatGPT 目前還沒(méi)有被廣泛應(yīng)用到測(cè)試領(lǐng)域,但依舊是一個(gè)值得期待的研究方向。
其次,針對(duì)自動(dòng)化測(cè)試用例的生成通常需要大量的時(shí)間和經(jīng)驗(yàn)的痛點(diǎn),人工智能大模型可以為測(cè)試人員提供有關(guān)自動(dòng)化測(cè)試用例生成的應(yīng)用程序和工具,以及最佳實(shí)踐和建議,快速生成自動(dòng)化測(cè)試用例,提高測(cè)試效率和測(cè)試質(zhì)量。Mathur等人[88]結(jié)合了T5(transfer text-to-text transformer)模型的自然語(yǔ)言理解和GPT-3 的自然語(yǔ)言生成來(lái)自動(dòng)生成用例。通過(guò)將微調(diào)的T5 會(huì)話上下文知識(shí)應(yīng)用到GPT-3 模型,可以準(zhǔn)確識(shí)別相關(guān)的測(cè)試關(guān)鍵字,在沒(méi)有任何人為干預(yù)的情況下快速生成測(cè)試用例。不過(guò)由于訓(xùn)練集不足等原因,該模型并未覆蓋所有軟件測(cè)試場(chǎng)景。但該研究證明了從對(duì)話中生成測(cè)試用例的可行性,后續(xù)研究的關(guān)鍵是提高模型生成的測(cè)試用例的準(zhǔn)確性和完整性。
最后,針對(duì)難以實(shí)現(xiàn)全自動(dòng)化的痛點(diǎn),人工智能大模型可以通過(guò)自注意力機(jī)制來(lái)處理輸入的測(cè)試數(shù)據(jù),更好地理解測(cè)試用例的自然語(yǔ)言描述,并幫助測(cè)試工具準(zhǔn)確識(shí)別下一步采取的期望行動(dòng)。此外,人工智能大模型可以被微調(diào)以識(shí)別特定領(lǐng)域的編程語(yǔ)言,從而更好地理解測(cè)試用例和被測(cè)軟件的上下文。Zimmermann 等人[89]提出了使用GPT-3 來(lái)進(jìn)行軟件測(cè)試,并演示了Transformer 架構(gòu)應(yīng)用于解釋自然語(yǔ)言測(cè)試用例和指導(dǎo)被測(cè)應(yīng)用程序的全過(guò)程。由于模型訓(xùn)練的成本原因,他們選擇較為簡(jiǎn)單的應(yīng)用進(jìn)行基礎(chǔ)實(shí)驗(yàn)。結(jié)果表明GPT-3 能夠以最小人工測(cè)試成本完成測(cè)試用例,這也側(cè)面驗(yàn)證了使用GPT-3進(jìn)行自動(dòng)化測(cè)試以消除需要手動(dòng)編寫(xiě)和適配測(cè)試用例成本的可行性。
與黑盒測(cè)試一樣,如何利用人工智能大模型完善測(cè)試技術(shù)也是白盒測(cè)試需要關(guān)注的重點(diǎn)。針對(duì)程序代碼語(yǔ)義理解難的問(wèn)題,人工智能大模型可以通過(guò)學(xué)習(xí)程序代碼的語(yǔ)義和結(jié)構(gòu),更好地理解代碼的含義和功能,從而幫助測(cè)試人員在白盒測(cè)試中發(fā)現(xiàn)潛在的問(wèn)題。Prenner 等人[90]研究了基于GPT-3 的編程語(yǔ)言預(yù)訓(xùn)練模型CodeX。實(shí)驗(yàn)結(jié)果表明CodeX 在自動(dòng)程序修復(fù)方面相比于其他技術(shù)的歷史工作(DeepDebug[91]、CoCoNuT[92]、CURE[93])有著最高的準(zhǔn)確率。與符號(hào)執(zhí)行類似,自動(dòng)程序修復(fù)技術(shù)的可靠性和穩(wěn)定性主要依賴于工具對(duì)程序代碼語(yǔ)義的理解。人工智能大模型在自動(dòng)程序修復(fù)上的成功也一定程度啟發(fā)了符號(hào)執(zhí)行相關(guān)的自動(dòng)化測(cè)試工作。
針對(duì)深度模型或人工智能如何測(cè)試,如何提高人工智能測(cè)試的有效性問(wèn)題,研究人員可以探索一種新的方法,即建立一種以人工智能為主導(dǎo)的測(cè)試框架,讓人工智能測(cè)試人工智能。針對(duì)模型解釋性問(wèn)題,該框架應(yīng)可以對(duì)其內(nèi)部結(jié)構(gòu)進(jìn)行分析和解釋。通過(guò)觀察模型的輸入、中間層和輸出,了解模型是如何進(jìn)行預(yù)測(cè)的,從而更好地理解其行為。針對(duì)特征選擇問(wèn)題,該框架應(yīng)可以通過(guò)分析不同的輸入和中間層特征來(lái)確定哪些特征對(duì)于預(yù)測(cè)最重要。這有助于優(yōu)化測(cè)試集,提高測(cè)試覆蓋率。對(duì)抗樣本是指對(duì)模型輸入作出微小但有意義的修改,以使模型產(chǎn)生誤差。針對(duì)對(duì)抗樣本檢測(cè)問(wèn)題,該框架應(yīng)可以檢測(cè)和識(shí)別對(duì)抗樣本,從而增強(qiáng)模型的魯棒性和健壯性。而對(duì)于問(wèn)題定位難這個(gè)痛點(diǎn),如果模型在某些測(cè)試用例上表現(xiàn)不佳,該框架應(yīng)可以幫助定位問(wèn)題所在。通過(guò)分析模型的輸入和中間層狀態(tài),確定模型在哪些情況下會(huì)出現(xiàn)錯(cuò)誤,并采取相應(yīng)措施進(jìn)行修復(fù)。
在智能終端軟件開(kāi)發(fā)過(guò)程中,軟件測(cè)試是必不可少的環(huán)節(jié)。測(cè)試結(jié)果的準(zhǔn)確度直接決定軟件研發(fā)品質(zhì)。本文全面概述了以安卓為代表的智能終端自動(dòng)化測(cè)試技術(shù)和工具。黑盒與白盒是兩種不同的軟件測(cè)試技術(shù),相互補(bǔ)充且缺一不可。測(cè)試過(guò)程中需要進(jìn)行白盒測(cè)試驗(yàn)證邏輯結(jié)構(gòu)是否正確,軟件安全是否達(dá)標(biāo),也需要黑盒測(cè)試檢驗(yàn)功能是否正確,系統(tǒng)是否穩(wěn)定。目前,智能終端軟件測(cè)試已經(jīng)能夠?qū)崿F(xiàn)較為精準(zhǔn)的質(zhì)量控制。然而,隨著智能終端軟件和信息技術(shù)的不斷進(jìn)步,無(wú)論是黑盒測(cè)試還是白盒測(cè)試,都需要不斷研究和創(chuàng)新來(lái)推動(dòng)智能終端行業(yè)的發(fā)展。隨著智能終端自動(dòng)化測(cè)試技術(shù)的不斷完善,未來(lái)將有越來(lái)越多的測(cè)試場(chǎng)景可以被自動(dòng)化,并且自動(dòng)化成本也將降低,自動(dòng)化測(cè)試的精確性也將逐步提高,最終達(dá)到高可靠、強(qiáng)穩(wěn)定的智能終端測(cè)試最佳實(shí)踐。