一、Macaca架構
PS:上圖所有子產品均可以在官方github上找到對應的源碼
https://github.com/macacajs二、各子產品淺析
2.1、Macaca
2.1. macaca-cli
Macaca提供的指令行工具
$macaca server
啟動server
$macaca server --verbose
啟動server并列印詳細日志
$macaca doctor
檢驗目前macaca環境配置
2. app-inspector
macaca提供的元素查找工具,可以将app視圖的結構以布局結構樹的格式在浏覽器上展示出來,用過點選某個元素,就可以友善的查詢到該控件的基本資訊,以友善查找。具體使用可參考官網:
https://macacajs.com/inspector3. UI Recorder
macaca提供的腳本錄制工具,可以通過錄制獲得腳本,對于入門同學很有幫助。
https://macacajs.com/recorder2.2、WebDriver-Server
Macaca是按照經典的Server-Client設計模式進行設計的,也就是我們常說的C/S架構。WebDriver-server部分便充當了server這部分的角色,他的職責就是等待client發送請求并做出響應。
2.3、WebDriver-Client
client端簡單來講就是我們的測試代碼,我們測試代碼中的一些行為,比如控件查找、點選等,這些行為以http請求的方式發送給server,server接收請求,并執行相應操作,并在response中傳回執行狀态、傳回值等資訊。
也正是基于這種經典的C/S架構,是以client端具有跨語言的特點,macaca-wd,wd.java,wd.py分别是Macaca團隊針對Js Java 以及Python的封裝,隻要能保證client端遵循webdriver的協定,任意語言都可以。
2.4、DriverList
自動化要在不同的平台上跑,需要有對應平台的驅動,這部分驅動接收到來自server的操作指令,驅動各自平台的底層完成對應的操作。
1. Android
Macaca針對安卓平台的驅動集合
- macaca-android 安卓驅動
- macaca-adb 封裝了安卓的adb指令,來實作一些adb的操作,比如安裝、解除安裝、啟動app、擷取裝置清單這些操作
- android-unicode 經過封裝後的輸入法,解決中文輸入的問題
- uiautomator-client 将來自server的操作指令轉換為UIAutomator可以識别的指令,驅動uiautomator完成對應的操作
- android-performance 用于自動化測試安卓性能相關的支援
2. iOS
Macaca針對iOS平台的驅動集合
- macaca-ios iOS驅動
- xctest-client 同安卓的uiautomator-client異曲同工,對XCUITest的封裝,将來自server的操作指令轉換為XCUITest可以識别的指令,驅動XCUITest完成對應的操作
- ios-simulator 用于對ios模拟器的支援,可以通過模拟器運作用例
- remote-debug 用于遠端調試
3. Hybrid
Macaca針對Hybrid的驅動集合。
- macaca-chrome web測試驅動
- macaca-chromedriver 驅動chrome浏覽器
- ios-webkit-debug-proxy 适用于iOS平台對webview的調試
4. Electron
Macaca針對pc端網頁應用的支援
- macaca-electron
三、Macaca執行流程圖
了解了Macaca的組成子產品以及他們各自的作用,下面我們看一下各個子產品是如何組裝起來實作自動化測試流程的
四、結合執行個體講解Macaca基本原理
文章以百度外賣APP(iOS版)為例,下面我們開始我們的用例執行。
1. 啟動macaca server
從這一步列印的資訊我們可以看到,這一步實際上執行的是流程圖中第一步的操作,啟動server,建立連接配接,然後server傳回所連接配接的ip以及端口号,因為我們是本地跑,是以ip實際上是本機的ip位址
2. 執行用例
以指令行為例,先執行“” build工程,稍作等待,就會看到項目建構結果,如下圖所示
然後執行“”運作測試用例,稍作等待,就會看到系統自動啟動了ios的模拟器并跑起來了用例。執行過程中的某個截圖如下:
我們來看一下對應用例啟動的client端核心代碼:
在這段代碼中,我們做的工作是根據不同的平台設定用例的一些基礎啟動資訊,包含平台類型、安裝包位址、裝置id、是否覆寫安裝等參數,設定完成後,通過driver.initDriver(desiredCapabilities)這個操作啟動driver,這個過程便會按照流程圖中的第二個步驟發送http請求,server會接收到這個請求并建立一個session,在這次的用例執行中,所有的操作都會基于這個session進行,來看一下針對這個操作控制台所列印的資訊(為友善突出主要過程省略了部分無關日志):
經過如上步驟後,連接配接便已經成功建立了,下一步我們以添加商品為例再分析一下具體操作,對應的client端的代碼如下:
(因為架構層封裝了一些操作,是以代碼看上去比較少,具體的控件查找部分看不到,有需要詳細了解的可以研究源碼)
執行對應按鈕的操作,我們會在控制台上看到如下的日志:
在上面的日志中我們可以看到,當我們查找登入按鈕的時候,client發送了一個http請求給server,請求的操作是element(這個表示控件查找),參數是{"using":"name","value":"搜尋"},這是告訴server我們要找的這個控件的name屬性是“搜尋”,server收到這個請求,通過router路由轉發給iOS的驅動(在啟動driver的時候已經設定的平台類型,是以這裡能知道找ios),iOS驅動收到請求驅動XCUITest架構對模拟器上的目标app執行對應的控件查找操作,得到response後原路傳回給client,這樣就完成了一次請求的完整的生命周期。