Android自動化測試基礎 — ADB介紹

  • 2019 年 10 月 5 日
  • 筆記

前言

每一個準備學習Android自動化測試的同學,都會面臨一個Android自動化測試框架的選擇問題。與之前PC和WEB的測試框架不同,Android的自動化框架乍一看,非常的唬人。接踵而來的問題就是:怎麼能有這麼多呢,到底要選擇哪一個呢?

通過這篇文章的介紹,希望能幫助到想了解或者進行Android自動化測試的同學,對Android自動化測試和框架有一個快速的入門和了解。

聽說過的Android自動化框架

首先,你聽過的Android自動化測試框架/工具可能有如下這些(不限於此):

  • appium
  • uiautomator
  • uiautomator2
  • uiautomation
  • adb
  • Robotium
  • Espresso
  • Instrumentation
  • Monkey
  • monkeyrunner

當然你還可能接觸到其它的自動化框架,比如:

  • python版的uiautomator和uiautomator2
  • 騰訊的QT4A
  • 網易的AirTest
  • 基於JVM的Roboletric

But,本文主要介紹的還是上面第一波所列出來的相關框架的內容。因為它們相(我)對(有)常(了)見(解)。

最基礎的Android工具

不管你最終選擇了哪個自動化的框架,你始終都繞不過的就是ADB(Android Debug Bridge)工具。它是Android開發調試和自動化測試的基礎工具,很多其它工具和框架都會在底層調用它來完成一些事情。

ADB的基礎原理

就好比了解一個人,先了解他的底細一樣;了解一個工具,要先了解它的基本原理。否則在使用過程中「尥蹶子」就不好了。如果你在網上搜ADB原理,會出現很多很多的相關文章,所以這裡就只做一個簡單的說明,想要挖局更多細節的可以自行深入。

這是一張ADB全局的通訊邏輯圖,從圖中可以知道ADB是一套工具集,它包含:

  • adb client(運行在PC上的命令行工具)
  • adb server(運行在PC上的後台服務進程)
  • adbd(運行在設備或模擬器上的後台服務進程)

它們之間的通訊關係也是比較的清晰:

  • adb client <–TCP–> adb server(監聽5037埠) <–TCP–> adbd(監聽5555埠)

而它們的生命周期是這樣的:

  • adb client執行完就結束,跟普通命令行工具一樣
  • adb server在首次執行adb命令時會自動啟動,之後會一直運行在後台
  • adbd則是一直在手機上的後台運行,至於啟動時間點估計是在設置debug時

這是另外的一張原理圖,這個圖中說明了adbd內部的運行邏輯。另外還說明了adb server和adbd的另一種通訊方式 — USB連接。這是對上一張圖的補充,結合起來基本就是adb運行邏輯的全貌了。

而最終adbd能驅動Android的應用,則是因為它通過jdwp與JVM通訊達到的。(JDWP:Java Debug Wire Protocol)簡單說就是java的調試後門,通常用於遠程和線上調試。

ADB的基本命令

ADB的命令跟其它命令行工具差別不大,只是參數層次和可用參數多了點。這裡就只介紹下常(知)用(道)的命令:

adb devices        #查看當前已連接的設備和模擬器  adb connect ip.to.device    # 通過TCP的方式連接到指定的adb server, 即wifi連接  adb install /path/to/apk    # 安裝指定APK包  adb uninstall com.package.name    # 卸載指定的應用  adb push local remote        # 向設備發送文件  adb pull remote local        # 從設備下載文件  adb shell       # 進入連接shell模式  

這些命令裡面最強大的是adb shell,它其實是進入到Android系統的shell環境,可以執行Android的shell中所有的命令。如果你只是做一些簡單的Android自動化操作,那麼adb也許就可以滿足你的需求了。

除了上面提到的幾個命令,只通過adb還可以實現點擊、輸入、滑動、dump介面樹等功能。具體的命令如下:

# 點擊坐標點10,10  adb shell input tap 10 10  # 輸入文本1  adb shell input text 1  # 從坐標點100,410滑動到100,5  adb shell input swipe 100 410 100 5  # dump當前介面樹到指定文件  adb shell uiautomator dump /sdcard/ui.xml  # 啟動指定應用,並支援原生的scheme協議跳轉  adb shell am start -n com.cubic.autohome/.LogoActivity -d autohome://carfriend/circlerank  

是不是,很強大!!!如果不考慮大規模的開發用例,adb基本可以滿足我的很多常規需求了。想要了解更多其它框架的知識請關注TestQA公眾號!