?

安卓智能終端自動化測試技術綜述

2024-01-11 13:14雷豐強劉方青
計算機與生活 2024年1期
關鍵詞:污點測試用例安卓

曹 捷,黃 翰+,雷豐強,劉方青

1.華南理工大學 軟件學院,廣州 510006

2.微科智檢(佛山市)科技有限公司,廣東 佛山 528000

隨著終端影像技術和處理器芯片技術的不斷進步,移動智能終端正步入高速發展的時代。據中國信通院[1]發布的數據,2022 年中國智能移動終端用戶規模突破12 億人?;仡欀悄芙K端的歷史,1994 年IBM 發布的Simon被公認為是第一款智能手機,其搭載的ZOLUS 系統只有一個第三方應用程序,雖然現在看來有些笨重,但它敲開了智能終端系統的大門。2007 年1 月9 日,蘋果公司發布了基于Objective-C、C、C++語言編寫的閉源類Unix 系統iOS(iPhone OS)系統。同年11月5日,谷歌公司推出了首個為智能移動終端開發的開源安卓(Android)操作系統。由于安卓操作系統的開源性,自發布以來一直占據了市場的主導地位,目前安卓系統已經擁有超過80%的市場份額和10 億臺活躍設備[2]。安卓系統的開放源代碼特性也促進了安卓系統建立起強大的生態圈。我國的一流智能手機廠商全部采用基于安卓系統開發的自研操作系統,如小米的MIUI[3]、魅族的Flyme[4]等。同時,安卓系統不斷引入新功能并進行優化,例如人工智能和虛擬現實等技術,從而滿足用戶需求并保持市場競爭力。

智能終端系統的安全性和質量是至關重要的,而軟件測試是確保這一目標的關鍵[5]。在智能終端系統投入使用之前,必須對可能出現的問題進行檢測,并通過相關技術手段對問題進行排除。通常情況下,軟件測試占整個軟件開發工作量的40%~50%[6]。如何高效地進行智能終端測試以保障系統的可靠性和穩定性已經成為企業面臨的重要問題之一。

如今越來越多的惡意應用程序利用智能終端系統的漏洞來竊取用戶信息,進而獲取用戶的精準畫像、突破系統限制并最終促進交易轉化[7]。近期,反病毒軟件公司卡巴斯基正式開展對某大型購物應用程序(application,App)的調查。調查發現該App 的安裝程序中含有惡意代碼,可以利用安卓系統漏洞安裝后門并獲得未經授權的用戶數據和通知信息,以達到獲客、促交易、提高活躍度三個目的[8]。由于用戶量過億的大型應用都會利用其智能終端載體的漏洞來牟利,有必要對智能終端領域做一次全面的自動化測試技術總結分析,供研究人員隨時參照相關內容,方便開展后續的研究工作。

為了梳理面向智能終端自動化測試技術發展現狀,本文首先通過“Android auto test”“iOS auto test”等關鍵詞檢索與綜述主題相關的論文。然后對相關論文進行了人工篩選,通過分析論文的題目、關鍵字和摘要,識別并移除與綜述主題無關的論文。最后根據確定的文獻中的引文,再次補充相關的論文。需要注意的是,關于iOS系統的自動化測試相關技術論文占比低,大多數有關文獻都是以跨平臺測試框架出現[9-11]。

綜合研究iOS 相關文獻后發現,iOS 系統的閉源特性導致相關技術和工具覆蓋面相對較少,但也因其閉源而在安全性上普遍優于安卓系統[12]。蘋果官方市場AppStore 是iOS 開發者發布應用程序的唯一途徑[13]。在提交應用程序之前,開發者需要向蘋果注冊并進行隱私和安全違規測試。這個長達兩周的審查過程可以有效防止黑客編寫惡意應用程序并在商店出售。開發者需要提供身份信息以完成注冊,并將其嵌入到應用程序中。這種數字簽名流程旨在確保應用程序開發者和應用程序的身份都不會被修改或篡改。通過認證流程,iOS 鼓勵軟件開發人員制作高質量的應用程序。一旦應用程序提交并通過蘋果公司認證,任何修改該應用程序的嘗試都會打破數字簽名封條。最后,只有符合許可協議的應用程序才能被接受并在AppStore中發布。因此,在iOS應用程序開發和發布過程中,注重應用的隱私和安全測試是十分必要的。

安卓系統的開源和自由度理念雖然帶來了很多好處,但也導致了其在安全性方面相對被動。與iOS不同[14],安卓不要求應用程序開發者向Google Play注冊或獲得谷歌頒發的簽名證書,這使得開發人員可以為應用程序創建任意數量的簽名證書。同時,攻擊者可以在互聯網的任何網站上發布未經谷歌審核的應用程序[15],從而利用該開放生態系統傳播有害軟件。盡管谷歌試圖防止黑客篡改合法應用程序,但是依然很難確保應用程序開發人員不會創建匿名證書或避免被谷歌捕獲。此外,黑客還可以使用著名公司名稱欺騙用戶,將公司名稱放入證書中,在合法應用程序中插入惡意代碼并創建特洛伊木馬,這是Android最大的安全問題之一。

除了iOS 和安卓外,其他諸如HarmonyOS[16]、FuchsiaOS[17]等的整體分層架構和接口定義與安卓系統類似,但它們的生態系統還未完全建立起來。因此,本文將以安卓智能終端為主要研究對象,探索該領域未來潛在的發展方向,并對相關技術和工具方法進行綜述。

首先,本文從安卓系統的應用結構出發,介紹架構特點、關鍵組件以及相關的運行環境。然后,以黑盒和白盒作為安卓智能終端自動化測試技術的分類標準,詳細討論了自動化測試技術和工具的研究進展。最后,對安卓智能終端自動化測試技術所面臨的挑戰和未來潛在的發展方向進行了分析和展望。

1 安卓智能終端軟件系統簡介

1.1 安卓系統及應用結構

安卓[18]是智能終端設備上最受歡迎的平臺之一,作為開源的智能終端操作系統,它擁有眾多應用軟件開發者和用戶。如圖1所示,安卓系統架構包括五個層次,從上往下分別為應用程序層、應用程序框架層、系統運行庫層、硬件抽象層以及Linux內核層。

圖1 安卓平臺架構Fig.1 Architecture of Android system

應用程序層包括一些預裝于安卓系統中的應用程序,例如短信、相冊、地圖以及視頻播放器等。該層還包括開發者自身通過使用應用程序框架層提供的API(application programming interface)開發的應用程序。

應用程序框架層為應用程序層提供API接口,涵蓋了應用程序開發過程中需要使用的各種功能。新的框架版本需要幾個月的時間才能在安卓設備上占據主導地位,因此大多數設備都運行舊版本的框架。這意味著安卓開發人員必須花費大量精力使自己的應用程序與較舊的框架版本兼容,其引發的跨版本兼容問題也是造成安卓應用穩定性不足的重要原因。

系統運行庫層包含了一系列可以供安卓系統各組件使用的C/C++靜態庫,這些庫通過應用程序框架層為安卓應用開發者提供相應功能服務。安卓運行環境由Dalvik 虛擬機[19]和基礎的Java 類庫構成。由于Dalvik 每次執行都需要進行字節碼到機器碼的轉換,導致應用程序運行速度較慢。同時Dalvik的垃圾回收機制效率不高,容易引起系統卡頓,使得系統的穩定性降低。從安卓5.0 開始,針對上面所提及的問題,谷歌在系統運行庫層上進行了根本性的更改,引入了ART(Android runtime),這是一種新的運行時環境,可以顯著提高應用程序性能[20],并最終取代Dalvik虛擬機。

硬件抽象層是位于操作系統內核與硬件電路之間的接口層,其目的在于將硬件抽象化。為了保護硬件廠商的知識產權,它隱藏了特定平臺的硬件接口細節,為操作系統提供虛擬硬件平臺,使其具有硬件無關性,可在多種平臺上進行移植。

Linux 內核層包括了以Linux 內核為基礎的安卓操作系統和各種驅動程序,是安卓系統將底層硬件和系統服務連接起來的核心與基礎。

安卓應用程序主要是用Java 語言編寫。Java 源代碼首先被編譯成Java 字節碼,然后通過Dalvik 編譯器將Java字節碼轉換成Dalvik字節碼,并以.dex格式存儲在機器可執行文件中。應用程序最終以apk文件的形式分發,其中包含了dex 文件、本機代碼和其他應用程序資源的壓縮文件夾。

除了原生的安卓系統,智能終端設備提供商為了提升用戶體驗和產品銷量,通常會基于原生安卓系統開發自己的定制化操作系統,并將操作系統的升級速度作為賣點之一。然而,各廠商的定制化程度和質量不同,導致智能終端設備的可靠性和穩定性參差不齊。因此,對軟件進行全面可靠的測試顯得尤為重要。

