建立Appium iOS UI 自動化測試環境


一直以來,想做iOS UI自動化測試常會被其複雜的環境設定自動勸退...

這篇不提太多Appium iOS的運作原理

只介紹怎麼一步步地將iOS自動化測試環境搭建起來

01_titleimage

iOS 9 以後的Appium架構

一圖流說明目前的iOS Appium運作方式
image

安裝前的準備項目

在我們開始前,請先準備好這些:
  1. 一台Mac machine (MacOS > 10.10)
  2. iPhone 手機 (iOS > 9.3)
    進入開發者選項打開UI Automation設定
  3. 準備Apple Developer 帳號
    具備足夠權限能夠將開發專案build到手機上
  4. 將要測試的手機加到Apple developer受信任的裝置列表上
    這樣才能把app build到iPhone實機上, 很多人會忘記做這步驟
這些詳細設定方式就不花太多篇幅在這裡寫出來了

前置環境設定

如果你有follow之前介紹Android Appium在Mac的自動化環境設定
我們應該已經裝好下面這些工具:
  1. Java 1.8
  2. Python 3.5.4
  3. Homebrew
  4. Nodejs
  5. Appium
  6. Appium GUI Server
請確認這些都有正確裝好,有遇到問題可以參考之前介紹的安裝步驟
安裝Android & Appium測試環境 (Mac)

前置環境設定

想要在Mac上執行iOS Appium自動化測試
我們還需要安裝這些工具:
  1. Xcode (9.4以上)
  2. Xcode Command line tools
  3. libimobiledevice
    從command line對iOS 10 以上device進行各種操作
  4. ideviceinstaller
    從command line對iOS 9 device進行各種操作
  5. ios-deploy
    Install and debug iOS apps without using Xcode
  6. Carthage
    用來管理Cocoa application的第三方管理庫
  7. Facebook的WebdriverAgent
    一個WebDriver Server讓我們能由遠端控制iOS device
Now Follow me, you can make it

Xcode

  1. 安裝最新版本Xcode ex. 9.4.1 (支援iOS 11.1)
    02_xcodeinst
  2. 假如你的OS版本不夠新, 先把macOS升級完成再回來升級Xcode
    03_xcodeinst2
    04_xcodeinst3

Xcode command line tool

  1. 在Terminal執行
    xcode-select --install
    05_xcodecommandlinetool01
  2. 接著執行
    sudo xcode-select -switch /Applications/Xcode.app/Contents/Developer
    這會將Xcode commande line指到正確的位置

libimobiledevice

libimobiledevice又稱libiphone,是一個開源包
可以讓Linux支持連接iPhone/iPod Touch等iOS設備做各種操作
  1. 在Terminal執行
    brew install libimobiledevice --HEAD
    07_libimobiledevice02

ideviceinstaller

libimobiledevice 是一個跨平臺的軟體庫, 應用軟體可以通過這個開發包輕鬆訪問裝置做各種操作
  1. 執行指令
    brew install ideviceinstaller
    10_ideviceinstall01

ios-deploy

ios-deploy是一個用來安裝和Debug iOS app的command line工具
  1. 在Terminal輸入
    npm install -g ios-deploy
    08_ios-deploy

Carthage

Carthage是一個較新的 Cocoa 開發第三方套件管理工具
  1. 執行指令
    brew install carthage
    09_carthage

WebDriverAgent

  • Facebook 出品
  • 在iOS端實現了一個server, 通過server可以遠程控制iOS設備(啟動,關閉應用程式, 點擊和滾動等動作)
  • 通過連接XCTest.framework調用Apple的API執行動作
注意事項:
  1. 用Appium 1.8以前版本的同學需要到Facebook去下載他們的WedDriverAgent(WD)
    https://github.com/facebook/WebDriverAgent
    然後將Appium自帶的WebdriverAgent改成使用Facebook提供的版本
  2. 用1.8以後的版本可以直接用Appium自帶的WD, 但仍然需要重新編譯

XCpretty

用來將xcodebuild的輸出格式化,並包含輸出report功能
  1. 執行
    sudo gem install xcpretty
    11_xcpretty

編譯與設定WebDriverAgent

