SoloPi,源自於支付寶開源,面向移動端實現的一套無線化、非侵入、免 Root 的 Android 專項工具,可以脫離 PC 環境,在移動端實現自動化的功能、性能及兼容性測試,下降廣大測試開發者的測試成本,提高測試效率。 經過本文咱們將開啓《SoloPi 架構解析》連載,圍繞 SoloPi 在「錄製回放」、「性能測試」、「一機多控」等方面的實踐展開,從而深度分析在相應能力的構建與優化過程當中,SoloPi 沉澱了怎樣的設計思路與實戰經驗。node
本文做者:android
本文概覽:git
關於錄製回放,你們若是對具體功能還不是很是清晰,能夠先閱覽下面這個視頻:github
視頻完整呈現了 SoloPi 錄製回放的全過程,覆蓋「用例錄製」、「用例編輯」以及「用例回放」。所以,經過 SoloPi,開發者有能力在徹底不插線的狀況下,實現自動化用例的錄製,並基於多種設備完成回放動做。 那麼,SoloPi 是如何作到基於移動端進行自動化用例的錄製和回放?畢竟自動化框架的核心在於「控件獲取」和「事件驅動」,這兩點每每依賴 PC 完成驅動;而在手機端,因爲系統的權限管控,每每很難實現相似的功能,所以咱們不多見到相似的移動端自動化測試工具。 接下來,咱們將經過錄制回放通用模式下的一個具體事例,來爲你們展開分析 SoloPi 錄製回放的具體原理。算法
首先進入錄製回放首頁,點擊右上角能夠切換須要測試的應用。 這裏咱們以 Snapseed 做爲待測應用(SnapSeed 是一個圖像處理工具)。小程序
點擊開始執行,SoloPi 會自動跳轉到對應應用,並顯示一個懸浮窗。點擊懸浮窗綠色三角,便可開始用例錄製。網絡
在用例錄製狀態下,當你點擊屏幕任意一個位置,SoloPi 會監控到具體的點擊位置,並將這個位置的控件進行高亮。架構
如圖所示,黃點表示用戶點擊的座標,紅框表示 SoloPi 獲取的待操做控件。SoloPi 經過獲取到用戶點擊時的座標,以及當前頁面的控件結構,來實現這種功能。併發
關於用於操做監控與控件獲取,熟悉 Android 系統的開發者可能首先會想到 AccessibilityService。 AccessibilityService 可以獲取用戶的操做事件並關聯對應的控件,確實能夠實現大部分功能。但 AccessibilityService 也有不足的地方,好比面向 HTML5 場景,輔助功能獲取控件會出現延遲從而致使獲取的控件結構不夠精確;另外,對於部分自定義控件,輔助功能只能獲取到對應的控件,但缺少具體的座標信息,從而致使控件操做不符合預期。 爲了應對以上不足,SoloPi 採起了「結合 Android 系統 getevnet 功能」策略,經過直接解析系統原生事件,獲取到用戶的操做行爲。框架
關於 getevent 的具體內容,能夠看一下 Google 提供的相關文檔: source.android.com/devices/inp…
簡單來講,經過 getevent,SoloPi 能夠獲取到用戶操做屏幕的具體座標,以及手指落下、擡起的具體時間。
不過,getevent 命令的使用須要 SHELL 權限,這限制了普通 Android 應用獲取相關數據的能力。SoloPi 經過Android 系統的無線調試功能實現了一套純端的 SHELL 執行能力,可以在 Android 系統上執行 adb 相關命令,這塊兒的具體介紹能夠參考《SoloPi:支付寶開源的 Android 專項測試工具》 經過 getevent 命令,SoloPi 獲取到了用戶點擊的具體座標。結合 AccessibilityService 的控件結構樹,咱們即可以查找到用戶實際想要操做的控件了。 或許有人會問,咱們既然可以獲取用戶的操做,以及屏幕上的控件信息,爲何錄製時要卡一道,選擇對應的操做,直接讓用戶進行操做很差嗎?確實,直接操做的體驗會更加順滑,但 SoloPi 經過選擇功能的界面,既能夠給用戶一個二次確認的機會,防止進行誤操做,又可以提供更多的功能。此外,錄製模式與回放模式走的是同一套執行機制,能夠更好的保證用例回放的成功率。
經過輔助功能,能夠獲取到比較完整的 Native 控件結構,但對於最近較爲火熱的 HTML五、小程序的控件結構,就顯得較爲力不從心了。 針對 HTML五、小程序,SoloPi 經過 ChromeDevtoolProtocal 與 Chrome 內核通訊從而獲取到頁面結構。這種方式一樣基於 SoloPi 的 SHELL 能力,與可調試的 Chrome 內核完成通訊,實現了 PC 上的 Chrome Driver 功能。經過注入 JS 獲取到 HTML5 頁面的完整控件結構信息。同時,SoloPi 可以將 Native 結構的控件信息與 HTML5 結構的控件信息進行統一,從而構建出一個既包含 Native 結構,也包含 HTML5 結構的頁面結構樹,讓用戶擺脫來回切換控件結構的困擾。
此外,在一些經過圖像引擎渲染的場景,不論是 Native 模式,仍是小程序、HTML5 模式,以上解決思路都沒法正常執行。所以,SoloPi 提供了圖像查找模式,根據圖像的特徵來進行查找,補足在遊戲、AR 方面的自動化能力。
SoloPi 主要經過AbstractProvider
和AbstractNodeProcessor
這兩個類來獲取控件信息:經過AbstractProvider
獲取控件的原始數據,並生成原始樹結構,而 AbstractNodeProcessor
則着眼於處理單個控件節點信息,實現控件樹的完善與結構擴展。有興趣的讀者也能夠嘗試實現這兩個類,定義本身的控件結構。
選擇控件後,SoloPi 會彈出具體的操做選擇頁面,包含點擊操做、輸入操做、滑動操做、邏輯操做與擴展操做五大類。以「點擊操做」爲例,SoloPi 提供了五種功能,前兩種功能(點擊及長按)不用贅述,第三種爲發現則點擊,意味着若是發現了特定控件,則進行點擊,主要用於處理彈窗和部分非必然出現的場景,快速點擊用於處理一些容易消失的控件,好比播放器的控制器。此外,重複點擊意味着針對某一個特定位置完成重複性的點擊動做。
當開發者選擇完相應操做後,SoloPi 便啓動自動執行。面對部分耗時較長的操做,SoloPi 的圖標將變成紅色,待圖標變回黃色時,意味着操做已執行完畢。以上,咱們便完成了一步操做的錄製。 而對於部分非控件類型的操做,如滑動屏幕,返回,Sleep 等不針對特定控件的操做,須要點擊屏幕右側的 SoloPi 圖標(以下圖所示),從而喚起全局操做框(注意,全局操做模式下屏幕不會顯示紅框)。在全局操做框下,開發者選擇對應的操做完成執行動做,而操做類型主要分爲「經常使用操做」、「應用操做」、「滑動操做」、「設備操做」、「擴展功能」與「流程管控」六大類。
錄製完成後,就能夠在最近錄製與查看所有用例中看到完成好的錄製用例。點擊用例,會跳轉到測試的應用,並顯示懸浮窗,點擊綠色三角便可開始回放。 回放時,SoloPi 會先高亮查找到的控件,而後再執行操做。
整套 SoloPi 的錄製回放,基於同一套邏輯,包括控件結構構建、控件定位、事件驅動三個部分。二者的區別主要在於控件定位:
與以往自動化框架經過指定文字、ID 進行查找不一樣,SoloPi 的控件查找算法會綜合控件的各種信息,包括文字、描述、resourceId、Xpath、圖像信息,對控件進行打分,並經過錄制時的位置信息進行輔助定位,肯定目標控件,從而實現較爲精確地回放查找。
SoloPi 的用例是以 JSON 操做序列的形式保存,每一步操做都被分爲操做控件與操做方法兩部分,操做控件部分包含了原始控件的各種信息,包括文字、圖像、resourceId、Xpath、座標等信息,而操做方法則包含具體的操做類型、方法參數這些信息。 除了在 SoloPi 應用間傳遞, SoloPi 用例也支持轉化爲 Appium 、 Macaca 的用例格式,能夠在各類運行環境進行回放。
{
"operationId": "dt24chb7ar",
"operationIndex": 0,
"operationMethod": { // 操做方法
"actionEnum": "CLICK", // 操做方法
"encrypt": false, // 是否加密
"operationParam": {
"localClickPos": "0.7982456,0.5479452" // 相對於控件的位置
}
},
"operationNode": { // 操做節點
"assistantNodes": [ // 輔助定位節點
{
"className": "android.widget.ImageView",
"parentHeight": 1,
"resourceId": "tv.danmaku.bili:id/tab_icon"
},
{
"className": "android.widget.TextView",
"parentHeight": 1,
"resourceId": "tv.danmaku.bili:id/tab_text",
"text": "會員購"
}
],
"className": "android.widget.LinearLayout",
"depth": 12,
"extra": {
"captureImage": "/9j/4AAQSkZJRgABAQAAAQABAAD/2wBDAAEBAQEBAQEBAQEBAQEB......", // 截圖
"originSize": "720,1480", // 截圖尺寸
"screenSize": "1440,2960" // 原始屏幕大小
},
"id": "-4294967206",
"nodeBound": { // 控件座標
"bottom": 2878,
"empty": false,
"left": 1203,
"right": 1317,
"top": 2732
},
"nodeType": "AccessibilityNodeTree",
"packageName": "tv.danmaku.bili",
"xpath": "/android.widget.FrameLayout/android.widget.LinearLayout[1]/android.widget.FrameLayout/android.widget.FrameLayout/android.widget.FrameLayout/android.support.v4.widget.DrawerLayout/android.widget.FrameLayout/android.view.ViewGroup/android.widget.FrameLayout[2]/android.widget.LinearLayout[1]/android.widget.FrameLayout[4]/android.widget.LinearLayout"
}
}
複製代碼
經過本文,咱們針對 SoloPi 在 Android 端錄製回放的全流程及具體實現原理展開解析,後續咱們將圍繞「一機多控」、「性能測試」、「用例的高級玩法」展開分享。
目前 SoloPi 已正式開源,歡迎 Star 咱們:
在 SoloPi 體驗過程當中,遇到任何問題,歡迎提交 Issue:
但願你們可以嘗試體驗 SoloPi,在過程當中遇到任何疑惑,或者痛點,請積極反饋建議。期待和你們可以持續共建 SoloPi,拓展並完善更多能力。 也能夠經過釘釘掃碼如下二維碼,進入「SoloPi 釘釘交流羣」,期待你的加入。
8/11 週日,SoloPi 將首次在線下展現「Android+iOS」雙端如何打通核心能力及實現原理,也將展望後續 SoloPi 將如何與螞蟻金服雲測平臺,用例管理,IDE 等能力進行配合互動,輸出自動化測試方案。 歡迎掃碼報名,咱們廣州見。
《螞蟻金服 mPaaS 服務端核心組件:億級併發下的移動端到端網絡接入架構解析》
《mPaaS 核心組件:支付寶如何爲移動端產品構建輿情分析體系?》
釘釘羣:經過釘釘搜索羣號「23124039」
期待你的加入~