1.2 安卓自動化測試簡介

軟件測試是保證軟件系統質量的最重要的分析性措施之一?,F有的軟件測試方法基本上可以分為黑盒測試和白盒測試。在黑盒測試中,測試用例是根據被測程序的需求規范確定的,而在白盒測試中,測試用例是從內部結構派生的。無論是哪種方法,自動生成測試數據都很困難。

在過去的幾年里,人們見證了移動應用業務的驚人增長,移動應用開發公司對自動測試移動應用工具的需求也與日俱增,這一領域的研究也隨之增多。由于多種原因,大多數研究人員和開發人員將重點放在安卓平臺上。首先,安卓目前在移動市場占據最大份額,使得該平臺對業內從業者極具吸引力。其次,由于設備和操作系統版本的碎片化,安卓應用程序經常會遇到跨平臺和跨版本的不兼容問題,手動測試這些應用程序的成本特別高,因此其自動化測試技術具有十分重要的意義。最后,安卓平臺及其相關技術的開源特性,使其成為更適合學術研究人員的研究對象,可以更方便地訪問應用程序和底層操作系統。

盡管安卓應用程序主要由Java 編寫且基于用戶圖形界面(graphical user interface,GUI),但與Java 獨立的GUI 應用程序相比,其存在很大的不同,并表現出不同種類的缺陷。因此,現有的大多數Java 測試用例生成工具并不能直接用于測試安卓應用程序。為此,研究人員在此方面進行了大量的研究,并提出了多種針對安卓應用的測試用例生成技術和工具。如圖2所示,本文將從黑盒測試和白盒測試兩個方面對安卓智能終端軟件測試技術進行綜述。

圖2 安卓測試技術結構圖Fig.2 Android testing technology structure

2 面向黑盒的安卓智能終端軟件測試技術

黑盒測試,也稱為功能測試。在測試中,程序被視為一個無法打開的黑盒子,測試員模擬真實用戶對程序的使用場景,幫助發現可能存在的問題,確保程序的穩定性和可靠性。黑盒測試主要關注程序外部結構,不涉及內部的邏輯結構,主要針對軟件界面和軟件功能進行測試,以確保程序能夠按照需求規格說明書的規定正常使用,并能夠適當地接收輸入數據并產生正確的輸出信息。

2.1 用戶界面測試

用戶界面(user interface,UI)測試是安卓應用持續開發過程的重要組成部分。它的目的是檢查UI是否符合設計要求,每個UI的布局是否顯示正確,每個按鈕的功能是否按預期執行。根據Alegroth 等人[21]提供的GUI測試工具分類,UI測試方法可以分為三代。

第一代UI測試技術使用在手動交互過程中記錄的精確坐標點,并錄制支持自動重放的測試用例來進行回歸測試。然而,由于存在對軟件自動化測試(automation testing,AUT)的UI 變化的魯棒性不足、對屏幕分辨率依賴性大等缺陷,這種方法有著極高的維護成本,因此被逐漸放棄。

第二代UI 測試技術通過UI 控件屬性和數值直接針對UI 模型進行操作。該方法對AUT 的UI 變化更具魯棒性,測試執行性能高且穩定,支持測試記錄和用例錄制。但是,第二代技術對需要訪問AUT 的底層GUI 庫依賴性強,因此對使用不同GUI API、不同編程語言編寫的AUT的適用性很差。同時對于動態UI,它的控件屬性和值可能會隨著時間的推移而發生變化,因此需要定期更新測試腳本,增加了測試維護成本。

第三代UI 測試技術使用圖像識別技術對UI 模型進行操作,也稱為可視化GUI 測試。該技術通過對用戶顯示器上呈現的圖形GUI 進行交互和斷言AUT的正確性,實現了高效、準確的UI測試。圖像識別技術能夠識別UI 控件的位置、大小、顏色、文本等屬性,從而模擬用戶對UI進行操作,并通過比對預期結果和實際結果來判斷測試是否通過。雖然該技術存在一定的誤差和測試維護成本,但其測試覆蓋范圍廣,能夠有效提高測試效率和測試質量。

2.1.1 基于系統控件屬性的自動化測試技術

常用的基于系統控件屬性的測試工具有Appium[22]、UI Automator[23]等,其中Appium是目前最為主流的框架和工具。如圖3 所示,Appium 的核心是一個Web服務器,可以接受來自客戶端的連接,監聽命令并在移動設備上執行,最終通過HTTP 響應來描述執行結果。Appium在執行腳本前會在服務端默認開啟兩個網絡端口,4723 端口接收Webdriver 請求,4724 端口則將執行命令發送到事先推送到安卓系統中的bootstrap.jar中,bootstrap.jar接收到命令請求后,調用底層的基礎測試框架來完成測試人員要求的測試指令。Coppola等人[24]對混合移動應用程序的測試用例所需的維護以及相關的脆弱性原因進行了評估。他們使用Appium 和一個可視化的工具對一個不斷版本迭代的應用程序進行測試,并觀察自動化測試用例腳本所需的變化。研究發現,每次軟件版本更新后,至少有20%的基于系統控件屬性的測試用例需要進行修改。而造成這些測試用例脆弱性的原因主要有以下幾點:控件屬性更改,開發者沒有為用戶界面元素提供唯一標識符,定位器僅基于組件文本作判斷,組件排列被更改,組件被替換等情況。

圖3 Appium原理圖Fig.3 Appium schematic diagram

2.1.2 基于圖像識別的自動化測試技術

Airtest[25]是一個跨平臺的、基于圖像識別的UI自動化測試框架,適用于安卓智能終端的游戲和App的UI 測試工作。Airtest 使用圖像識別技術在當前安卓智能終端畫面中查找對應的圖片,然而圖像識別并不能達到人眼識別的準確度,它只能盡可能地尋找一個最符合預期的結果。這就導致了測試人員認為不存在的圖片,Airtest 認為存在,或者測試人員認為在畫面上一眼就能找到的內容,Airtest 認為不存在。因此圖像識別不是萬能的,它是有成功率的。假設一個腳本里有10 張圖片,每張圖片的識別成功率都能達到95%,但合算10 張圖片全部都正確識別的概率也不超過60%。因此基于圖像識別的自動化測試技術的核心在于提升圖片識別算法的準確率。Li 等人[26]設計一個基于YOLOv3(you only look once v3)的輕量級卷積網絡,用于識別手機截屏中的UI 頁面和按鈕等特征,并建立了一個有向圖模型存儲訪問的UI 頁面及切換關系。該方法可以快速檢查UI 是否符合設計要求,模擬測試用戶點擊行為。研究結果顯示,該方法的UI頁面和按鈕覆蓋率超過85%。

表1 從代表工作、門檻、性能、失敗風險、適用場景和研究方向幾個方面對三代用戶界面測試技術進行了概括總結。

表1 安卓UI測試工具比較Table 1 Comparison of Android UI testing tools

2.2 模糊測試

模糊測試通過向程序或系統輸入隨機、不合法或異常的數據,刻意造成輸入錯誤,推動程序或系統進入不合理的狀態,從而觸發潛在的漏洞或錯誤,尋找漏洞并加以修復。模糊測試的主要流程如圖4 所示。Monkey[27]是一款安卓自帶的命令行測試工具,通過模擬用戶點擊滑動屏幕、輸入文本、按鍵等操作,Monkey 能夠快速有效地檢測應用程序的穩定性和魯棒性。Monkey支持對安裝在模擬器或手機設備上的應用程序包進行測試,并可根據用戶設置的包、注入事件等約束,限制測試范圍。Monkey 還能夠在程序崩潰、無法響應或出現異常時立即停止并報告錯誤。盡管Monkey 能夠生成大量事件序列,但由于其隨機性較強,無法執行自定義的特定事件序列,并且對如來電或地理位置變化等系統級事件的支持不夠強。

圖4 模糊測試的幾個階段Fig.4 Several stages of fuzz testing

Machiry 等人[28]提出了一個使用“觀察-選擇-執行”原理來高效地生成測試用例的系統Dynodroid。通過選擇頻率、隨機或基于偏好三種策略,Dynodroid捕獲應用程序當前的空間列表并映射產生一組UI事件。同時Dynodroid 通過插樁監聽系統事件的注冊和注銷,并把被注冊的事件加入可執行系統事件的集合中。然后,工具會選擇一個事件來執行并檢測應用的狀態。最終,在滿足策略指定條件的時候停止執行。與Monkey 相比,Dynodroid 是一種向導式隨機測試工具,它可以生成用戶界面事件和更多的系統級事件,并且支持策略性的停止條件而非固定注入次數。但Dynodroid 僅支持在比較老的安卓2.3版本模擬器上運行,這在現今主流版本中顯得有些落后,因此在適用性方面不如安卓原生的Monkey工具。

