隨着移動終端的普及,手機應用愈來愈多,也愈來愈重要。而做爲測試的咱們也要與時俱進,努力學習手機App的相關測試,前一段時間咱們介紹了Robotium手機自動化測試框架,從本章開始,咱們介紹另外一個手機自動化測試框架Appium。那究竟什麼是Appium呢?咱們引用Appium官網的介紹以下:html
英文官網:http://appium.io/introduction.html?lang=zhjava
Appium是一個開源的自動化測試工具,其支持iOS和安卓平臺上的原生的,基於移動瀏覽器的,混合的應用。python
原生應用:僅使用iOS和安卓標準SDK編寫的應用web
基於移動瀏覽器的應用:用移動平臺的瀏覽器訪問的應用(Appium支持IOS上的Safari和安卓上的Chrome或內嵌的「瀏覽器」應用)瀏覽器
混合應用:把基於一個WebView實現的全部功能包裝成一個應用的應用,WebView是一個能夠和網頁各類元素交互的原生控件(譯者注:由於全部的移動平臺都會有瀏覽器,因此基於瀏覽器封裝起來的應用就能夠輕易作到跨平臺了)。Phonegap這些項目能夠很方便的把那些基於web技術實現的功能打封裝成一個混合應用。服務器
重要的是,Appium是跨平臺的:它容許你採用同一套API在不一樣的平臺(iOS,Android)上編寫測試代碼。這就讓測試套件在iOS和Android平臺上實現代碼複用成爲可能。網絡
至於有關Appium跨平臺支持和測試自動化模塊化的具體意義,請參考platform support doc.session
Appium是基於如下的四個理念設計來知足移動平臺測試自動化的要求的:架構
(1)您不該該由於須要自動化測試您的應用而不得不以任何形式去從新編譯或者修改你的app。app
(2)您不該該把本身固定在一門特定的語言和一個特定的框架上去實現和運行你的測試。
(3)當說到測試自動化APIs的時候,一個移動測試框架不該該作「從新發明輪子」的事情。
(4)一個移動測試自動化框架應該是開源的,不管是在精神上,實際上,仍是名義上!
那麼Appium項目的架構是如何知足這些理念的要求的呢?爲了實現第#1個要求,咱們在背後使用的是移動平臺供應商(譯者注:iOS的UIAutomation和Android的Instrumentation及UIAutomator)提供的標準自動化測試框架。這樣一來,咱們就不須要往你的app裏面編譯進去任何的Appium相關的或第三方代碼或框架。這就意味着「你測試的是你將要發佈的那一個應用」。咱們使用的移動平臺供應商提供的框架以下:
Ø IOS: 蘋果公司的 UIAutomation。
Ø Android 4.2+: Google公司的 UiAutomator。
Ø Android 2.3+: Google公司的 Instrumentation. (Instrumentation 的支持是經過綁定另一個獨立的Selendroid項目來實現的)。
爲了實現第#2個要求,咱們的作法是把不一樣的移動平臺供應商的自動化測試框架進行一次更高層次的封裝,作成一套統一的API暴露出來,也就是咱們要說的WebDriver API了。WebDriver(也叫作「Selenium WebDriver」)指定使用了一套客戶端-服務器端協議(也就是JSON Wire Protocol),基於這一套協議,客戶端不管是用什麼語言編寫的都可以經過HTTP請求恰當的發送到服務器。事實上如今已經存在有使用不一樣流行語言編寫的客戶端了。這也就意味着您能夠隨便使用任何你喜歡的測試執行過程管理平臺和測試框架,由於你使用到的Appium客戶端的庫僅僅是一個HTTP客戶端而已,你能夠用任何你喜歡的方式把它嵌入到你的代碼裏面去。換一個說法就是,Appium&WebDriver客戶端實際上並非真正的」測試框架「,而是"自動化測試庫」,你能夠藉助它們按照你本身喜歡的方式來搭建管理你的測試環境。
咱們使用一樣的方法實現了第#3個要求:鑑於WebDriver事實上已是網絡瀏覽器自動化測試的標準,而且已經立爲W3C的工做草案,那麼咱們有什麼必要針對移動設備再從新創建一套標準呢?沒有必要!咱們只須要擴展相應的WebDriver API來方便移動平臺測試自動化的使用就好了。
至於第#4點就不言而喻了--你如今在讀這篇文章這些內容就是由於Appium是開源的。
Appium的核心是一個暴露了REST API的網絡服務器。它接收客戶端過來的鏈接,監聽(客戶端過來的)命令,在移動設備上運行命令,而後把表明命令運行結果的HTTP響應包發送回客戶端。
咱們使用客戶端/服務器段的架構事實上爲咱們打開了不少可能性:咱們能夠在任何支持http 客戶端API的語言上面實現咱們的測試代碼,固然使用咱們提供的」Apppiu客戶端庫「會更加方便高效。咱們能夠把服務器端放在跟咱們的測試運行機器徹底不同機器上。咱們能夠低頭安心編寫測試用例而後依賴遠程的雲服務平臺如「Sauce Labs」來接收和翻譯咱們的測試命令。
自動化每每都是在一個擁有會話的上下文中進行的。客戶端往服務器端發起一次會話的方式根據具體不一樣的庫而會有所不一樣,但相同的是它們最終都會發送一個包含所謂的「desired capabilities"JSON對象的Post/session的請求到服務器端。這樣服務器端就會開啓一個自動化會話並把會話ID發送回客戶端以便日後的持續的命令傳遞。
Desired Capabilities是由客戶端發送給Appium服務器端的用來告訴服務器去啓動哪一種咱們想要的會話的一套鍵值對集合。當中也有一些鍵值對是用來在自動化的過程當中修改服務器端的行爲方式的。
好比,咱們能夠把鍵爲platformName的capability的值設置成iOS來告訴服務器咱們想要開啓的是一個iOS的會話,而非Anddroid的會話。或者咱們能夠把鍵爲safariAllowPopups 的capability的值設置成true來確保在Safari自動化會話的過程當中,咱們可使用JavaScript來彈出一個新窗口。要查看Appium支持的完整的capabilities列表,請查看capabilities doc。
Appium是一個由Node.js編寫的服務器。能夠經過源碼或NPM進行編譯和安裝。
存在不少對WebDriver協議進行擴展的Appium客戶端庫(針對如下語言的庫:Java,Python,PHP,JavaScript,以及C#).當使用Appium的時候,相對常規的(譯者注:沒有擴展的)WebDriver庫,我相信你更會選擇使用這些擴展後的庫。你能夠在這裏查看全部的庫。
這些Appium服務器的GUI封裝版是能夠下載的。事實上這些在配置appium服務器可運行環境時已經和其餘東西一塊兒打包安裝了的,因此你並不須要擔憂要用Node再去下載安裝。當中有一個Inspector也會一塊兒安裝,你能夠用它來查看你的app的結構,這樣你就能夠在它的協助下很方便的編寫測試腳本了。
開始
恭喜!你如今已經裝備好足夠的知識來開始使用Appium了,何不去getting started doc獲取更加詳細的需求描述和建議呢?
本章咱們引用了Appium官網的介紹來做爲咱們這個教程的開始,先讓你們對這個框架有必定的瞭解,而後在接下來的章節,咱們將詳細講解若是利用這個測試框架來編寫咱們的自動化測試用例。而語言上咱們採用python,固然也可使用java。咱們先介紹python+appium,若是你們有需求,咱們後期會介紹java+appium,但願對你們的學習有所幫助。