Appium (1) — App 測試自動化框架
本文部分翻譯/摘錄自 Appium 官方文件以及 nishant@TestVagrant 所著之 Appium for Android,非常感謝他這份鉅細彌遺的導引。
本文將以簡介 Appium 為主。本系列將分為幾個部分:
- Appium (1):跨平台 App 測試自動化框架
- Appium (2):Test For Android
- Appium (3):Test For iOS
- Appium (4):Test For React Native
Appium
Appium 是一套開源的應用程式自動測試工具,它允許你在原生(Native),混合(Hybrid)以及 Mobile Web 三種不同類型的應用程式上進行自動測試。
在此順道簡介一下不同應用程式類型間的差異:
- 原生(Native) 指的是以 iOS、Android 或 Windows 提供的 SDK 工具所撰寫的 Apps。例如手機內建的電話 App。
- 混合(Hybrid) 涵蓋所有主要以 ”webview“ 包裝層、再以原生控制項與 web 內容互動的 App,例如所有以 PhoneGap 技術封裝的專案。
- Mobile Web 基本上則是透過手機內瀏覽器呈現的 Web App。Appium 支援以 Safari/Chrome 或是封裝好的 built-in ‘Browser’ App 進行自動化測試。
所以,React Native 以及基於其上的 Exponent 基本上屬於原生(Native)類別,當然支援。而執行環境部分,則可以使用模擬器或是在實機上進行測試。
最重要的是,Appium 是跨平台的測試工具:它允許你針對多個平台(iOS / Android / Windows)使用相同的 API 撰寫測試;換句話說,平台間的測試組合能夠有效地重用。
關於更多 Appium 所支援平台的詳細資料,請參考官方的 Platform Support Doc。
Appium 架構與設計哲學
Appium 的自動化設計哲學可以被概括成以下四條原則:
- 你不應該為了自動化而修改或重新編譯(recompile)你的應用程式。
- 你不應該被鎖定在特定語言或框架之下撰寫、及進行測試。
- 自動化測試框架的不應該在 APIs 重造輪子,重複已經有的東西。
- 無論在名義上、精神上,或是實做上,自動化測試框架應該是開源的。
基於原則 #1,Appium 實際上使用平台(Android / iOS / Windows)原先就提供的自動化框架進行操作,所以我們不需要把加入某種 Appium 專用的 lib、程式碼,或是任何第三方的框架之類的東西到 App 裡。
基於原則 #2,Appium 使用 WebDriver API(aka “Selenium WebDriver”)作為 client-server 協定,所以只要能夠發送正確 HTTP 請求的語言,通通透過 REST API 拉進來做成大雜燴!
換句話說,你可以在本機執行測試,由遠端的 Appium Server 替你跑出結果
,而且你可以用你喜歡的語言寫 test case
;同時你測試的 App 就是你所發行的 App
。
以下粗列 Appium 所使用的自動化框架及其對應版本:
- iOS: Apple’s UIAutomation
- Android 4.2+: Google’s UiAutomator
- Android 2.3+: Google’s Instrumentation. (Selendroid)
- Windows: Microsoft’s WinAppDriver (Supports UWP and Windows 10 PC).
Appium 整套架構大致如下圖:
基本上 Appium Server 就負責以下幾件事:
- 接收 Client 的連線
- 監聽指令
- 執行指令
- 回傳指令執行狀態
Client / Server
Appium 的核心是一個公開 REST API 的 Web Server。它負責監聽來自 Client 的連線與指令、並且把執行結果以 HTTP 狀態的方式回應。
所以我們得以使用各種不同語言撰寫測試程式 — 只要該語言擁有 HTTP Client API 即可;當然,還是用現成的 Appium client libraries 會比較方便。
基於這樣的架構,我們也能把 Appium Server 跟實際執行測試的環境分開,甚至把 Server 託管在類似 Sauce Labs 這樣的雲端服務上,視需要以提供更多的靈活性。
Session
基於每種 client-library 的不同,Client 會以特定的方式始化一段 session 並且把一組叫做 ”desired capabilities“ 的 JSON object 用 POST 的方式丟給 Server。
當收到 JSON 之後,Server 會建立一組對應的 automation-session 並回傳一組用於發送其他指令的 session ID。
Desired Capabilities
基本上這是一組 Key-Value 的組合值,用來告訴 Appium Server 要操作怎樣的對象。 Capabilities 會影響 Server 在自動化測試過程中的行為,例如我們可以設定 platformName
的值為 iOS
,告訴 Appium 我們要啟動一組 iOS 的 session。
或是,我們也能把 safariAllowPopups
設定為 true
,確保在進行 Safari automation session 的過程中能夠允許以 javascript 的方是開啟一個新的視窗。
例如,以下定義告訴 Appium 我們要使用 Appium v1.5 啟動一組操作 OS 為 Android 6.0、設備叫做 device
的 session(實際上此為 Genymoton 模擬器)。
exports.android23 = {
browserName: '',
'appium-version': '1.5',
platformName: 'Android',
platformVersion: '6.0',
deviceName: 'device',
app: undefined
};
如果你對其他 capabilities 的有興趣,請參考 capabilities doc。
Appium Server
Appium Server 是由 NodeJs 撰寫而成,你可以參考這份文件,自己 built && install 整個環境。或是直接經由 NPM 安裝:
$ npm install -g appium
覺得 NodeJs 麻煩嗎?你喜歡的話可以由 appium.io 下載 Appium Desktop App
,基本上就是已經封裝好 Server + GUI 介面,同時送一個可以讓你檢視 App 層次結構的 Inspector。
推薦使用
Appium Client & example tests
迫不及待想要開始你的自動化測試之旅嗎?
官網文件提到目前有 .NET, Java, Ruby, Python, PHP, JavaScript, C# 等 8 種語言支援 Appium 的 WebDriver 協定,你可以從這裡看到更多與 Client 端有關的資訊。
同時 Appium 官方也提供了這些語言的操作範例:Appium example tests。