Li 等人[29]提出了基于狀態轉換模型的UI 引導的測試輸入生成工具Droidbot。Droidbot的模型會根據實際的程序運行信息動態變化,并基于該轉換模型生成基于深度優先策略的測試用例。此外,用戶還可以編寫腳本來定制探索策略,或通過擴展事件生成模塊來集成自己的測試用例。Droidbot 還提供了一種新的測試用例有效性評估方法,能夠為每個測試用例生成調用堆棧跟蹤,其中包含由測試用例觸發的App方法和系統方法,以便使用調用堆棧作為一個近似度量來量化測試用例的有效性。Droidbot 具有與Monkey 類似的易用性和適用性,同時提供了包括基于模型的輸入生成和可擴展腳本編寫等高級特性,類似于DynoDroid等其他工具。

Jamrozik 等人[30]提出并開發了工具DroidMate。DroidMate 通過在運行時重復讀取設備的頁面控件信息并監視對安卓API 方法的調用來動態生成測試數據。與DroidBot 類似,DroidMate 也試圖探索不同的UI元素,但前者采用的是深度優先策略,后者則采用偏隨機游走策略。從實驗結果看,DroidMate 有著更好的性能并且可以在短時間內達到更高的覆蓋率。

進一步的Li 等人[31]提出了Humanoid。Humanoid是一個能夠學習人類如何與移動應用程序交互,然后像人類測試人員一樣使用所學的模型來指導測試生成的GUI 測試生成器。借助從人類與設備交互中學習到的知識,Humanoid 可對GUI 頁面上可能的交互進行優先級排序,并生成能夠導致重要狀態的測試用例。該工具核心是深度神經網絡模型,預測哪些UI 元素更容易與人類用戶交互,并指導測試用例生成過程。與前面所提及的幾種工具不同,Humanoid利用了GUI 的可視化信息,這是用戶探索應用程序時的重要參考,也讓測試執行過程更加貼近于用戶操作。

針對應用存在部分特殊交互邏輯場景而導致測試效率低下和覆蓋率不理想的問題,葉佳等人[32]提出了結合先驗知識和測試路徑約束的規則驅動測試輸入生成工具RDTA(rule-driven testing platform for Android)。RDTA 內置驅動引擎,可根據實時界面元素來篩選出特定符合規則的子集。這些規則定義了遍歷子集合的順序、驅動事件的操作方式以及子集合在整個集合中的優先級。相比其他測試工具,RDTA 可以針對性地快速進入具有復雜前置操作步驟的頁面,避免因其引起的狀態爆炸問題。

Adamo 等人[33]提出了一種強化學習方法來實現安卓應用程序的GUI 自動化測試。在缺少預先定義的抽象模型前提下,他們采用一種基于Q_Learning的測試生成算法,通過探索被測應用程序的GUI,根據存儲在Q-table 中的Q 值來選擇可獲得最大收益的動作并執行。此外,瑞典開發商King 使用人工智能技術訓練人工智能測試工具,該工具結合了蒙特卡洛樹搜索算法、自動啟發式構建算法和增強拓撲的神經元演化算法來模擬人類交互并運用于自動化測試中。

雖然上述提及了許多新興的模糊測試工具,但目前除了Monkey 以外,Dynodroid、Droidbot、DroidMate 及Humanoid 都并未廣泛應用于智能終端的集成測試體系中。這是由于這些新興的模糊測試技術都依賴于特定的安卓版本,無法支持新版本中出現的全新接口或修改后的接口。此外,安卓系統也在不斷更新自身的接口權限,部分工具使用的動作事件注入技術在后續的安卓版本中被視為非法權限操作,這也使得這部分工具無法在新版本的安卓系統中正常使用。表2 對安卓模糊測試方法中常用的工具在原理、性能、適用性、準確性等方面進行了概括和總結。

表2 安卓模糊測試方法比較Table 2 Comparison of Android fuzz testing approaches

綜上所述,UI 測試和模糊測試等面向黑盒的安卓智能終端軟件測試技術在可靠性和穩定性方面都存在著不可避免的缺陷。UI測試由于自身對于控件或圖片強關聯,使其在測試執行的穩定性和復用率方面效率低下。模糊測試則因為無法快速支持新版本,被認為在可移植性方面無法提供可靠的測試執行。針對這些缺陷需要考慮引入其他新興技術,如人工智能[34]、自適應識別[35]等。

3 面向白盒的安卓智能終端軟件測試技術

白盒測試主要用于檢測軟件編碼過程中的錯誤,而程序員的編程經驗、對編程軟件的掌握程度、工作狀態等因素都會對編程質量造成影響,導致代碼錯誤。雖然普通的語法錯誤在軟件調試時很容易發現,但是邏輯順序、執行路徑方面的錯誤在調試時很難被走查覆蓋。通過白盒測試,可以檢測編程代碼中的每條分支和路徑,并找到隱藏在代碼中的錯誤,對代碼進行全面的測試,達到優化的目的。

安卓應用程序是基于Java 開發的,它們被編譯成Dalvik字節碼,也有多種框架可以將Dalvik字節碼轉換成更熟悉、更易于分析和檢測的中間文件格式(例如Java字節碼、Jimple和Smali等)。因此,人們對安卓應用程序的靜態分析和白盒測試技術進行了大量的研究。本文將從面向對象的單元測試、污點分析、第三方庫檢測和安卓權限檢測四個方面對白盒的安卓智能終端軟件測試技術進行綜述。雖然靜態污點分析、第三方庫檢測和權限檢測等白盒測試技術不是嚴格意義上的自動化測試技術,但它們是安卓安全測試的重要組成部分。同時這些技術可以與其他自動化測試技術相結合,如可以結合污點分析和模糊測試,在模擬測試輸入的同時監控安全信息流,形成一個完整的包含可靠性、穩定性和安全性的安卓測試鏈。故本文將這三種技術視為自動化測試的一部分,并進行了簡單的歸納總結,方便讀者理解全面的安卓測試鏈并幫助應用到實際項目中。

3.1 面向對象的單元測試技術

隨著軟件迭代速度的加快,開發工程師在持續集成和敏捷開發的大背景下,需要快速發現軟件缺陷,針對新的代碼執行相應的單元測試。然而,自動化測試最大的挑戰在于需求變化,需要修改、擴展、調試自動化腳本以適應新的功能。如果自動化測試的投入產出比太低,其價值也失去意義。因此,越來越多的學者和企業工程師投入到實現自動生成單元測試用例的方法開發研究當中。圖5 展示了單元測試用例自動生成的四個主要研究方向。

圖5 測試用例生成的各種技術Fig.5 Various techniques of test case generation

3.1.1 基于隨機的測試用例自動生成

隨機測試是最基本的單元測試生成技術之一。當定向測試所需的時間過長或問題的復雜性使得無法測試每個組合時,人們往往會優先考慮進行隨機測試?;陔S機的測試用例自動生成可以在短時間內達到較高的覆蓋率,并且生成的測試用例可以快速應用于持續集成流程中進行回歸測試。

Artho 等人[36]介紹了隨機測試原理:在面向對象的單元測試中,測試用例由一系列方法調用組成,每個步驟調用一個對象object 的方法method,表示為o.m(T1v1,T2v2,…,Tnvn),其中調用方法傳入的Tivi是對應參數類型的值。生成一個隨機測試用例,首先是創建object 使它可以接受method 的調用,其次構建Tivi類型的值作為調用method 的參數,對method 的成功調用將返回一個result,該值可在后續測試中用作其他方法的參數,如果調用過程中出現異常,則認為method沒有通過測試。

由于隨機生成算法沒有考慮測試用例之間的關系以及測試用例對受測系統的影響,從而導致測試用例的重復性和低效性。因此,基于隨機的測試用例生成方法,需要在考慮測試用例的全面性和適度性的同時,結合模型驅動、覆蓋分析、數據挖掘等相關技術增量式、智能化地生成測試用例,從而實現更高效率和準確率的測試。

