Appium介紹
Appium 是一個(gè)自動(dòng)化測試開源工具,支持 iOS 平臺(tái)和 Android 平臺(tái)上的原生應(yīng)用,web 應(yīng)用和混合應(yīng)用。
所謂的“移動(dòng)原生應(yīng)用”是指那些用 iOS 或者 Android SDK 寫的應(yīng)用。
所謂的“移動(dòng) web 應(yīng)用”是指使用移動(dòng)瀏覽器訪問的應(yīng)用(Appium 支持 iOS 上的 Safari 和 Android 上的 Chrome)。
所謂的“混合應(yīng)用”是指原生代碼封裝網(wǎng)頁視圖 —— 原生代碼和 web 內(nèi)容交互。
比如,像 Phonegap,可以幫助開發(fā)者使用網(wǎng)頁技術(shù)寫應(yīng)用,然后用原生代碼封裝,這些就是混合應(yīng)用。
重要的是,Appium 是一個(gè)跨平臺(tái)的工具:它允許測試人員使用同樣的接口,基于不同的平臺(tái)(iOS, Android)寫自動(dòng)化測試腳本。
這樣大大增加了 iOS 和 Android 測試套件間代碼的復(fù)用性。
想知道 Appium 如何支持平臺(tái),版本和自動(dòng)化形態(tài)的詳細(xì)信息,請(qǐng)參見platform support doc.
Appium 的理念
為了滿足移動(dòng)自動(dòng)化需求, Appium 遵循著某種理念。這種理念重點(diǎn)體現(xiàn)于以下 4 個(gè)需求:
- 你無需為了自動(dòng)化,而重新編譯或者修改你的應(yīng)用。
- 你不必局限于某種語言或者框架來寫和運(yùn)行測試腳本。
- 一個(gè)移動(dòng)自動(dòng)化的框架不應(yīng)該在接口上重復(fù)造輪子。(移動(dòng)自動(dòng)化的接口應(yīng)該統(tǒng)一)
- 無論是精神上,還是名義上,都必須開源。
Appium 設(shè)計(jì)
那么 Appium 架構(gòu)是如何實(shí)現(xiàn)這個(gè)哲學(xué)呢?為了滿足第一條,Appium 真正的工作引擎其實(shí)是第三方自動(dòng)化框架。
這樣,我們就不需在你的應(yīng)用里植入 Appium 特定或者第三方的代碼。這就意味著你在測試你將發(fā)布的應(yīng)用。我們
使用以下的第三方框架:
- iOS: 蘋果的UIAutomation: https://developer.apple.com/library/ios/documentation/DeveloperTools/Reference/UIAutomationRef/
- Android 4.2+: Google's UiAutomator: http://developer.android.com/tools/help/uiautomator/index.html
為了滿足第二點(diǎn),我們把這些第三方框架封裝成一套 API,WebDriver: http://docs.seleniumhq.org/projects/webdriver/
WebDriver (也就是 "Selenium WebDriver") 指定了客戶端到服務(wù)端的協(xié)議。
(參見JSON Wire Protocol: https://w3c.github.io/webdriver/webdriver-spec.html)。
使用這種客戶端-服務(wù)端的架構(gòu),我們可以使用任何語言來編寫客戶端,向服務(wù)端發(fā)送恰當(dāng)?shù)?HTTP 請(qǐng)求。
而且目前已經(jīng)有大多數(shù)流行語言版本的客戶端實(shí)現(xiàn)了。這也意味著你可以使用任何測試套件或者測試框架。客戶端庫就是簡單的
HTTP 客戶,可以以任何你喜歡的方式潛入你的代碼。換句話說,Appium 和 WebDriver 客戶端不是技術(shù)意義上的“測試框架”,
而是“自動(dòng)化庫”。你可以在你的測試環(huán)境中隨意使用這些自動(dòng)化庫!
事實(shí)上 WebDriver 已經(jīng)成為 web 瀏覽器自動(dòng)化的標(biāo)準(zhǔn),也成了 W3C 的標(biāo)準(zhǔn) —— https://dvcs.w3.org/hg/webdriver/raw-file/tip/webdriver-spec.html
我們又何必為移動(dòng)做一個(gè)完全不同的呢?
所以我們擴(kuò)充了WebDriver 的協(xié)議:https://github.com/SeleniumHQ/mobile-spec/blob/master/spec-draft.md,
在原有的基礎(chǔ)上添加移動(dòng)自動(dòng)化相關(guān)的 API 方法,這也也滿足了第三條理念。
第四條就不用說了,Appium 是開源的,https://github.com/appium/appium
Appium 概念
C/S 架構(gòu)
Appium 的核心是一個(gè) web 服務(wù)器,它提供了一套 REST 的接口。它收到客戶端的連接,監(jiān)聽到命令,
接著在移動(dòng)設(shè)備上執(zhí)行這些命令,然后將執(zhí)行結(jié)果放在 HTTP 響應(yīng)中返還給客戶端。事實(shí)上,這種客戶端/服務(wù)端的
架構(gòu)打開了許多可能性:比如我們可以使用任何實(shí)現(xiàn)了客戶端的語言來寫我們的測試代碼。比如我們可以把服務(wù)端放在不同
的機(jī)器上。
Session
自動(dòng)化總是在一個(gè) session 的上下文中運(yùn)行。客戶端初始化一個(gè)和服務(wù)端交互的 session。不同的語言有不同的實(shí)現(xiàn)方式,
但是最終都是發(fā)送一個(gè)附有 “desired capabilities” 的 JSON 對(duì)象參數(shù)的 POST 請(qǐng)求 “/session” 給服務(wù)器。
這時(shí)候,服務(wù)端就會(huì)開始一個(gè)自動(dòng)化的 session,然后返回一個(gè) session ID。
客戶端拿到這個(gè) ID,之后就用這個(gè) ID 發(fā)送后續(xù)的命令。
Desired Capabilities
Desired capabilities 是一些鍵值對(duì)的集合 (比如,一個(gè) map 或者 hash)。
客戶端講這些鍵值對(duì)發(fā)給服務(wù)端,告訴服務(wù)端我們想要啟動(dòng)怎樣的自動(dòng)化session。
根據(jù)不同的 capabilities 參數(shù),服務(wù)端會(huì)有不同的行為。比如,我們可以把
platformName
capability 設(shè)置為 iOS
,告訴 Appium 服務(wù)端,我們想要一個(gè)
iOS 的 session,而不是一個(gè) Android 的。我們也可以設(shè)置 safariAllowPopups
capability 為 true
,
確保在 Safari 自動(dòng)化 session 中,我們可以使用 javascript 來打開新窗口。
Appium Server
Appium server 是用 nodejs 寫的。我們可以用源碼編譯或者從 NPM 直接安裝。
Appium 服務(wù)端
Appium 服務(wù)端有很多語言庫 Java, Ruby, Python, PHP, JavaScript 和 C#,這些庫都實(shí)現(xiàn)了
Appium 對(duì) WebDriver 協(xié)議的擴(kuò)展。當(dāng)使用 Appium 的時(shí)候,你只需使用這些庫代替常規(guī)的 WebDriver 庫就可以了。
Appium.app, Appium.exe
我們提供了 GUI 封裝的 Appium server 下載。它封裝了運(yùn)行 Appium server 的所有依賴。
所以你需要擔(dān)心 Node。而且這個(gè)封裝包含了一個(gè) Inspector 工具,可以讓使用者檢查應(yīng)用的界面層級(jí)。
這樣寫測試用例的時(shí)候就非常方便了。
.Appium GUI下載地址: https://bitbucket.org/appium/appium.app/downloads/
.. toctree::
:maxdepth: 1
:numbered: 1
01_Appium_Python_API.rst
02_Appium_element_locate.rst
03_Appium_keyevent.rst
特別說明
本章非原創(chuàng),引用https://github.com/appium/appium/blob/master/docs/old/cn/intro.cn.md