劉 萌
(南京特殊教育師范學(xué)院, 江蘇 南京 210038)
隨著互聯(lián)網(wǎng)技術(shù)的飛速發(fā)展,Andriod系統(tǒng)在市場(chǎng)終端應(yīng)用中呈現(xiàn)迅速擴(kuò)張的趨勢(shì),如今的車(chē)載娛樂(lè)終端也大多基于Android操作系統(tǒng),人機(jī)交互界面更美觀,功能也日益復(fù)雜,這也導(dǎo)致了系統(tǒng)安全性和穩(wěn)定性問(wèn)題日益增多,在產(chǎn)品開(kāi)發(fā)生命周期中不得不投入更多的時(shí)間和人力資源到測(cè)試環(huán)節(jié)中。車(chē)載娛樂(lè)終端產(chǎn)品一旦產(chǎn)生穩(wěn)定性問(wèn)題,不僅后期維護(hù)和糾正成本極高,還會(huì)給駕駛?cè)藛T帶來(lái)潛在的安全威脅。為解決上述問(wèn)題,本文對(duì)Monkey及UIAutomator2兩種Andriod自動(dòng)化測(cè)試工具進(jìn)行了研究,制定了隨機(jī)和定制功能路徑兩種場(chǎng)景的自動(dòng)化穩(wěn)定性測(cè)試方案,并設(shè)計(jì)實(shí)現(xiàn)了基于Python二次開(kāi)發(fā)的Monkey隨機(jī)場(chǎng)景自動(dòng)化測(cè)試工具和基于Python + Pytest +UIAutomator2的定制功能路徑場(chǎng)景自動(dòng)化測(cè)試工具。
Monkey是Android系統(tǒng)自帶的一款基于命令行的自動(dòng)化測(cè)試工具,主要用于測(cè)試Android應(yīng)用程序及系統(tǒng)的穩(wěn)定性和魯棒性。Monkey通過(guò)向系統(tǒng)發(fā)送隨機(jī)事件流來(lái)模擬用戶(hù)操作。Monkey簡(jiǎn)單易用,對(duì)于發(fā)現(xiàn)應(yīng)用程序和系統(tǒng)的應(yīng)用程序無(wú)響應(yīng)(Application Not Response,ANR)、Crash等異常具有顯著的效果。
1.1.1 運(yùn)行方式設(shè)計(jì)
Monkey測(cè)試的運(yùn)行可以分為離線和在線兩種運(yùn)行模式。
在離線模式下,需要將Monkey命令參數(shù)編寫(xiě)成shell腳本推送到被測(cè)設(shè)備上,本地執(zhí)行。這種模式對(duì)測(cè)試人員編程能力有一定要求,一旦測(cè)試步驟或參數(shù)需要更改,shell腳本就需要修改,而且在測(cè)試過(guò)程中,腳本無(wú)法實(shí)時(shí)識(shí)別到異常,不會(huì)去實(shí)時(shí)捕獲日志,只能在測(cè)試結(jié)束后人工分析Monkey測(cè)試日志,找出問(wèn)題及時(shí)間點(diǎn),再去查找對(duì)應(yīng)時(shí)間點(diǎn)的日志。如果問(wèn)題出現(xiàn)的時(shí)間點(diǎn)較早,很可能日志已被覆蓋掉,導(dǎo)致無(wú)法分析問(wèn)題,像bugreport、dumpsys等實(shí)時(shí)性要求極高的日志,在測(cè)試結(jié)束后再抓取基本已經(jīng)失去時(shí)效。另外,離線模式下Monkey測(cè)試本身產(chǎn)生的日志只能本地化存儲(chǔ),占據(jù)被測(cè)系統(tǒng)的存儲(chǔ)空間,從而影響被測(cè)系統(tǒng)性能,干擾測(cè)試結(jié)果。
在線測(cè)試模式在測(cè)試過(guò)程中需要保持PC與被測(cè)設(shè)備的Android調(diào)試橋(Android Debug Bridge,ADB)連通,Python程序運(yùn)行于PC上,腳本實(shí)時(shí)翻譯實(shí)時(shí)下發(fā)。本文設(shè)計(jì)的Monkey測(cè)試工具采用在線運(yùn)行方式。Monkey命令通過(guò)Python程序下發(fā),所有Monkey日志重定向到本地PC,避免占用被測(cè)設(shè)備的存儲(chǔ)空間。在測(cè)試過(guò)程中,Python程序還會(huì)另起線程實(shí)時(shí)讀取并分析Monkey日志,一旦識(shí)別到異常就立即抓取系統(tǒng)全日志。這種方法一方面節(jié)省了人工分析問(wèn)題的時(shí)間,一方面確保了日志的實(shí)時(shí)性和完整性。
1.1.2 測(cè)試模式設(shè)計(jì)
Monke測(cè)試工具提供了3種測(cè)試模式:單包、多包組合和系統(tǒng)級(jí)測(cè)試模式。
單包模式只對(duì)一個(gè)應(yīng)用程序進(jìn)行測(cè)試,通常應(yīng)用于產(chǎn)品開(kāi)發(fā)前期、應(yīng)用程序逐個(gè)上線的階段。不同的功能模塊用戶(hù)的操作習(xí)慣不同。因此,該模式需要根據(jù)實(shí)際操作場(chǎng)景設(shè)置不同的事件百分比。
多包組合模式同時(shí)針對(duì)多個(gè)應(yīng)用進(jìn)行并行測(cè)試,通常會(huì)選取用戶(hù)使用頻率最高的幾個(gè)應(yīng)用隨機(jī)組合,測(cè)試過(guò)程必需涉及應(yīng)用間的切換。
系統(tǒng)級(jí)測(cè)試模式不限定被測(cè)應(yīng)用范圍,對(duì)所有應(yīng)用程序和系統(tǒng)組件進(jìn)行并行測(cè)試,實(shí)現(xiàn)全功能聯(lián)動(dòng)。該模式主要應(yīng)用于產(chǎn)品開(kāi)發(fā)后期階段的驗(yàn)收。
1.1.3 測(cè)試參數(shù)設(shè)計(jì)
Monkey測(cè)試參數(shù)主要分為3類(lèi):基本配置參數(shù)、事件類(lèi)型參數(shù)和調(diào)試參數(shù)。
本方案中Monkey測(cè)試的目的有兩種:項(xiàng)目早期階段的問(wèn)題發(fā)現(xiàn)測(cè)試(測(cè)試過(guò)程中忽略異常繼續(xù)執(zhí)行,以盡可能發(fā)現(xiàn)更多問(wèn)題)和項(xiàng)目后期階段的驗(yàn)收測(cè)試(測(cè)試過(guò)程中不忽略異常,出現(xiàn)異常即停止執(zhí)行,并將驗(yàn)收結(jié)果判定為不通過(guò))。不同測(cè)試階段參數(shù)制定如下。
(1)基本配置參數(shù)設(shè)計(jì)。
級(jí)別(-v)設(shè)為最高-v-v-v,以輸出盡可能詳細(xì)的日志。
隨機(jī)種子值(-s)默認(rèn)為0,每輪測(cè)試更換一個(gè)隨機(jī)值,代表從不同的起點(diǎn)開(kāi)始新一輪的測(cè)試。
動(dòng)作時(shí)間間隔(--throttle)在產(chǎn)品初期階段設(shè)為1 s,后期平臺(tái)功能穩(wěn)定后設(shè)定為300 ms。
在-p參數(shù)后指定測(cè)試包可以實(shí)現(xiàn)上述3種測(cè)試模式。每輪測(cè)試的操作次數(shù)Count參數(shù)由計(jì)劃測(cè)試時(shí)長(zhǎng)決定,計(jì)算公式為:Count=測(cè)試時(shí)長(zhǎng)(ms)/--throttle。
(2)事件類(lèi)型參數(shù)設(shè)計(jì)。
操作事件類(lèi)型的百分比值根據(jù)不同被測(cè)模塊的功能區(qū)別設(shè)定,百分比總和不超過(guò)100%。
(3)調(diào)試參數(shù)設(shè)計(jì)。
在問(wèn)題發(fā)現(xiàn)測(cè)試階段,將異常和超時(shí)參數(shù)設(shè)置為ignore;在驗(yàn)收測(cè)試階段,不設(shè)置此類(lèi)參數(shù)。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 運(yùn)行過(guò)程設(shè)計(jì)
數(shù)據(jù)交換接口通常采用xml格式來(lái)實(shí)現(xiàn)。本工具中用戶(hù)配置接口即設(shè)計(jì)為一個(gè)xml文件,其中包含了Monkey測(cè)試參數(shù)、測(cè)試模式、被測(cè)系統(tǒng)的日志路徑、檢測(cè)門(mén)限值等參數(shù)。用戶(hù)只需在此文件中填寫(xiě)參數(shù)值即可實(shí)現(xiàn)不同測(cè)試方案的更改。主程序在執(zhí)行測(cè)試時(shí)會(huì)首先解析該xml文件,讀取用戶(hù)設(shè)置的參數(shù)。執(zhí)行流程如圖1所示。
圖1 Monkey測(cè)試工具執(zhí)行流程
在產(chǎn)品開(kāi)發(fā)前期階段,系統(tǒng)還不穩(wěn)定,Monkey工具發(fā)現(xiàn)了較多黑屏、凍屏、死機(jī)等重大問(wèn)題。在產(chǎn)品開(kāi)發(fā)中后期階段,系統(tǒng)趨于穩(wěn)定,Monkey測(cè)試可以持續(xù)運(yùn)行較長(zhǎng)時(shí)間,更全面地發(fā)現(xiàn)了ANR、Crash等異常。工具在日志抓取方面做到了實(shí)時(shí)、全面,能夠滿(mǎn)足開(kāi)發(fā)分析的需求。
Python是全球最受歡迎的編程語(yǔ)言之一[1],擁有豐富的測(cè)試框架和工具[2],如Robot Framework、Pytest、Unitest等,而Pytest是最受歡迎和最具影響力的一個(gè)。UIAutomator2是Android UI自動(dòng)化測(cè)試的開(kāi)源工具之一,可以對(duì)任意應(yīng)用程序的任意一個(gè)控件屬性進(jìn)行任意操作,開(kāi)發(fā)者們推出的Python-UIAutomator2提供了Python接口,支持Python編程。
Python-UIAutomator2的運(yùn)行主要涉及兩個(gè)部分:Python客戶(hù)端和被測(cè)設(shè)備。UIAutomator2的運(yùn)行環(huán)境需要進(jìn)行以下配置:(1)被測(cè)設(shè)備端打開(kāi)開(kāi)發(fā)者選項(xiàng),以ADB方式連接PC。在PC的CMD窗口執(zhí)行adb devices,查看設(shè)備是否成功連接。(2)PC端安裝Python 3.x;安裝UIAutomator2,在CMD窗口執(zhí)行pip install UIAutomator2;安裝WEditor。(3)在PC端CMD窗口執(zhí)行Python-UIAutomator2 init,安裝被測(cè)設(shè)備端的HTTP RPC服務(wù)apk、atx-agent等。這些是UIAutomator2運(yùn)行的必要工具。
Monkey工具對(duì)于智能車(chē)載娛樂(lè)系統(tǒng)而言,無(wú)法涉及與車(chē)上其他電子控制單元(Electronic Control Unit,ECU)的控制器局域網(wǎng)絡(luò)(Controller Area Network,CAN)[3]通信車(chē)載協(xié)議測(cè)試。為解決這個(gè)問(wèn)題,本文引入了定制功能路徑的測(cè)試方案。定制功能路徑測(cè)試具有以下優(yōu)點(diǎn):(1)測(cè)試步驟根據(jù)用戶(hù)實(shí)際操作設(shè)計(jì),測(cè)試場(chǎng)景更接近用戶(hù)行為。(2)支持個(gè)性化定制,可以根據(jù)不同功能模塊的特點(diǎn),定制個(gè)性化的測(cè)試步驟。(3)支持壓力測(cè)試:可以通過(guò)設(shè)置Pytest裝飾器的參數(shù)值重復(fù)執(zhí)行指定腳本,以檢查系統(tǒng)的穩(wěn)定性。
定制功能路徑測(cè)試的目的有2個(gè):功能驗(yàn)證和性能驗(yàn)證。前者重點(diǎn)關(guān)注系統(tǒng)在執(zhí)行一般用戶(hù)操作(如點(diǎn)擊、按鍵、滑動(dòng)等)后的系統(tǒng)反應(yīng)是否正確。后者主要通過(guò)反復(fù)執(zhí)行某一類(lèi)型的操作,如藍(lán)牙、Wi-Fi的開(kāi)關(guān)/斷連、系統(tǒng)軟重啟、休眠/喚醒等,來(lái)檢查系統(tǒng)功能和狀態(tài)在重復(fù)壓力或長(zhǎng)期運(yùn)行下是否穩(wěn)定。這種測(cè)試對(duì)于發(fā)現(xiàn)系統(tǒng)內(nèi)存泄漏以及穩(wěn)健性相關(guān)的問(wèn)題非常有效。
定制功能路徑測(cè)試分為常規(guī)操作類(lèi)、Can信號(hào)交互類(lèi)和性能測(cè)試等場(chǎng)景。常規(guī)操作類(lèi)測(cè)試涵蓋了用戶(hù)常見(jiàn)的操作行為。Can信號(hào)交互類(lèi)測(cè)試則關(guān)注系統(tǒng)在與其他ECU通信時(shí)系統(tǒng)狀態(tài)及反饋是否正確。性能測(cè)試則是通過(guò)大量操作后,測(cè)量系統(tǒng)的關(guān)鍵性能指標(biāo),如冷啟動(dòng)/熱啟動(dòng)時(shí)長(zhǎng)和開(kāi)機(jī)時(shí)序等,對(duì)系統(tǒng)進(jìn)行全面的性能評(píng)估,以確保產(chǎn)品滿(mǎn)足出廠及市場(chǎng)標(biāo)準(zhǔn)。定制功能路徑測(cè)試具體場(chǎng)景設(shè)計(jì)如下:(1)單App全功能鏈路驗(yàn)證,主要用于驗(yàn)證單個(gè)應(yīng)用程序的基本功能。(2)多App全功能鏈路交互驗(yàn)證,主要用于驗(yàn)證多個(gè)應(yīng)用程序之間交互是否正常。(3)典型單場(chǎng)景操作,如開(kāi)關(guān)反復(fù)開(kāi)閉、休眠喚醒等,主要用于驗(yàn)證系統(tǒng)關(guān)鍵功能是否穩(wěn)定。(4)性能測(cè)試,冷/熱重啟、休眠喚醒等場(chǎng)景重復(fù)執(zhí)行百遍后,驗(yàn)證啟動(dòng)時(shí)序、統(tǒng)計(jì)平均開(kāi)機(jī)時(shí)長(zhǎng)。(5)場(chǎng)景復(fù)現(xiàn),針對(duì)一些較難復(fù)現(xiàn)的bug開(kāi)發(fā)特定的測(cè)試腳本嘗試復(fù)現(xiàn),出具復(fù)現(xiàn)概率報(bào)告或壓力測(cè)試報(bào)告。
(1)界面元素獲取工具。
本文使用WEditor來(lái)定位元素,WEditor基于Python,能提供輔助編寫(xiě)腳本和調(diào)試代碼的功能,可以通過(guò)瀏覽器輕松打開(kāi),簡(jiǎn)單易用。WEditor可方便獲取到元素的Xpath屬性(Xpath是元素的絕對(duì)唯一屬性)。
(2)測(cè)試腳本工程架構(gòu)。
基于UIAutmator2的自動(dòng)化測(cè)試工具框架及整體運(yùn)行流程設(shè)計(jì)如圖2所示。
圖2 UIAutomator2自動(dòng)化測(cè)試工具框架及流程
① Main.py為測(cè)試引擎,主要完成測(cè)試報(bào)告的創(chuàng)建、測(cè)試套件配置參數(shù)的獲取、各種路參數(shù)徑的獲取、測(cè)試命令下發(fā)等。
② Config路徑下存放test_cfg.py和xpath_cfg.py。前者用于存儲(chǔ)測(cè)試套件的配置參數(shù),如測(cè)試環(huán)境、用例、數(shù)據(jù)等。后者用于存儲(chǔ)測(cè)試用例用到的參數(shù),如XPath值、Can信號(hào)值等。
③ TestCases路徑下存放所有測(cè)試腳本文件,每個(gè)功能模塊對(duì)應(yīng)一個(gè).py文件,每個(gè)測(cè)試用例對(duì)應(yīng)一個(gè)函數(shù),用例運(yùn)行策略由Pytest裝飾器參數(shù)值指定。
④ util.py是一個(gè)集合了所有公共函數(shù)的Python文件,如環(huán)境恢復(fù)、xml文件解析、用戶(hù)操作、Can信號(hào)收發(fā)、Log抓取、系統(tǒng)狀態(tài)檢查等。
⑤ TestReports路徑下存放測(cè)試報(bào)告,每輪測(cè)試都會(huì)創(chuàng)建一個(gè)新的網(wǎng)頁(yè)版測(cè)試報(bào)告。測(cè)試報(bào)告中可以包含測(cè)試結(jié)果、執(zhí)行時(shí)間、測(cè)試用例的通過(guò)或失敗狀態(tài)等信息。
(3)Can 信號(hào)收發(fā)工具使用開(kāi)發(fā)。
本文工具針對(duì)Pcan測(cè)試儀開(kāi)發(fā)Python腳本,通過(guò)對(duì)PCanBasic.dll進(jìn)行二次開(kāi)發(fā)來(lái)實(shí)現(xiàn)。PCan Basic.dll的原生函數(shù)有:Initialize(初始化一個(gè)PCan設(shè)備的PCan通道)、Uninitialize(取消初始化)、GetStatus(獲取當(dāng)前PCan通道的Bus狀態(tài))、Read(從消息接收隊(duì)列中讀取Can消息及其時(shí)間戳)、Write(發(fā)送Can消息)等函數(shù),對(duì)上述源碼進(jìn)行Python二次封裝,編寫(xiě)更易于測(cè)試人員使用、更符合項(xiàng)目需求的公共方法(如Send()、Receive()、Check())等,匯集到PCanBasic.py文件,測(cè)試用例中導(dǎo)入PCanBasic.py即可使用封裝的函數(shù)。
在產(chǎn)品開(kāi)發(fā)的中后期階段,系統(tǒng)已逐步趨于穩(wěn)定,每次軟件發(fā)布版本后使用自動(dòng)化腳本即可完成大部分基礎(chǔ)功能驗(yàn)證,無(wú)需人工再次輪詢(xún)測(cè)試用例,極大地節(jié)省了人力和時(shí)間成本。此外,在壓力和性能測(cè)試方面,該工具獲取的數(shù)據(jù)比手動(dòng)測(cè)試更為科學(xué)準(zhǔn)確,幫助了產(chǎn)品團(tuán)隊(duì)迅速準(zhǔn)確地了解產(chǎn)品的性能,為產(chǎn)品的優(yōu)化和改進(jìn)提供了堅(jiān)實(shí)的依據(jù)。UIAutomator2自動(dòng)化測(cè)試工具在保證產(chǎn)品質(zhì)量、提高測(cè)試效率以及節(jié)省時(shí)間和人力成本等方面都發(fā)揮了人工測(cè)試不可替代的作用。
本文通過(guò)對(duì)智能Andriod車(chē)機(jī)系統(tǒng)穩(wěn)定性測(cè)試方案及Monkey和UIAutomator2自動(dòng)化測(cè)試工具的研究,設(shè)計(jì)并實(shí)現(xiàn)了2種自動(dòng)化穩(wěn)定性測(cè)試工具。這些工具在實(shí)際項(xiàng)目中切實(shí)提高了工作效率和產(chǎn)品質(zhì)量。隨著車(chē)聯(lián)網(wǎng)和智能網(wǎng)聯(lián)產(chǎn)品的不斷發(fā)展,IVI娛樂(lè)系統(tǒng)的穩(wěn)定性測(cè)試將越來(lái)越受到重視,類(lèi)似的自動(dòng)化測(cè)試工具將發(fā)揮更為廣泛和重要的作用,對(duì)于推動(dòng)車(chē)載智能產(chǎn)品的發(fā)展有著重要的意義。