Chen等人[37]介紹了一種增強形式的隨機測試——自適應隨機測試(adaptive random testing,ART),它尋求在輸入空間內更均勻地分布測試用例。同時實驗證明ART 相較于傳統的隨機測試可以提升50%的缺陷檢測效率。Csallner 等人[38]提出了一種針對Java代碼的無向隨機測試工具JCrasher。相比其他ART工具,JCrasher 對被測軟件的構造沒有任何假設和限制,它能夠自動測試多個方法并執行大量測試用例,從而提高軟件測試的覆蓋率和精度。但是,JCrasher也存在一些問題,例如忽略異??赡芙沂镜腻e誤,以及創建冗余和非法輸入,這些問題也導致其執行效率較低。Pacheco等人[39]提出了一種用于改進隨機測試生成的技術。該技術可以通過測試用例執行過程中的反饋來增量地構建輸入,在構建輸入后,根據過濾器進行過濾從而拋棄冗余、非法或違反預設規則的輸入。同時該技術被應用到基于反饋定向的單元測試用例工具Randoop上。Randoop相較于JCrasher,能在相同的被測庫下實現更高的覆蓋率,發現更多的有效問題并減少冗余非法輸入。Yatoh等人[40]研究了反饋定向隨機測試生成的特點,并提出了一種利用過度反饋限制測試多樣性的方法。首先,證明了反饋定向生成算法的反饋回路是一個正反饋回路,會放大候選值池中出現的偏差,從而過度指導生成并限制生成測試的多樣性。因此,限制反饋的數量可以提高生成測試的多樣性和有效性。其次,提出了一種反饋控制的隨機測試生成方法,通過對反饋的主動控制來提高生成測試的多樣性。與原來的反饋導向算法相比,該方法至少提高了78%的分支覆蓋率。

3.1.2 基于符號執行的測試用例自動生成

符號執行是一種功能強大的程序分析技術,其概念誕生于20 世紀70 年代,可以同時探索一個程序在不同輸入下可能采取的多種程序路徑。由于其計算需要大量的處理能力和系統內存,在最近幾年才被實踐運用于測試用例生成。

符號執行將程序的執行路徑表示為對輸入值的約束,如圖6 所示[41]。其中動態符號執行是一種常見的符號執行方法,它通過系統化地遍歷程序的各個路徑來生成新的測試用例。在每次迭代中,它會否定路徑約束中的一個分支條件,并使用約束求解器為該路徑生成一個新的測試用例。這類方法主要的目標是生成特定的輸入數據,需要手工構建相應的測試驅動程序。另一種符號執行方法是靜態符號執行,它在每個分支節點上更新路徑條件,然后使用約束求解器判斷路徑是否可行。如果路徑不可行,就回溯到上一個節點,因此只執行可行路徑。然而,由于安卓框架非常復雜,而且是用多種語言構建,很難將符號執行技術應用于面向框架的安卓應用。此外,安卓框架不能在安卓設備/模擬器之外執行,這也成為使用符號執行技術測試的一大難題。

圖6 符號執行示例圖Fig.6 Symbol execution example diagram

Mirzaei 等人[42]提出了一種適用于安卓應用程序的新符號執行方法。該方法擴展了JPF(Java Pathfinder),并結合安卓系統的調用圖模型生成測試用例。該方法通過創建存根、編譯和運行應用程序、創建模擬類來解決路徑分歧,并自動生成模擬用戶行為的驅動程序,從而有效地提高符號執行的效率。Luo 等人[43]提出了一種用于安卓框架符號執行的路徑探索系統Centaur。為解決符號執行的狀態空間爆炸問題,Centaur使用了分階段符號執行的方法,在初始化階段運行,并使用微小污染分析的方式獲得來自惡意應用程序的變量識別作為符號輸入。同時Centaur 完整分析了中間件的服務接口方法,為安卓符號執行提供了完整的上下文,極大地提高了探索安卓路徑的準確率。Gao 等人[44]為安卓應用程序構建了一個動態符號執行引擎。引擎支持自動建模執行環境,自動推斷庫的表示,并通過多次運行相應的庫動態優化相應表示,以提高行為覆蓋率和緩解路徑分歧問題。此外,引擎支持上下文,可以為給定的上下文生成更精確的表達式,從而提高合成效率。該符號執行引擎相比JPF 可以在相同執行時間內覆蓋更多的分支目標。

綜合來說,近年來研究人員提出的面向安卓的符號執行優化方向,主要集中于約束縮減、上下文理解、處理Android 特有的功能和特性等方法,這些方法可以緩解路徑爆炸問題并一定程度地提高測試效率。目前,雖然面向安卓的基于符號執行的測試用例自動生成方法相關工作已經在安卓應用程序的測試領域得到了一定的應用,但依然受限于路徑爆炸、安卓特性、跨應用程序路徑等問題。

3.1.3 基于搜索的測試用例自動生成

基于搜索的軟件測試(search-based software testing,SBST)是測試用例自動生成的一個子領域,最初由Harman 和Jones[45]于2001 年提出。SBST 的重點是元啟發式搜索算法和進化算法的使用,如爬山算法(hill-climbing,HC)、模擬退火算法(simulated annealing,SA)、遺傳算法(genetic algorithm,GA)等。這些基于搜索的算法每一個都強烈地依賴于所考慮問題的領域,并使用與問題領域相關的啟發式知識,各有優缺點[46]。SBST可以定義不同的適應度函數來針對不同的測試目標,從而允許將相同的基于搜索的總體優化策略應用于不同的測試用例生成場景。因此,問題的表示和適應度函數的定義是應用基于搜索的優化技術的兩個關鍵要素。在軟件測試領域應用最廣泛的算法如下所述。

爬山算法是一種局部貪心搜索算法,旨在目標函數的最大化。它從搜索空間隨機選擇的初始解開始,在每次迭代中研究當前解的鄰域,一旦出現更好的臨近解,就會取代當前的解決方案。然而,爬山方法可能會陷入搜索到局部最優解而不是全局最優解的問題。模擬退火算法基于退火的化學過程,允許在搜索空間周圍的限制條件下概率移動到較差的臨近解以避免局部極大值。然而,模擬退火算法也存在一些問題,如初始溫度設置問題和計算時間問題。遺傳算法是一種基于種群的搜索算法,由美國密執安大學的Holland 教授于1975 年提出,是一種通過模擬自然進化過程搜索最優解的方法。它創造并維持由染色體代表的個體群體,這些染色體按照選擇、突變和繁殖的規則進行進化。每個個體都接受一個環境適應性的度量,高適應值的個體通過交叉和變異得到一個新的群體,其中的個體可以更好地適應環境。算法將不斷迭代,直到群體進化形成問題的解決方案,或者迭代次數達到最大值。雖然爬山算法和模擬退火算法也可用于基于搜索的測試用例自動生成,但由于遺傳算法搜索空間更大、更容易跳出局部最優解等特點,在尋找全局最優解方面更具優勢。因此,遺傳算法被更廣泛地應用于基于搜索的測試用例自動生成中。

如圖7所示,遺傳算法在測試用例自動生成上的主要過程有以下幾步:首先,對待測程序進行靜態分析,獲取生成用例時所需要的參數信息(類型、數量、范圍等);其次,根據控制流程圖確定要進行測試的目標分支路徑;接著,根據測試要求構造適應度函數,利用插樁技術對被測代碼進行插樁,生成對應樁程序;最后,通過遺傳算法生成覆蓋目標路徑的測試用例。EvoSuite[47]是一個被廣泛使用的基于搜索的單元測試用例生成工具,支持使用常規遺傳算法、動態多目標排序算法(dynamic many-objective sorting algorithm,DynaMOSA)等,優化過程由一組個體適應度函數驅動,每個覆蓋目標都對應一個適應度函數,測試用例的編碼由可變長度的Java 語句序列組成,優化目標是找到一個最大化代碼覆蓋率的測試集[48]。EvoSuite具有高度的自動化、代碼覆蓋率高以及可解釋性強等優點,但也存在著無法完全檢測所有可能的執行路徑、無法支持安卓原生語句、生成的測試用例質量不穩定等缺點,這些缺點需要在實際應用中加以注意和克服。

圖7 SBST流程圖Fig.7 SBST flow chart

單一的未經過優化的智能算法往往存在固有缺陷,遺傳算法也不例外。在使用傳統遺傳算法生成單元測試用例時,常常會出現穩定性較差、計算量大、約束失效、早熟收斂等一系列問題。因此許多學者和機構都投入到了優化遺傳算法的研究中。目前,改進遺傳算法的應用大致可以分為四個方向:改進遺傳算子,改善適應度函數,融合其他算法,遺傳算法并行化。

改進遺傳算子:遺傳算法中有選擇算子、交叉算子和變異算子三種主要的遺傳算子控制著搜索過程。Zhu 等人[49]提出了三種基于約束的針對性改進SBST 遺傳算子。首先,針對選擇算子,使用符號執行技術來輔助選擇具有更多有用啟發式信息的測試用例。然后,基于約束的交叉算子對概率較大的測試用例進行重組,產生更好的后代個體。最后,利用基于約束的變異算子對測試用例進行改進,以滿足特定的約束條件。Cruz-Salinas 等人[50]提出了一種自適應算子進化算法。該算法定義了一種懲罰-獎勵機制,使個體根據算子的質量進化,再使用輪盤賭算法對算子進行重組,使其按質量成比例演化。這種方式可以加快收斂速度,豐富種群多樣性,并且不會陷入早熟收斂。另外,Doerr 等人[51]提出了一種使用冪律分布選擇的隨機突變率策略,這種新的變異算子在測試集函數中有著最優的性能。

