劉 萌
(南京特殊教育師范學院, 江蘇 南京 210038)
隨著互聯網技術的飛速發展,Andriod系統在市場終端應用中呈現迅速擴張的趨勢,如今的車載娛樂終端也大多基于Android操作系統,人機交互界面更美觀,功能也日益復雜,這也導致了系統安全性和穩定性問題日益增多,在產品開發生命周期中不得不投入更多的時間和人力資源到測試環節中。車載娛樂終端產品一旦產生穩定性問題,不僅后期維護和糾正成本極高,還會給駕駛人員帶來潛在的安全威脅。為解決上述問題,本文對Monkey及UIAutomator2兩種Andriod自動化測試工具進行了研究,制定了隨機和定制功能路徑兩種場景的自動化穩定性測試方案,并設計實現了基于Python二次開發的Monkey隨機場景自動化測試工具和基于Python + Pytest +UIAutomator2的定制功能路徑場景自動化測試工具。
Monkey是Android系統自帶的一款基于命令行的自動化測試工具,主要用于測試Android應用程序及系統的穩定性和魯棒性。Monkey通過向系統發送隨機事件流來模擬用戶操作。Monkey簡單易用,對于發現應用程序和系統的應用程序無響應(Application Not Response,ANR)、Crash等異常具有顯著的效果。
1.1.1 運行方式設計
Monkey測試的運行可以分為離線和在線兩種運行模式。
在離線模式下,需要將Monkey命令參數編寫成shell腳本推送到被測設備上,本地執行。這種模式對測試人員編程能力有一定要求,一旦測試步驟或參數需要更改,shell腳本就需要修改,而且在測試過程中,腳本無法實時識別到異常,不會去實時捕獲日志,只能在測試結束后人工分析Monkey測試日志,找出問題及時間點,再去查找對應時間點的日志。如果問題出現的時間點較早,很可能日志已被覆蓋掉,導致無法分析問題,像bugreport、dumpsys等實時性要求極高的日志,在測試結束后再抓取基本已經失去時效。另外,離線模式下Monkey測試本身產生的日志只能本地化存儲,占據被測系統的存儲空間,從而影響被測系統性能,干擾測試結果。
在線測試模式在測試過程中需要保持PC與被測設備的Android調試橋(Android Debug Bridge,ADB)連通,Python程序運行于PC上,腳本實時翻譯實時下發。本文設計的Monkey測試工具采用在線運行方式。Monkey命令通過Python程序下發,所有Monkey日志重定向到本地PC,避免占用被測設備的存儲空間。在測試過程中,Python程序還會另起線程實時讀取并分析Monkey日志,一旦識別到異常就立即抓取系統全日志。這種方法一方面節省了人工分析問題的時間,一方面確保了日志的實時性和完整性。
1.1.2 測試模式設計
Monke測試工具提供了3種測試模式:單包、多包組合和系統級測試模式。
單包模式只對一個應用程序進行測試,通常應用于產品開發前期、應用程序逐個上線的階段。不同的功能模塊用戶的操作習慣不同。因此,該模式需要根據實際操作場景設置不同的事件百分比。
多包組合模式同時針對多個應用進行并行測試,通常會選取用戶使用頻率最高的幾個應用隨機組合,測試過程必需涉及應用間的切換。
系統級測試模式不限定被測應用范圍,對所有應用程序和系統組件進行并行測試,實現全功能聯動。該模式主要應用于產品開發后期階段的驗收。
1.1.3 測試參數設計
Monkey測試參數主要分為3類:基本配置參數、事件類型參數和調試參數。
本方案中Monkey測試的目的有兩種:項目早期階段的問題發現測試(測試過程中忽略異常繼續執行,以盡可能發現更多問題)和項目后期階段的驗收測試(測試過程中不忽略異常,出現異常即停止執行,并將驗收結果判定為不通過)。不同測試階段參數制定如下。
(1)基本配置參數設計。
級別(-v)設為最高-v-v-v,以輸出盡可能詳細的日志。
隨機種子值(-s)默認為0,每輪測試更換一個隨機值,代表從不同的起點開始新一輪的測試。
動作時間間隔(--throttle)在產品初期階段設為1 s,后期平臺功能穩定后設定為300 ms。
在-p參數后指定測試包可以實現上述3種測試模式。每輪測試的操作次數Count參數由計劃測試時長決定,計算公式為:Count=測試時長(ms)/--throttle。
(2)事件類型參數設計。
操作事件類型的百分比值根據不同被測模塊的功能區別設定,百分比總和不超過100%。
(3)調試參數設計。
在問題發現測試階段,將異常和超時參數設置為ignore;在驗收測試階段,不設置此類參數。Monkey命令示例:adb shell monkey-p xxx-p xxx-s 0--throttle 300--pct-touch 40--pct-motion 20--pct-syskeys 10--pct-anyevent 10--pct-appswitch 10--pct-flip 5--pct-pinchzoom 5--ignore-crashes--ignore-timeouts--ignore-security-exceptions--ignore-native-carshes-v-v-v 5000
1.1.4 運行過程設計
數據交換接口通常采用xml格式來實現。本工具中用戶配置接口即設計為一個xml文件,其中包含了Monkey測試參數、測試模式、被測系統的日志路徑、檢測門限值等參數。用戶只需在此文件中填寫參數值即可實現不同測試方案的更改。主程序在執行測試時會首先解析該xml文件,讀取用戶設置的參數。執行流程如圖1所示。