安裝完上面的前置環境設定後,我們還需要準備讓WebDriverAgent能夠運作在我們的測試裝置上
這裡我會用UI Catalog這個sample app來示範如何完成這些設定步驟
  1. 先找出appium安裝路徑
    which appium
  2. 切換到Appium WebDriverAgent所在的路徑
    cd /usr/local/lib/node_modules/appium/node_modules/appium-xcuitest-driver/WebDriverAgent.
  3. 執行下面兩個指令來設定project
    mkdir -p Resources/WebDriverAgent.bundle
    ./Scripts/bootstrap.sh -d
    12_wda01
  4. 從Finder打開Appium WebDriverAgent資料夾
    cd /usr/local/lib/node_modules/appium/node_modules/appium-xcuitest-driver/WebDriverAgent
    open .
  5. 開啟WebDriverAgent.xcodeproj檔案
    13_wda02
  6. 打開WebDriverAgentRunner panel
  7. 將Target App設定成IntegrationApp
    勾選Automatically manage signing
    設定Apple developer ID
    14_wda03
  8. 切換到IntegrationApp panel
  9. 將預設的bundle id 修改增加一些字串
    設定可用的Apple developer ID
    15_wda04
  10. 上方選擇IntegrationApp, 先設定目標為iOS模擬器
    按下Play button, 確認可以將IntegrationApp成功的build進模擬器中
    18_wda07
  11. 接下來切換測試裝置, 改成用iPhone實機
    按下Play button, 確認可以將IntegrationApp成功的build進iPhone實機上

設定測試用Sample app

我們要有測試用iOS app來確認環境有正確設定完成
能夠透過Appium在指定的測試裝置上啟動這個app
Appium有提供一個iOS測試的sample app (UICatalog)
  1. Clone iOS sample app from appium github repository
    git clone https://github.com/appium/ios-uicatalog
  2. 切換到UI Catalog路徑下,執行UICatalog.xcodeproj
    20_uicatalog01
  3. 勾選Automatically manage signing
    按下Add Account
    21_uicatalog02
  4. 新增具備apple developer身分的帳號
    22_uicatalog03
  5. 修改UICatalog預設的Bundle Identifier, 新增一些字串
    23_uicatalog04
  6. 新增Apple ID, 產生certificate和profile
    24_uicatalog05
  7. 選擇上方目標裝置為iOS模擬器, 按下Play button
    25_uicatalog06
  8. 確認UICatalog app能成功地build到模擬器上並且啟動測試
    26_uicatalog07
  9. 選擇上方目標裝置為iPhone實機, 按下Play button
    27_uicatalog08
  10. 確認UICatalog app能成功地build到iPhone手機上並且啟動測試
    28_uicatalog09

從程式碼啟動iPhone手機

現在我們已經能將WebDriverAgent和測試app build到iPhone手機或是模擬器上面了
最後一步就是要測試能夠從我們自己寫的程式來啟動測試裝置上的UICatalog app
這裡我們用Python語言做為範例
  1. 新增一個Pytest test script
  2. 設定底下這些Desired Capabilities
'platformName': 'iOS',
'automationName': 'XCUITest',
'platformVersion': '11.3',
'deviceName': 'Dag 的 iPhone6',
'udid': '4b80a4be0e13ae77338e9254e10b66ec9e2674ac',
'bundleId': 'com.example.apple-samplecodexxx.UICatalog',
'noReset': 'true',
'autoAcceptAlerts': 'true',
automationName 代表使用的底層UI Instrument
deviceName 是iPhone實機的裝置名稱
udid 代表實體手機的id, 可以從Xcode上面看到
bundleId 指的要在手機上測試的app id
  1. 執行這個pytest script 就能從code去啟動手機上的UICatalog app

從程式碼啟動iOS模擬器

  1. 和上面的步驟相同, 差別只在要設定不同的Desired Capabilities
'platformName': 'iOS',
'automationName': 'XCUITest',
'platformVersion': '11.4', 'deviceName': 'iPhone 8 Plus',
'bundleId': 'com.example.apple-samplecodexxx.UICatalog',
'noReset': 'true',
'autoAcceptAlerts': 'true',
'command-timeout': '600000000',
和手機的設定不同的地方在於deviceName要設定成Xcode裡面看到的模擬器名稱
  1. 執行這個pytest script 就能從code去啟動模擬器上的UICatalog app

Reference:

Comments