改善適應度函數:Kim 等人[52]提出了基于局部優化算法(local optimization procedure,LOP)評估適應度函數的遺傳算法,用于解決進化過程中產生大量的候選解使得評估時間過長的問題。該方法在早期生成階段只使用部分邊緣子集計算解的近似適應度,并逐步增加邊緣子集直到精確擬合,有效減少了運行時間。楊瑞等人[53]提出了一種新的測試用例生成方法。該方法利用開發的可執行模型動態獲取運行時反饋信息,結合分散搜索技術自動生成測試數據,并創建預言信息。相較于傳統方法,該方法中的適應度函數計算代價較低,可以忽略不同數據類型的差異性問題,使其更具通用性。該方法充分利用運行時信息計算適應度,適用于多種數據類型的測試用例生成,是一種高效通用的測試用例自動生成方法。Wang等人[54]提出了一種改進的用戶偏好多目標遺傳算法(user-preference multi-objective optimization algorithm,UPMOA),將用戶偏好指標定義并集成到算法當中。該算法根據用戶對各種目標的偏好來評估特定解決方案的質量,并將指標分為需要最大化的有效性目標和需要最小化的成本目標。在均勻分布權重策略下,UPMOA 可以在問題復雜性不斷增加的情況下提高軟件性能。Xu 等人[55]提出了一種基于分支硬度的自適應適應度函數,通過建模吸收離散時間馬爾可夫鏈來度量程序中每個分支的預期訪問次數,通過啟發式地調整分支硬度參數,可以使生成測試用例的搜索硬度最小化。該方法比傳統適應度函數更加靈活。后續他們又提出了一種動態的適應度函數[56]來提高自動生成測試用例的分支覆蓋性能。

融合其他算法:Braione 等人[57]使用符號執行來生成描述程序路徑和輸入結構之間依賴關系的路徑條件,并將路徑條件轉換為優化問題,再使用基于搜索的技術生成實例化這些輸入的方法調用序列。該方法可以實例化從具有復雜數據結構的程序的符號執行派生的路徑條件,從而為依賴于復雜輸入的測試目標生成具體的測試用例。Kim 等人[58]提出了用深度神經網絡訓練一個雙深度Q網絡(double deep Qnetworks,DDQN)智能體,并代理學習SBST 的元啟發式算法,將SBST 理解為強化學習問題,通過不斷地迭代試錯從適應度函數的反饋中找到最優算法。Ayari 等人[59]提出了一種基于蟻群算法的進化方法來降低自動生成單元測試中的成本,使用概率密度估計技術指導連續輸入參數的搜索,并定義適應度函數用于衡量測試用例殺死突變體的程度?;谙伻核惴ǜ倪M的遺傳算法在迭代次數和搜索時間上,都優于標準的遺傳算法。Ji[60]引入了模擬退火算法,將環境適應度作為可變參數進行處理,并建立環境適應度與迭代次數直接的拉伸關系。同時引入輪盤賭選擇機制,保證產生的后代與環境適應度正相關,實現后代進化的可持續優化選擇。實驗結果表明,改進后的遺傳算法可以解決優化過程中易陷于局部最優、搜索初值依賴性等問題。張大林等人[61]提出了一種基于主動學習和預測引導的自動化測試工具Auto-Unit。AutoUnit 引入了缺陷預測算法模型,對待測文件池中的所有文件進行缺陷預測,然后對最可疑的文件進行測試用例生成,之后將實際測試用例執行結果反饋給缺陷預測模型并更新該預測模型,最后根據召回率判斷是否進入下一輪測試。與EvoSuite相比,AutoUnit能以更少的測試代價發現同等水平的代碼缺陷,有效地提高了測試效率。

遺傳算法并行化:遺傳算法的長時間運行與問題維數很大、需要定制運算符、復雜目標函數需要幾分鐘計算、處理大型數據集、大量非線性限制等原因有關。由于遺傳算法是基于種群的方法,所有候選解都可以并行處理,非常適合并行化。Paduraru等人[62]提出了一種分布式實現的遺傳算法,并設計了基于特定“概率”的適應度函數,即某些分支條件以某種順序出現,并使用它們指導測試走向尚未探索的領域。

3.1.4 其他測試用例自動生成

除了上文提到的方法,還有其他一些基于目標導向的方法來自動生成測試用例。Ferguson等人[63]提出了一種基于鏈式的自動生成軟件測試用例的方法。鏈式方法使用數據相關性分析來指導搜索過程。數據相關性分析能自動識別影響代碼執行的語句,鏈式方法則使用這些語句來準確生成測試用例。Korel等人[64]提出了一種基于斷言自動測試用例生成方法。該方法是鏈式方法的擴展,將斷言插入約束條件來識別違反斷言的測試用例,并利用其揭示程序中的錯誤。最終將查找違反斷言的程序輸入的問題簡化為查找執行選定語句的程序輸入的問題。表3 展示了不同面向對象的單元測試技術對比。

表3 面向對象的單元測試技術對比Table 3 Comparison of object-oriented unit testing techniques

綜上所述,目前已實現的自動生成單元測試用例技術在覆蓋標準上,選擇的都是條件覆蓋、語句覆蓋、分支覆蓋這三種標準,而忽略了路徑覆蓋。這是由于路徑覆蓋的測試用例生成存在路徑爆炸、循環控制流處理困難、分支語句嵌套復雜、動態路徑無法探測等問題,使得路徑覆蓋用例生成技術無法滿足正常的測試實踐。但與其他覆蓋標準相比,路徑覆蓋測試可以更有效地覆蓋程序中的每個可能路徑,包括所有的代碼分支和語句,以確保所有的情況都被考慮到,測試用例的覆蓋率也更高。且路徑覆蓋測試可以發現程序中的更多缺陷,包括隱藏的或難以發現的缺陷,因此路徑覆蓋可以更有效地提高程序的可靠性和穩定性。未來的自動生成單元測試用例技術需要更加重視路徑覆蓋標準的技術實現。

3.2 污點分析測試技術

安卓智能終端的安全問題一直是安卓測試技術研究的重點。在移動支付、電子商務和社交網絡等活動中,大量的用戶隱私數據容易在第三方移動應用程序中泄露,因此保護用戶隱私已成為一項緊迫任務。污點分析技術是一種信息流分析方法,可通過標記系統中的敏感數據來跟蹤它們在程序中的傳播,進而自動檢測系統中的安全問題。對于安卓應用的隱私泄露問題而言,污點分析是一種相對有效的解決方法。例如,當存在一段安卓應用程序代碼,該程序運行會導致用戶的密碼數據通過發送短信的方式泄露時,污點分析技術首先識別引入敏感數據的接口,并進行相應的標記。如果被標記的變量又通過程序依賴關系傳播到其他變量,那么根據相關傳播規則繼續標記對應的變量。當被標記的變量到達信息泄露的位置時,就可以根據預先設定的安全策略進行檢測。這樣,污點分析技術可以較為準確地檢測出安卓應用程序中的隱私泄露問題,從而提高系統的安全性。污點分析又分為靜態和動態的污點分析。

3.2.1 動態污點分析

動態污點分析是一種基于動態信息流分析的技術,其主要原理是在應用程序運行時標記相關數據,并通過跟蹤其在內存中的顯式傳播過程來監控應用程序的行為,如圖8 所示。要實現動態污點分析,需要解決三個主要問題:確定污點源,制定污點傳播規則,以及選取污點檢測點。通過這些步驟,可以對敏感數據進行有效的跟蹤和分析,從而增強系統的安全性。

圖8 動態污點分析流程圖Fig.8 Dynamic taint analysis flow chart

Enck 等人[65]提出了一個支持實時監控第三方應用程序訪問和操作用戶個人數據的高效動態污點跟蹤和分析系統TaintDroid。為了獲取分析應用程序行為所需的上下文信息,TaintDroid 通過修改Dakvik虛擬機并對字節碼執行過程進行動態插樁來給隱私敏感源的數據添加標簽,并在敏感數據通過程序變量、文件和進程間消息傳播時傳遞應用標簽。當污染數據通過網絡傳輸或以其他方式離開系統時,TaintDroid 會記錄該標簽所對應的應用程序以及隱私數據的發送鏈接,以此識別存在安全風險的應用程序。但由于需要修改虛擬機、彈性和透明度低等問題,TaintDroid 無法被廣泛應用到各個版本的安卓系統中。

