SoloPi 架構解析 | 錄製回放的原理與實戰

SoloPi 架構解析介紹

SoloPi,源自於支付寶開源,面向移動端實現的一套無線化、非侵入、免 Root 的 Android 專項工具,可以脫離 PC 環境,在移動端實現自動化的功能、性能及兼容性測試,下降廣大測試開發者的測試成本,提高測試效率。 經過本文咱們將開啓《SoloPi 架構解析》連載,圍繞 SoloPi 在「錄製回放」、「性能測試」、「一機多控」等方面的實踐展開,從而深度分析在相應能力的構建與優化過程當中,SoloPi 沉澱了怎樣的設計思路與實戰經驗。node

  • 本文做者:android

    • 茅舍,來自支付寶,SoloPi 核心做者之一
  • 本文概覽:git

    • SoloPi 錄製回放 - 錄製操做
    • SoloPi 錄製回放 - 用戶操做監控與控件獲取
    • SoloPi 錄製回放 - 更多控件介紹&功能分類
    • SoloPi 錄製回放 - 用例回放

錄製回放是什麼?

關於錄製回放,你們若是對具體功能還不是很是清晰,能夠先閱覽下面這個視頻:github

視頻完整呈現了 SoloPi 錄製回放的全過程,覆蓋「用例錄製」、「用例編輯」以及「用例回放」。所以,經過 SoloPi,開發者有能力在徹底不插線的狀況下,實現自動化用例的錄製,並基於多種設備完成回放動做。 那麼,SoloPi 是如何作到基於移動端進行自動化用例的錄製和回放?畢竟自動化框架的核心在於「控件獲取」和「事件驅動」,這兩點每每依賴 PC 完成驅動;而在手機端,因爲系統的權限管控,每每很難實現相似的功能,所以咱們不多見到相似的移動端自動化測試工具。 接下來,咱們將經過錄制回放通用模式下的一個具體事例,來爲你們展開分析 SoloPi 錄製回放的具體原理。算法

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 主要經過AbstractProviderAbstractNodeProcessor這兩個類來獲取控件信息:經過AbstractProvider獲取控件的原始數據,並生成原始樹結構,而 AbstractNodeProcessor 則着眼於處理單個控件節點信息,實現控件樹的完善與結構擴展。有興趣的讀者也能夠嘗試實現這兩個類,定義本身的控件結構。

  • 關於功能分類

選擇控件後,SoloPi 會彈出具體的操做選擇頁面,包含點擊操做輸入操做滑動操做邏輯操做擴展操做五大類。以「點擊操做」爲例,SoloPi 提供了五種功能,前兩種功能(點擊及長按)不用贅述,第三種爲發現則點擊,意味着若是發現了特定控件,則進行點擊,主要用於處理彈窗和部分非必然出現的場景,快速點擊用於處理一些容易消失的控件,好比播放器的控制器。此外,重複點擊意味着針對某一個特定位置完成重複性的點擊動做。

當開發者選擇完相應操做後,SoloPi 便啓動自動執行。面對部分耗時較長的操做,SoloPi 的圖標將變成紅色,待圖標變回黃色時,意味着操做已執行完畢。以上,咱們便完成了一步操做的錄製。 而對於部分非控件類型的操做,如滑動屏幕,返回,Sleep 等不針對特定控件的操做,須要點擊屏幕右側的 SoloPi 圖標(以下圖所示),從而喚起全局操做框(注意,全局操做模式下屏幕不會顯示紅框)。在全局操做框下,開發者選擇對應的操做完成執行動做,而操做類型主要分爲「經常使用操做」、「應用操做」、「滑動操做」、「設備操做」、「擴展功能」與「流程管控」六大類。

用例回放

錄製完成後,就能夠在最近錄製查看所有用例中看到完成好的錄製用例。點擊用例,會跳轉到測試的應用,並顯示懸浮窗,點擊綠色三角便可開始回放。 回放時,SoloPi 會先高亮查找到的控件,而後再執行操做。

整套 SoloPi 的錄製回放,基於同一套邏輯,包括控件結構構建、控件定位、事件驅動三個部分。二者的區別主要在於控件定位:

  • 在錄製過程當中,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,在過程當中遇到任何疑惑,或者痛點,請積極反饋建議。期待和你們可以持續共建 SoloPi,拓展並完善更多能力。 也能夠經過釘釘掃碼如下二維碼,進入「SoloPi 釘釘交流羣」,期待你的加入。

| 活動推薦

8/11 週日,SoloPi 將首次在線下展現「Android+iOS」雙端如何打通核心能力及實現原理,也將展望後續 SoloPi 將如何與螞蟻金服雲測平臺,用例管理,IDE 等能力進行配合互動,輸出自動化測試方案。 歡迎掃碼報名,咱們廣州見。

往期閱讀

《開篇 | 螞蟻金服 mPaaS 服務端核心組件體系概述》

《螞蟻金服 mPaaS 服務端核心組件:億級併發下的移動端到端網絡接入架構解析》

《mPaaS 核心組件:支付寶如何爲移動端產品構建輿情分析體系?》

《mPaaS 服務端核心組件:移動分析服務 MAS 架構解析》

《螞蟻金服面對億級併發場景的組件體系設計》

《自動化日誌收集及分析在支付寶 App 內的演進》

關注咱們公衆號,得到第一手 mPaaS 技術實踐乾貨

QRCode

釘釘羣:經過釘釘搜索羣號「23124039」

期待你的加入~

相關文章
相關標籤/搜索