圖1 Monkey測試工具執行流程
在產品開發前期階段,系統還不穩定,Monkey工具發現了較多黑屏、凍屏、死機等重大問題。在產品開發中后期階段,系統趨于穩定,Monkey測試可以持續運行較長時間,更全面地發現了ANR、Crash等異常。工具在日志抓取方面做到了實時、全面,能夠滿足開發分析的需求。
Python是全球最受歡迎的編程語言之一[1],擁有豐富的測試框架和工具[2],如Robot Framework、Pytest、Unitest等,而Pytest是最受歡迎和最具影響力的一個。UIAutomator2是Android UI自動化測試的開源工具之一,可以對任意應用程序的任意一個控件屬性進行任意操作,開發者們推出的Python-UIAutomator2提供了Python接口,支持Python編程。
Python-UIAutomator2的運行主要涉及兩個部分:Python客戶端和被測設備。UIAutomator2的運行環境需要進行以下配置:(1)被測設備端打開開發者選項,以ADB方式連接PC。在PC的CMD窗口執行adb devices,查看設備是否成功連接。(2)PC端安裝Python 3.x;安裝UIAutomator2,在CMD窗口執行pip install UIAutomator2;安裝WEditor。(3)在PC端CMD窗口執行Python-UIAutomator2 init,安裝被測設備端的HTTP RPC服務apk、atx-agent等。這些是UIAutomator2運行的必要工具。
Monkey工具對于智能車載娛樂系統而言,無法涉及與車上其他電子控制單元(Electronic Control Unit,ECU)的控制器局域網絡(Controller Area Network,CAN)[3]通信車載協議測試。為解決這個問題,本文引入了定制功能路徑的測試方案。定制功能路徑測試具有以下優點:(1)測試步驟根據用戶實際操作設計,測試場景更接近用戶行為。(2)支持個性化定制,可以根據不同功能模塊的特點,定制個性化的測試步驟。(3)支持壓力測試:可以通過設置Pytest裝飾器的參數值重復執行指定腳本,以檢查系統的穩定性。
定制功能路徑測試的目的有2個:功能驗證和性能驗證。前者重點關注系統在執行一般用戶操作(如點擊、按鍵、滑動等)后的系統反應是否正確。后者主要通過反復執行某一類型的操作,如藍牙、Wi-Fi的開關/斷連、系統軟重啟、休眠/喚醒等,來檢查系統功能和狀態在重復壓力或長期運行下是否穩定。這種測試對于發現系統內存泄漏以及穩健性相關的問題非常有效。
定制功能路徑測試分為常規操作類、Can信號交互類和性能測試等場景。常規操作類測試涵蓋了用戶常見的操作行為。Can信號交互類測試則關注系統在與其他ECU通信時系統狀態及反饋是否正確。性能測試則是通過大量操作后,測量系統的關鍵性能指標,如冷啟動/熱啟動時長和開機時序等,對系統進行全面的性能評估,以確保產品滿足出廠及市場標準。定制功能路徑測試具體場景設計如下:(1)單App全功能鏈路驗證,主要用于驗證單個應用程序的基本功能。(2)多App全功能鏈路交互驗證,主要用于驗證多個應用程序之間交互是否正常。(3)典型單場景操作,如開關反復開閉、休眠喚醒等,主要用于驗證系統關鍵功能是否穩定。(4)性能測試,冷/熱重啟、休眠喚醒等場景重復執行百遍后,驗證啟動時序、統計平均開機時長。(5)場景復現,針對一些較難復現的bug開發特定的測試腳本嘗試復現,出具復現概率報告或壓力測試報告。
(1)界面元素獲取工具。
本文使用WEditor來定位元素,WEditor基于Python,能提供輔助編寫腳本和調試代碼的功能,可以通過瀏覽器輕松打開,簡單易用。WEditor可方便獲取到元素的Xpath屬性(Xpath是元素的絕對唯一屬性)。
(2)測試腳本工程架構。
基于UIAutmator2的自動化測試工具框架及整體運行流程設計如圖2所示。