Xu 等人[66]提出了一個能夠對安卓應用程序進行細粒度區分的動態污點策略分析工具Aurasium。相較于TaintDroid,Aurasium 不需要修改安卓操作系統或虛擬機,它通過重新打包將沙盒代碼直接附加到三方應用程序本身,并通過上層的沙盒代碼對應用程序進行監視和實施安全隱私策略。通過沙盒代碼,Aurasium 能夠在應用程序和操作系統之間插入各種功能的監視模塊,執行比安卓內置權限系統更細粒度的安全隱私策略。但Aurasium 使用較為單一的沙盒程序,也使得其容易被惡意應用程序規避檢測。

Tam等人[67]提出了一個基于虛擬手機設備(virtual mobile infrastructure,VMI)的自動動態污點分析系統CopperDroid。CopperDroid 通過在VMI 中運行應用程序,對執行過程進行跟蹤和監視,收集應用程序的行為數據,并對這些數據進行可視化展示和分析。同時CopperDroid 還支持自定義規則和插件,可用于檢測和分析應用程序中的各種攻擊和漏洞類型,如隱私泄露、惡意軟件、代碼注入等。相較于其他工具,CopperDroid 基于VMI 的以系統調用為中心的分析,可以有效地防止應用程序規避檢測,同時也使系統的內部信息變化更加直觀和透明。但因為CopperDroid 是在模擬器環境中執行應用程序,所以分析結果并不完全可靠,可能存在誤報或漏報等情況。

3.2.2 靜態污點分析

靜態污點分析是一種基于程序變量之間數據依賴關系的污點分析技術,在不運行代碼的情況下對應用程序進行安全檢測。相對于動態污點分析,靜態污點分析具有一些明顯的優勢:首先,它可以在程序發布前對應用程序的安全性進行檢測,避免發布后造成安全問題;其次,它具有較高的分析覆蓋率,無需依賴測試集合;此外,它不需要程序插樁,避免了可能導致程序運行開銷的問題。在進行靜態污點分析時,通常會對程序的控制流圖和數據流圖進行分析,并根據變量之間的數據依賴關系來標記敏感數據的源頭及其傳播路徑。通過這種方式可以快速識別可能存在的信息泄露風險,并提出有效的修復措施。

Arzt等人[68]提出了一個高精度、高性能靜態污點分析系統FlowDroid。FlowDroid 利用反編譯工具Dexpler 和Java 分析工具Soot[69]將apk 文件轉化成Soot 中間表示Jimple,隨后在Jimple 上進行靜態的污點分析。FlowDroid 根據上下文精確地建模整個安卓生命周期信息,可以有效提高精確度和召回率,并減少漏檢和錯檢。但FlowDroid 不支持組件間通信的檢測,且不能準確地解析和跟蹤部分高級操作的意圖。王蕾等人[70]在FlowDroid的基礎上優化并提出了一種多源污點分析系統MultiFlow。針對FlowDroid結果數量多但精度低的問題,MultiFlow利用多源綁定特性增強污點分析,使其可以判斷多個污點源是否可在一次執行中綁定發生,從而顯著提高安卓應用隱私泄露檢測的精度。Wei 等人[71]提出了實現流和上下文敏感的組件內數據流污點分析工具AmAndroid。在過程間控制流圖和數據流圖的基礎上,AmAndroid創新性地為每個組件構建一個數據依賴圖,并生成一個匯總表,以記錄可能的組件通信連接。相較于FlowDroid,AmAndroid 可以基于專有的組件間和應用程序間流分析來進行組件間通信和應用程序間通信的污點檢測。然而,由于處理異常和反射的能力有限,AmAndroid無法檢測并分析隱式污點流。Gordon 等人[72]提出了一個對象敏感和流不敏感的污點分析工具DroidSafe。DroidSafe專門為安卓構建了一個執行模型以精確地跟蹤通過安卓API 的流。同時DroidSafe使用字符串分析將反射調用替換為對目標方法的直接調用,也使得污點分析流更加完整。但由于真實項目代碼量大且復雜,DroidSafe分析及調試過程成本高等問題,DroidSafe 也未被廣泛應用于實際的軟件工程項目。

表4 展示了動靜態污點分析在技術優勢、局限性、性能、準確率這幾個評價指標下的對比結果。污點分析技術雖然在安卓應用的識別和修復潛在的安全漏洞方面取得了一定的成果,但在可靠性和穩定性方面仍存在十分明顯的缺陷和難點。首先,由于計算機程序的控制流和數據流非常復雜,污點分析往往會遇到路徑爆炸問題。當程序中存在大量循環和分支語句時,污點分析的路徑數會呈指數級增長,導致分析時間和空間成本極其不穩定。其次,在污點分析中,程序執行的上下文環境非常重要,例如程序的輸入、輸出和狀態等,但是目前技術很難精確地獲取和分析這些上下文信息,導致污點分析的準確性和可靠性受到影響。再次,已有的污點分析技術往往會產生大量的誤報,即將正常的程序行為誤認為是安全漏洞。這是由于程序中存在大量的復雜控制流和數據流,而污點分析很難準確地區分哪些行為是正常的,哪些行為是異常的。最后,污點分析技術的可擴展性比較差,即難以應對大規模、復雜的程序分析。這是由于污點分析需要對程序的控制流和數據流進行深入分析,而這些分析往往需要消耗大量的計算資源和存儲空間。

表4 安卓污點分析技術方法比較Table 4 Comparison of Android taint analysis technique approaches

3.3 其他安卓白盒測試技術

除單元測試和污點分析外,還有其他安卓白盒測試技術可以通過了解和分析應用程序的內部實現和結構,以及程序運行時的行為情況,來發現軟件中可能存在的問題和缺陷,如第三方庫安全測試、安卓權限安全測試等。

3.3.1 第三方庫安全測試

第三方庫是軟件開發的重要組成部分。在安卓生態系統中,開發人員可以借助第三方庫的不同功能來提高應用程序的開發效率。然而,第三方庫使用的普及也帶來了新的挑戰和威脅。惡意或易受攻擊的代碼可能會隱藏在第三方庫中,這些代碼可能會感染廣泛使用的應用程序,對用戶的信息安全構成威脅。

通常,檢測第三方庫有基于白名單和基于特征提取兩種方式,如圖9所示。最初的重打包檢測和惡意軟件檢測大多采用基于白名單的方式,即過濾掉已知的惡意第三方庫。例如,Chen 等人[73]使用了一份包含73 個經過篩選的第三方庫的白名單。Lin 等人[74]以手動方式對接近400 個第三方庫進行了標記,并對它們進行了功能分類。Zhou 等人[75]開發了應用程序相似性度量系統DroidMOSS,基于白名單并利用模糊哈希技術來檢測應用程序重打包行為的變化。然而,這種方法很容易被包重命名所規避,并且隨著混淆技術的興起,基于白名單的方法的有效性也大大降低。因此,越來越多的研究者開始使用基于特征提取的方式,直接從第三方庫中提取關鍵特征來識別惡意程序。Liu等人[76]針對安卓程序中的廣告第三方庫,使用基于字節碼靜態分析提取特征的機器分類器,提出了一種高效、準確、自動且抗混淆的方法PEDAL,用于識別嵌入在應用程序二進制文件中的廣告庫。Ishio 等人[77]提出了一種自動檢測目標程序中包含類文件jar的方法。該方法使用貪婪算法檢索可疑三方jar文件列表。報告的文件列表可幫助開發人員和用戶評估由應用程序中的第三方庫引起的潛在風險。Backes 等人[78]提出了LibScout,用于確定第三方庫是否被混淆并準確判斷庫的版本。LibScout使用哈希特征進行檢測,重點提取類之間的層次結構信息。黃思榮等人[79]提出了LibSeeker,它在LibScout基礎上增加了對方法特征的提取,完善了LibScout 的不足。LibSeeker 利用置信區間上界算法和ROC 曲線簡化參數自整定,提高了第三方庫檢測的效率。

圖9 第三方庫安全測試技術Fig.9 Third-party library testing technology

雖然現在已有成熟的商業產品廣泛應用于安卓移動終端的第三方庫檢測,但仍存在一些不足。首先,應用程序中使用的第三方庫通常具有復雜的依賴關系,如嵌套依賴、版本沖突等,使得已有檢測工具需要考慮多個庫之間的交互影響,增加了檢測的難度,可靠性降低。其次,由于不同的應用程序使用的第三方庫不同,檢測工具需要具有一定的適配性。但是由于庫的數量龐大,工具開發者需要花費大量時間來適配各種庫,限制了工具的覆蓋率和穩定性。因此,需要進一步地研究和改進,以提高第三方庫檢測技術的可靠性和穩定性。表5 展示了安卓第三方庫檢測不同代表工作的優劣勢對比。

