天天看點

Macaca架構及基礎原理一、Macaca架構二、各子產品淺析三、Macaca執行流程圖四、結合執行個體講解Macaca基本原理

一、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/inspector

3. UI Recorder

macaca提供的腳本錄制工具,可以通過錄制獲得腳本,對于入門同學很有幫助。

https://macacajs.com/recorder

2.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,這樣就完成了一次請求的完整的生命周期。

下一篇: Macaca問題篇