Appium (1) — App 測試自動化框架

Kent Chen
MIDD — Man in Developer & Designer
7 min readApr 28, 2017

本文部分翻譯/摘錄自 Appium 官方文件以及 nishant@TestVagrant 所著之 Appium for Android,非常感謝他這份鉅細彌遺的導引。

本文將以簡介 Appium 為主。本系列將分為幾個部分:

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 所使用的自動化框架及其對應版本:

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

接下來…

REF

--

--