表5 安卓第三方庫檢測方法比較Table 5 Comparison of Android third-party library detection approaches

3.3.2 安卓權限安全測試

安卓因其開源性,長期以來一直是惡意軟件攻擊的主要目標。其中一個主要漏洞來源就是權限機制。為保障用戶數據的安全,安卓要求應用程序在訪問用戶敏感數據(如聯系人和短信)以及某些系統功能(如攝像頭和網絡訪問)時請求相應的權限。安卓的安全性在很大程度上取決于這種權限機制的有效性。然而,惡意軟件可能會偷偷地申請額外權限,以獲取用戶的敏感和私人數據,而這也是安卓系統的潛在危險之一。

為了應對這一風險,安卓權限檢測技術被不斷提升和完善。目前,安卓權限檢測技術大致可以分為三種類型。第一種是基于描述的權限檢測技術。該技術使用靜態分析方法,解析應用程序相關的代碼權限,并分析應用程序實際調用的權限,從而得到應用程序最小權限集。Xiao 等人[80]提出了一種超聲明權限識別算法MPDroid。MPDroid 采用線性判別分析(linear discriminant analysis,LDA)技術和改進的協同過濾推薦算法來識別和刪除應用程序過度聲明的權限。徐尉等人[81]提出了基于應用功能類別分析的安卓應用權限泄露檢測系統PACS(permission abuse checking system)。該系統通過分析應用評論數據和簡介文本判斷功能類別,反編譯apk 文件獲取權限信息,統計同類應用頻繁申請的權限構建權限頻繁項集,并根據類別下的頻繁權限集判斷應用是否存在異常權限申請,從而檢測權限濫用行為,實現了基于應用功能對權限濫用情況進行有針對性檢測的系統。第二種是基于接口的權限檢測技術。該技術通過數據融合方法和基于挖掘的技術,根據應用程序使用的API和API描述,為給定的應用程序推薦權限。Liu等人[82]提出了一個新的安卓應用權限推薦系統PerRec,其中協作過濾組件和基于內容的推薦組件的結合使系統性能更佳。但由于安卓系統版本迭代速度不斷加快,第三方庫不斷地被各應用所使用,API 的數量也不斷地增加,功能和描述也隨之變化,這就造成了該方法的適用性略顯不足。第三種是基于隱私政策的權限檢測技術。Yu 等人[83]提出利用應用程序的隱私策略及其字節碼來增強基于描述和權限的惡意軟件檢測,自動分析隱私策略,并在隱私策略、字節碼、描述和權限之間執行交叉驗證。該模型描述了個人信息是如何被處理和傳輸的,并指導軟件定義語義,包括數據聚合、完整性和安全性。但由于隱私政策是開發者自己撰寫的,可能其聲明的隱私權限未必是應用程序所需要的,部分使用到的權限也可能并未在隱私政策中提及。

除了上述內容,安卓權限檢測技術還需要考慮用戶態與內核態權限管理、安全性與用戶體驗的平衡、動態越權、設備多樣性等問題,這些問題也導致了安卓權限檢測技術在可靠性和穩定性方面無法達到最優的測試實踐。

4 挑戰與展望

測試技術是智能終端系統中至關重要的基礎技術,它可以顯著提高智能終端系統的可靠性和穩定性。盡管軟件測試在過去幾年中已經取得了重大進步,但仍存在一些重要的歷史問題,如成本高、效率低、精度差等。而現在,隨著新興技術(如人工智能大模型)的出現,這些問題變得更加復雜和具有挑戰性,同時也引出復雜性、異構性、不透明性等新問題。因此,本文將從歷史技術和人工智能新技術兩個角度探討這些問題和挑戰,并為其提供解決思路,如圖10所示。

圖10 安卓智能終端自動化測試技術挑戰與展望Fig.10 Challenges and prospects of Android intelligent terminal automation testing

4.1 安卓自動化測試面臨的歷史挑戰

在黑盒測試方面,隨著新興技術的涌現,應用程序變得更加復雜,交付速度也越來越快,這給軟件測試帶來了更多的挑戰。對于安卓智能終端黑盒測試的可靠性和穩定性,存在以下幾個關鍵問題:

第一,高維護成本。隨著項目迭代速度的提高,黑盒自動化測試需要不斷調試代碼以適應新版本UI的更新,導致維護成本升高。

第二,非全自動化運行。盡管部分自動化執行步驟可以自動生成和運行,但某些步驟仍需要人工干預,例如設置環境和運行數據等。此外,自動化運行有時可能會誤報結果,而誤報排查往往也需要人工確認。

第三,長時間執行。黑盒自動化測試會隨著用例數量的不斷增加,導致執行時間越來越長,問題暴露得也越來越晚。為了跟上版本迭代速度,開發人員可能會選擇直接發布最新版本,從而使自動化測試工作形同虛設。

在白盒測試方面,盡管單元測試用例自動生成技術已經在許多軟件領域得到廣泛應用,但對于安卓智能終端領域的系統測試仍然存在許多挑戰。

對于符號執行,研究人員仍然面臨提高可拓展性和可用性的雙重挑戰??赏卣剐允侵溉绾卧谟邢薜馁Y源下提高符號執行的效率,以更快地達到最終目標。路徑空間爆炸和約束求解就是可拓展性的兩個主要難點。目前主要的研究有四個方面:(1)針對具體目標提供高效的搜索策略;(2)通過約束輸入范圍、削減或合并路徑等方式來減少程序的路徑空間;(3)在調用求解器之前對路徑條件的查詢進行優化,以減少求解器的調用次數或縮短求解時間;(4)支持覆蓋程序特征的高效編碼。在可行性方面,環境建模和多形態分析目標支持則是主要難點。主要的研究方向是在分析的精確性、可靠性、建模工作量之間進行權衡和折中,并不斷探索更多的語言和應用領域。

對于遺傳算法,研究人員則面臨非數值行變量的處理和初始參數確定兩個方面的挑戰。對于初始參數,遺傳算法中的種群大小和遺傳算子概率等參數通常是隨機設置的,如何進行智能設置以提高測試生成的效率和準確性是一個亟待解決的問題。在安卓智能終端領域,由于存在復雜的變量類型和類成員變量,如何選擇合適的編碼策略也是需要研究的問題。研究人員需要針對不同場景和應用,選擇最佳的編碼策略和參數配置,以實現更加準確和高效的遺傳算法測試生成。

在新興技術方面,越來越多的智能終端設備已經開始搭載了包括語音助手、圖像識別和光學字符識別(optical character recognition,OCR)提取在內的各種深度學習模型。盡管這些模型增強了智能終端系統的功能性,但是同時也給系統中的測試帶來了新的挑戰。以目前廣泛使用的人工智能大模型技術GPT(generative pre-trained transformer)為例,其在復雜性、異構性和不透明性方面都對測試提出了更高的要求。復雜性主要體現在人工智能系統內部組件之間的相互依存關系和交互作用上,這種交互作用使得測試人員很難預測系統在不同條件下的行為,從而增加了系統中缺陷識別的難度。異構性的挑戰則來自于系統集成了多種可能具有不同特征和行為的組件,導致測試結果存在差異和錯誤。不透明性則指的是測試人員時常無法理解人工智能系統如何完成某些任務或產生特定輸出。在深度學習模型中,模型通常被視為“黑盒”,這使得在發現缺陷時準確確定系統是如何作出特定響應變得十分困難。

4.2 安卓自動化測試最新研究方向

針對傳統黑盒測試出現的高成本、低效率等問題,可以考慮優化歷史算法模型,運用微搜索算法思想來解決。測試用例編碼空間的多樣性、大規模和復雜性會造成測試用例生成需要高計算代價,影響測試效率。借鑒微搜索算法思想,研究人員可以獲取測試用例的編碼空間,然后通過流形優化獲取滿足約束的測試用例[84]。筆者所在的課題組研究了一種交互式測試用例的自動生成方法[85],該方法通過遍歷應用程序UI 界面中的可點擊視圖,自動生成與用戶點擊交互相關的測試用例。當應用程序的UI界面顯示后,通過算法遍歷應用程序UI 界面對應的視圖樹中的所有視圖,并記錄其中可點擊視圖在視圖樹中的路徑,進行智能的出入棧操作,獲得UI界面中所有可點擊視圖在視圖樹中的路徑信息的集合。對該路徑信息集合中的每一路徑信息分別生成對應的測試用例,在測試用例中,根據待測試視圖在視圖樹中的路徑信息,在應用程序UI界面中查找到該視圖,并觸發其點擊事件,即完成對該視圖的點擊交互測試,然后將操作對應的代碼寫入測試用例文件,生成該視圖對應的測試用例。該方法還有待在主流的安卓應用上進行覆蓋率、誤報率等驗證。

