建立Appium iOS UI 自動化測試環境
一直以來,想做iOS UI自動化測試常會被其複雜的環境設定自動勸退...
這篇不提太多Appium iOS的運作原理
只介紹怎麼一步步地將iOS自動化測試環境搭建起來
iOS 9 以後的Appium架構
一圖流說明目前的iOS Appium運作方式安裝前的準備項目
在我們開始前,請先準備好這些:- 一台Mac machine (MacOS > 10.10)
- iPhone 手機 (iOS > 9.3)
進入開發者選項打開UI Automation設定
- 準備Apple Developer 帳號
具備足夠權限能夠將開發專案build到手機上
- 將要測試的手機加到Apple developer受信任的裝置列表上
這樣才能把app build到iPhone實機上, 很多人會忘記做這步驟
前置環境設定
如果你有follow之前介紹Android Appium在Mac的自動化環境設定我們應該已經裝好下面這些工具:
- Java 1.8
- Python 3.5.4
- Homebrew
- Nodejs
- Appium
- Appium GUI Server
安裝Android & Appium測試環境 (Mac)
前置環境設定
想要在Mac上執行iOS Appium自動化測試我們還需要安裝這些工具:
- Xcode (9.4以上)
- Xcode Command line tools
- libimobiledevice
從command line對iOS 10 以上device進行各種操作
- ideviceinstaller
從command line對iOS 9 device進行各種操作
- ios-deploy
Install and debug iOS apps without using Xcode
- Carthage
用來管理Cocoa application的第三方管理庫
- Facebook的WebdriverAgent
一個WebDriver Server讓我們能由遠端控制iOS device
Now Follow me, you can make it
Xcode
- 安裝最新版本Xcode ex. 9.4.1 (支援iOS 11.1)
- 假如你的OS版本不夠新, 先把macOS升級完成再回來升級Xcode
Xcode command line tool
- 在Terminal執行
xcode-select --install
- 接著執行
sudo xcode-select -switch /Applications/Xcode.app/Contents/Developer
這會將Xcode commande line指到正確的位置
libimobiledevice
libimobiledevice又稱libiphone,是一個開源包可以讓Linux支持連接iPhone/iPod Touch等iOS設備做各種操作
- 在Terminal執行
brew install libimobiledevice --HEAD
ideviceinstaller
libimobiledevice 是一個跨平臺的軟體庫, 應用軟體可以通過這個開發包輕鬆訪問裝置做各種操作- 執行指令
brew install ideviceinstaller
ios-deploy
ios-deploy是一個用來安裝和Debug iOS app的command line工具- 在Terminal輸入
npm install -g ios-deploy
Carthage
Carthage是一個較新的 Cocoa 開發第三方套件管理工具- 執行指令
brew install carthage
WebDriverAgent
- Facebook 出品
- 在iOS端實現了一個server, 通過server可以遠程控制iOS設備(啟動,關閉應用程式, 點擊和滾動等動作)
- 通過連接XCTest.framework調用Apple的API執行動作
- 用Appium 1.8以前版本的同學需要到Facebook去下載他們的WedDriverAgent(WD)
https://github.com/facebook/WebDriverAgent
然後將Appium自帶的WebdriverAgent改成使用Facebook提供的版本
- 用1.8以後的版本可以直接用Appium自帶的WD, 但仍然需要重新編譯
XCpretty
用來將xcodebuild的輸出格式化,並包含輸出report功能- 執行
sudo gem install xcpretty
編譯與設定WebDriverAgent
安裝完上面的前置環境設定後,我們還需要準備讓WebDriverAgent能夠運作在我們的測試裝置上這裡我會用UI Catalog這個sample app來示範如何完成這些設定步驟
- 先找出appium安裝路徑
which appium
- 切換到Appium WebDriverAgent所在的路徑
cd /usr/local/lib/node_modules/appium/node_modules/appium-xcuitest-driver/WebDriverAgent.
- 執行下面兩個指令來設定project
mkdir -p Resources/WebDriverAgent.bundle
./Scripts/bootstrap.sh -d
- 從Finder打開Appium WebDriverAgent資料夾
cd /usr/local/lib/node_modules/appium/node_modules/appium-xcuitest-driver/WebDriverAgent
open .
- 開啟WebDriverAgent.xcodeproj檔案
- 打開
WebDriverAgentRunner
panel
- 將Target App設定成
IntegrationApp
勾選Automatically manage signing
設定Apple developer ID
- 切換到
IntegrationApp
panel
- 將預設的bundle id 修改增加一些字串
設定可用的Apple developer ID
- 上方選擇IntegrationApp, 先設定目標為iOS模擬器
按下Play button, 確認可以將IntegrationApp成功的build進模擬器中
- 接下來切換測試裝置, 改成用iPhone實機
按下Play button, 確認可以將IntegrationApp成功的build進iPhone實機上
設定測試用Sample app
我們要有測試用iOS app來確認環境有正確設定完成能夠透過Appium在指定的測試裝置上啟動這個app
Appium有提供一個iOS測試的sample app (UICatalog)
- Clone iOS sample app from appium github repository
git clone https://github.com/appium/ios-uicatalog
- 切換到UI Catalog路徑下,執行
UICatalog.xcodeproj
- 勾選Automatically manage signing
按下Add Account
- 新增具備apple developer身分的帳號
- 修改UICatalog預設的Bundle Identifier, 新增一些字串
- 新增Apple ID, 產生certificate和profile
- 選擇上方目標裝置為iOS模擬器, 按下Play button
- 確認UICatalog app能成功地build到模擬器上並且啟動測試
- 選擇上方目標裝置為iPhone實機, 按下Play button
- 確認UICatalog app能成功地build到iPhone手機上並且啟動測試
從程式碼啟動iPhone手機
現在我們已經能將WebDriverAgent和測試app build到iPhone手機或是模擬器上面了最後一步就是要測試能夠從我們自己寫的程式來啟動測試裝置上的UICatalog app
這裡我們用Python語言做為範例
- 新增一個
Pytest
test script
- 設定底下這些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 InstrumentdeviceName
是iPhone實機的裝置名稱udid
代表實體手機的id, 可以從Xcode上面看到bundleId
指的要在手機上測試的app id- 執行這個pytest script 就能從code去啟動手機上的UICatalog app
從程式碼啟動iOS模擬器
- 和上面的步驟相同, 差別只在要設定不同的Desired Capabilities
'platformName': 'iOS',和手機的設定不同的地方在於deviceName要設定成Xcode裡面看到的模擬器名稱
'automationName': 'XCUITest',
'platformVersion': '11.4', 'deviceName': 'iPhone 8 Plus',
'bundleId': 'com.example.apple-samplecodexxx.UICatalog',
'noReset': 'true',
'autoAcceptAlerts': 'true',
'command-timeout': '600000000',
- 執行這個pytest script 就能從code去啟動模擬器上的UICatalog app
Reference:
- Source: iOS開發的另類神器:libimobiledevice開源包
- Source: Appium iOS 自动化测试
Comments
Post a Comment