圖2 UIAutomator2自動化測試工具框架及流程
① Main.py為測試引擎,主要完成測試報告的創建、測試套件配置參數的獲取、各種路參數徑的獲取、測試命令下發等。
② Config路徑下存放test_cfg.py和xpath_cfg.py。前者用于存儲測試套件的配置參數,如測試環境、用例、數據等。后者用于存儲測試用例用到的參數,如XPath值、Can信號值等。
③ TestCases路徑下存放所有測試腳本文件,每個功能模塊對應一個.py文件,每個測試用例對應一個函數,用例運行策略由Pytest裝飾器參數值指定。
④ util.py是一個集合了所有公共函數的Python文件,如環境恢復、xml文件解析、用戶操作、Can信號收發、Log抓取、系統狀態檢查等。
⑤ TestReports路徑下存放測試報告,每輪測試都會創建一個新的網頁版測試報告。測試報告中可以包含測試結果、執行時間、測試用例的通過或失敗狀態等信息。
(3)Can 信號收發工具使用開發。
本文工具針對Pcan測試儀開發Python腳本,通過對PCanBasic.dll進行二次開發來實現。PCan Basic.dll的原生函數有:Initialize(初始化一個PCan設備的PCan通道)、Uninitialize(取消初始化)、GetStatus(獲取當前PCan通道的Bus狀態)、Read(從消息接收隊列中讀取Can消息及其時間戳)、Write(發送Can消息)等函數,對上述源碼進行Python二次封裝,編寫更易于測試人員使用、更符合項目需求的公共方法(如Send()、Receive()、Check())等,匯集到PCanBasic.py文件,測試用例中導入PCanBasic.py即可使用封裝的函數。
在產品開發的中后期階段,系統已逐步趨于穩定,每次軟件發布版本后使用自動化腳本即可完成大部分基礎功能驗證,無需人工再次輪詢測試用例,極大地節省了人力和時間成本。此外,在壓力和性能測試方面,該工具獲取的數據比手動測試更為科學準確,幫助了產品團隊迅速準確地了解產品的性能,為產品的優化和改進提供了堅實的依據。UIAutomator2自動化測試工具在保證產品質量、提高測試效率以及節省時間和人力成本等方面都發揮了人工測試不可替代的作用。
本文通過對智能Andriod車機系統穩定性測試方案及Monkey和UIAutomator2自動化測試工具的研究,設計并實現了2種自動化穩定性測試工具。這些工具在實際項目中切實提高了工作效率和產品質量。隨著車聯網和智能網聯產品的不斷發展,IVI娛樂系統的穩定性測試將越來越受到重視,類似的自動化測試工具將發揮更為廣泛和重要的作用,對于推動車載智能產品的發展有著重要的意義。