白盒測試方面,安卓系統需要在自己的Dalvik虛擬機上運行而非JVM(Java virtual machine),如何更好地自動生成安卓能執行的單元測試用例依舊是一個技術空白。目前課題組開始研究如何在JVM 上運行安卓測試,并自動化生成測試用例[86]。該研究通過演化算法生成隨機且覆蓋邊界計算、斷言以及測試數據多樣化的測試用例,并直接基于JVM 的環境構建進行安卓單元測試執行的框架??蚣芸梢苑譃閮纱竽K,即測試用例生成模塊和測試用例執行模塊。測試用例生成模塊是該測試框架的核心部分,主要負責生成可執行的測試用例集。在該模塊中,首先需要對源測試文件進行解構分析,然后執行演化算法,根據不同的操作,如產生新的測試分支、對原值進行突變修改或直接隨機插入新的測試片段語句,來構建一個獨立的測試用例集,直到生成一個完整的測試用例集。同時,在安卓組件的構造中會涉及到一些特殊的語句,如new 語句等,因此在初始化種群的過程中需要進行安卓化語句替換,以滿足安卓組件的構造要求。測試用例執行模塊則是負責將測試用例集加載到指定的測試環境中進行測試執行,直到返回測試結果。在該模塊中,使用JunitCore 作為測試運行器,查找到對應的運行器并采用該運行器執行測試用例。由于測試用例中可能包含需要依賴于安卓運行環境的代碼片段,但預先設置的運行器本身就是具有該安卓測試環境的,即使在JVM 中,也可以正常通過該第三方測試框架執行用例。

另外,針對基于JVM 的單元測試執行對安卓文件編譯的大量耗時問題,課題組提出了一種新的技術方案,通過目標信息插樁和預先設置的靜態類初始化測試用例語句直接執行安卓語句,從而避免動態編譯過程。這種方案本質上采用了hook 技術,通過測試容器的靜態接口獲取測試語句運行。與直接執行字節碼形式的單元測試相比,該方法可以避免安卓文件編譯的大量耗時,并且能夠更快速地執行測試用例。課題組計劃將用例生成算法和測試容器開發成可直接執行的Gradle 插件,并通過對幾款主流開源應用進行逆向技術測試和驗證優化,以證明該技術方案的效果。如果達到預期目標,還計劃將該用例生成算法和測試容器應用到谷歌應用商店上的主流應用安裝包,以進一步優化測試效率和準確性。

4.3 人工智能與自動化測試的結合

隨著人工智能技術的持續發展,人們可以利用更多的數據和更先進的技術來訓練更復雜的人工智能模型。這些模型通常使用數以億計的參數,并依托于龐大的訓練數據集,可以提供更高的準確率和泛化能力。該能力可以為自動化測試等需要處理大量數據和高復雜性任務的應用場景提供非常重要的幫助。同時,這些模型也可以通過訓練數據的深度學習來形成更強的智能化和自適應性,能夠更好地適應復雜的測試數據和編碼場景。

對于黑盒測試,首先,針對傳統的測試用例設計方法需要大量的人力和時間,并且難以保證覆蓋所有功能點的痛點,人工智能大模型可以充當測試想法生成器,根據測試人員提供的信息,提供新的測試用例設計思路和建議,從而幫助測試人員更好地設計測試用例,并覆蓋更多的功能點。如基于GPT-3模型的ChatGPT 已被應用到很多領域,其支持在用戶的提示下,生成所需要的任何專業想法,可以有效幫助用戶擴展或優化思路[87]。雖然ChatGPT 目前還沒有被廣泛應用到測試領域,但依舊是一個值得期待的研究方向。

其次,針對自動化測試用例的生成通常需要大量的時間和經驗的痛點,人工智能大模型可以為測試人員提供有關自動化測試用例生成的應用程序和工具,以及最佳實踐和建議,快速生成自動化測試用例,提高測試效率和測試質量。Mathur等人[88]結合了T5(transfer text-to-text transformer)模型的自然語言理解和GPT-3 的自然語言生成來自動生成用例。通過將微調的T5 會話上下文知識應用到GPT-3 模型,可以準確識別相關的測試關鍵字,在沒有任何人為干預的情況下快速生成測試用例。不過由于訓練集不足等原因,該模型并未覆蓋所有軟件測試場景。但該研究證明了從對話中生成測試用例的可行性,后續研究的關鍵是提高模型生成的測試用例的準確性和完整性。

最后,針對難以實現全自動化的痛點,人工智能大模型可以通過自注意力機制來處理輸入的測試數據,更好地理解測試用例的自然語言描述,并幫助測試工具準確識別下一步采取的期望行動。此外,人工智能大模型可以被微調以識別特定領域的編程語言,從而更好地理解測試用例和被測軟件的上下文。Zimmermann 等人[89]提出了使用GPT-3 來進行軟件測試,并演示了Transformer 架構應用于解釋自然語言測試用例和指導被測應用程序的全過程。由于模型訓練的成本原因,他們選擇較為簡單的應用進行基礎實驗。結果表明GPT-3 能夠以最小人工測試成本完成測試用例,這也側面驗證了使用GPT-3進行自動化測試以消除需要手動編寫和適配測試用例成本的可行性。

與黑盒測試一樣,如何利用人工智能大模型完善測試技術也是白盒測試需要關注的重點。針對程序代碼語義理解難的問題,人工智能大模型可以通過學習程序代碼的語義和結構,更好地理解代碼的含義和功能,從而幫助測試人員在白盒測試中發現潛在的問題。Prenner 等人[90]研究了基于GPT-3 的編程語言預訓練模型CodeX。實驗結果表明CodeX 在自動程序修復方面相比于其他技術的歷史工作(DeepDebug[91]、CoCoNuT[92]、CURE[93])有著最高的準確率。與符號執行類似,自動程序修復技術的可靠性和穩定性主要依賴于工具對程序代碼語義的理解。人工智能大模型在自動程序修復上的成功也一定程度啟發了符號執行相關的自動化測試工作。

針對深度模型或人工智能如何測試,如何提高人工智能測試的有效性問題,研究人員可以探索一種新的方法,即建立一種以人工智能為主導的測試框架,讓人工智能測試人工智能。針對模型解釋性問題,該框架應可以對其內部結構進行分析和解釋。通過觀察模型的輸入、中間層和輸出,了解模型是如何進行預測的,從而更好地理解其行為。針對特征選擇問題,該框架應可以通過分析不同的輸入和中間層特征來確定哪些特征對于預測最重要。這有助于優化測試集,提高測試覆蓋率。對抗樣本是指對模型輸入作出微小但有意義的修改,以使模型產生誤差。針對對抗樣本檢測問題,該框架應可以檢測和識別對抗樣本,從而增強模型的魯棒性和健壯性。而對于問題定位難這個痛點,如果模型在某些測試用例上表現不佳,該框架應可以幫助定位問題所在。通過分析模型的輸入和中間層狀態,確定模型在哪些情況下會出現錯誤,并采取相應措施進行修復。

5 結束語

在智能終端軟件開發過程中,軟件測試是必不可少的環節。測試結果的準確度直接決定軟件研發品質。本文全面概述了以安卓為代表的智能終端自動化測試技術和工具。黑盒與白盒是兩種不同的軟件測試技術,相互補充且缺一不可。測試過程中需要進行白盒測試驗證邏輯結構是否正確,軟件安全是否達標,也需要黑盒測試檢驗功能是否正確,系統是否穩定。目前,智能終端軟件測試已經能夠實現較為精準的質量控制。然而,隨著智能終端軟件和信息技術的不斷進步,無論是黑盒測試還是白盒測試,都需要不斷研究和創新來推動智能終端行業的發展。隨著智能終端自動化測試技術的不斷完善,未來將有越來越多的測試場景可以被自動化,并且自動化成本也將降低,自動化測試的精確性也將逐步提高,最終達到高可靠、強穩定的智能終端測試最佳實踐。

猜你喜歡
污點測試用例安卓
iPhone不卡的秘密曝光:安卓也能享受
基于代碼重寫的動態污點分析
基于SmartUnit的安全通信系統單元測試用例自動生成
文物表情包
基于混合遺傳算法的回歸測試用例集最小化研究
使用Lightroom污點去除工具清理照片中的瑕疵
一種基于安卓系統的手機側抓包分析方法
我國“污點證人”刑事責任豁免制度的構建
基于依賴結構的測試用例優先級技術
安卓L未至安卓M來了!安卓首泄漏M系統
91香蕉高清国产线观看免费-97夜夜澡人人爽人人喊a-99久久久无码国产精品9-国产亚洲日韩欧美综合