Appium是一個開源、跨平臺的測試框架,能夠用來測試原生及混合的移動端應用。Appium支持IOS、Android及FirefoxOS平臺。Appium使用WebDriver的json wire協議,來驅動Apple系統的UIAutomation庫、Android系統的UIAutomator框架。Appium對IOS系統的支持得益於Dan Cuellar’s對於IOS自動化的研究。Appium也集成了Selendroid,來支持老android版本。javascript
Appium支持Selenium WebDriver支持的全部語言,如java、Object-C、JavaScript、Php、Python、Ruby、C#、Clojure,或者Perl語言,更可使用Selenium WebDriver的Api。Appium支持任何一種測試框架。若是隻使用Apple的UIAutomation,咱們只能用javascript來編寫測試用例,並且只能用Instruction來運行測試用例。一樣,若是隻使用Google的UIAutomation,咱們就只能用java來編寫測試用例。Appium實現了真正的跨平臺自動化測試。html
appium選擇了client-server的設計模式。只要client可以發送http請求給server,那麼的話client用什麼語言來實現都是能夠的,這就是appium及webdriver如何作到支持多語言的;java
下面這段介紹來自於appium的官網。node
Appium is an open-source tool you can use to automate mobile native, mobile web, and mobile hybrid applications on iOS and Android platforms. 「Mobile native apps」 are those written using the iOS or Android SDKs. 「Mobile web apps」 are web apps accessed using a mobile browser (Appium supports Safari on iOS and Chrome on Android). 「Mobile hybrid apps」 have a native wrapper around a 「webview」 – a native control that enables interaction with web content. Projects like Phonegap, for example, make it easy to build apps using web technologies that are then bundled into a native wrapper – these are hybrid apps. Importantly, Appium is 「cross-platform」: it allows you to write tests against multiple platforms (iOS, Android), using the same API. This enables a large or total amount of code reuse between iOS and Android testsuites.python
在Android端,appium基於WebDriver協議,利用Bootstrap.jar,最後經過調⽤用UiAutomator的命令,實現App的自動化測試。linux
UiAutomator測試框架是Android SDK自帶的App UI自動化測試Java庫。android
另外因爲UiAutomator對H5的支持有限,appium引入了chromedriver以及safaridriver等來實現基於H5的自動化。ios
client端也就是咱們 test script是咱們的webdriver測試腳本。git
中間是起的Appium的服務,Appium在服務端起了一個Server(4723端口),跟selenium Webdriver測試框架相似, Appium⽀持標準的WebDriver JSONWireProtocol。在這裏提供它提供了一套REST的接口,Appium Server接收web driver client標準rest請求,解析請求內容,調⽤用對應的框架響應操做。github
appium server會把請求轉發給中間件Bootstrap.jar ,它是用java寫的,安裝在手機上.Bootstrap監聽4724端口並接收appium 的命令,最終經過調⽤用UiAutomator的命令來實現。
最後Bootstrap將執行的結果返回給appium server。
appium server再將結果返回給 appium client。
在IOS端,appium一樣使⽤WebDriver的一套協議。
與Android端測試框架不一樣的是,appium ios封裝了apple的 Instruments框架,主要用了Instrument裏的UI Automation(Apple的⾃自動化測試框架),而後在設備中注⼊入bootstrap.js進⾏行監聽。
client端 依然是 test script是咱們的webdriver測試腳本。
中間是起的Appium的服務,Appium在服務端起了一個Server(4723端口),跟selenium Webdriver測試框架相似, Appium⽀持標準的WebDriver JSONWireProtocol。在這裏提供它提供了一套REST的接口,Appium Server接收web driver client標準rest請求,解析請求內容,調⽤用對應的框架響應操做。
appium server調用instruments.js 啓動⼀一個socket server,同時分出一個⼦子進程運⾏instruments.app,將bootstrap.js(一個UIAutomation腳本)注⼊入到device⽤於和外界進行交互
最後Bootstrap.js將執行的結果返回給appium server
appium server再將結果返回給 appium client。
因此咱們能夠看到android與ios區別在於appium 將請求轉發到bootstrap.js或者bootstrap.jar.而後由bootstrap 驅動UIAutomation和UiAutomator去devices上完成具體的動做。
appium的核心實際上是一個暴露了一系列REST API的server。
這個server的功能其實很簡單:監聽一個端口,而後接收由client發送來的command。翻譯這些command,把這些command轉成移動設備能夠理解的形式發送給移動設備,而後移動設備執行完這些command後把執行結果返回給appium server,appium server再把執行結果返回給client。
在這裏client其實就是發起command的設備,通常來講就是咱們代碼執行的機器,執行appium測試代碼的機器。狹義點理解,能夠把client理解成是代碼,這些代碼能夠是java/ruby/python/js的,只要它實現了webdriver標準協議就能夠。
這樣的設計思想帶來了一些好處:
能夠帶來多語言的支持;
能夠把server放在任意機器上,哪怕是雲服務器均可以;(是的,appium和webdriver天生適合雲測試)
session就是一個會話,在webdriver/appium,你的全部工做永遠都是在session start後才能夠進行的。通常來講,經過POST /session這個URL,而後傳入Desired Capabilities就能夠開啓session了。
開啓session後,會返回一個全局惟一的session id,之後幾乎全部的請求都必須帶上這個session id,由於這個seesion id表明了你所打開的瀏覽器或者是移動設備的模擬器。
進一步思考一下,因爲session id是全局惟一,那麼在同一臺機器上啓動多個session就變成了可能,這也就是selenium gird所依賴的具體理論根據。
Desired Capabilities攜帶了一些配置信息。從本質上講,這個東東是key-value形式的對象。你能夠理解成是java裏的map,python裏的字典,ruby裏的hash以及js裏的json對象。實際上Desired Capabilities在傳輸時就是json對象。
Desired Capabilities最重要的做用是告訴server本次測試的上下文。此次是要進行瀏覽器測試仍是移動端測試?若是是移動端測試的話是測試android仍是ios,若是測試android的話那麼咱們要測試哪一個app? server的這些疑問Desired Capabilities都必須給予解答,不然server不買帳,天然就沒法完成移動app或者是瀏覽器的啓動。
具體例子以下:
For example, we might set the platformName capability to iOS to tell Appium that we want an iOS session, rather than an Android one. Or we might set the safariAllowPopupscapability to true in order to ensure that, during a Safari automation session, we’re allowed to use JavaScript to open up new windows. See the capabilities doc for the complete list of capabilities available for Appium
這就是每次咱們在命令行用appium命令打開的東西。
Appium server 是用 Node.js 寫的。咱們能夠用源碼編譯或者從 NPM 直接安裝。
Appium 服務端有不少語言庫 Java, Ruby, Python, PHP, JavaScript 和 C#,這些庫都實現了 Appium 對 WebDriver 協議的擴展。當使用 Appium 的時候,你只需使用這些庫代替常規的 WebDriver 庫就能夠了。 你能夠從這裏看到全部的庫的列表。
因爲原生的webdriver api是爲web端設計的,所以在移動端用起來會有點不三不四。appium官方提供了一套appium client,涵蓋多種語言ruby/java/python,在我看來ruby client是實現最好的。在測試的時候,通常要使用這些client庫去替換原生的webdriver庫。這實際上不是替換,算是client對原生webdriver進行了一些移動端的擴展,加入了一些方便的方法,好比swipe之類,appium client讓咱們能夠更方便的寫出可讀性更好的測試用例。
官方提供了GUI封裝的Appium服務端下載,它封裝了Appium服務端的全部依賴,用戶不用擔憂怎樣安裝Node.js。GUI封裝的Appium中還包括了一個Inspector工具,能夠幫助用戶檢查應用的節目層級,雖然Android官方的SDK中的Android Device Monitor和UI Automator Viewer也能夠實現,可是相比較Inspector仍是有不足之處。
關於appium併發,我將之分爲2類,第一類單機併發。第二類基於selenium grid 多節點併發測試,也可稱之爲雲測。
Appium提供了在一臺設備上啓動多個Android會話的方案。
appium -p 4492 -bp 2251 -U 32456
啓動多個Android會話的重要指令包括:
指令 | 功能 |
---|---|
-p | Appium的主要端口 |
-U | 設備id |
-bp | Appium bootstrap端口 |
–chromedriver-port | chromedriver端口(當使用了webviews或者chrome) |
–selendroid-port | selendroid端口(當使用了selendroid) |
不幸的是,IOS不能進行本地併發測試。跟Android不同,IOS在同一時間只能啓動一個版本的模擬器來運行多個測試。
總結: 單機併發目前只能在android實現,且必須啓動n個appium server 對應不一樣devices,這裏devices能夠是真機或模擬器。可是必須保證端口後沒有重複使用。 接下來工做就是利用測試框架(testng,jasmine,rspec,cucumber等)將測試分發到不一樣appium server上。
代碼示例:GitHub
代碼解析:
首先讓咱們來看下代碼中的AppiumParallelTest這個類,他們先判斷操做系統,並獲取操做系統上鍊接的devices。利用AndroidDeviceConfiguration.java 與IOSDeviceConfiguration.java 中的getIOSUDID,getDevices方法分別獲取真機與模擬器的id.
而後利用startAppiumServer方法啓動appium server, 利用appiumServerForAndroid()或者appiumServerForIOS().
一、start selenium grid sever
java -jar selenium-server-standalone-2.47.1.jar -port 4444 -role hub -hub http://192.168.199.140:4444/grid/registe
二、Registered appium server as the grid node
appium --nodeconfig appium_node_S3.json -p 4823 -bp 3356 -U "192.168.99.104:5555" --chromedriver-port 4738
三、Configure the test script,run the tests
@BeforeTest @Parameters({"deviceName"}) public void setUp(String deviceName) throws Exception { capabilities.setCapability("deviceName",deviceName); capabilities.setCapability("platformVersion", "5.0"); capabilities.setCapability("app", getApp("ContactManager.apk")); setUpAndroidDriver(); }
GRID NODE CONFIGURATION EXAMPLE JSON FILE
{ "capabilities": [ { "deviceName": "192.168.56.101:5555", "browserName": "<e.g._iPhone5_or_iPad4>", "version":"<version_of_iOS_e.g._7.1>", "maxInstances": 1, "platform":"<platform_e.g._MAC_or_ANDROID>" } ], "configuration": { "cleanUpCycle":2000, "timeout":30000, "proxy": "org.openqa.grid.selenium.proxy.DefaultRemoteProxy", "url":"http://<host_name_appium_server_or_ip-address_appium_server>:<appium_port>/wd/hub", "host": <host_name_appium_server_or_ip-address_appium_server>, "port": <appium_port>, "maxSession": 1, "register": true, "registerCycle": 5000, "hubPort": <grid_port>, "hubHost": "<Grid_host_name_or_grid_ip-address>" } }
iOS
Android
FirefoxOS
爲了運行測試,針對不一樣的移動平臺,你須要配置下環境,下面列出相關的依賴平臺的需求。
若是你想經過 npm install 安裝的 appium 來運行 Appium 或者研究 Appium 或者爲 Appium 貢獻力量。你須要安裝 [node.js 和 npm] (https://nodejs.org/en/) 0.10 或者更高版本 (使用 n 或者 brew install node 來安裝 Nodejs,確保安裝過程當中,你沒有使用任何 sudo,不然你會遇到不少問題)。咱們推薦最新的穩定版本。
你可使用 appium-doctor 來驗證 Appium 的全部依賴。運行 appium-doctor,而後提供 --ios 或者 --android 參數來驗證兩個平臺的依賴是否配置正確。若是從源代碼運行,你可使用 bin/appium-doctor.js 或者 node bin/appium-doctor.js
Appium 支持OS X,Linux,Windows 上的 Android,確保你是按照以下文檔的指示來配置不一樣的測試環境的。
若是你在windows上安裝appium,你無法使用預編譯專用於OS X的.app文件,你也將不能測試IOS apps,由於appium依賴OS X專用的庫來支持IOS測試。這意味着你只能經過在mac上來運行IOS的app測試。這點限制挺大。
最後附上比較不錯的appiumde學習:
https://anikikun.gitbooks.io/appium-girls-tutorial/content/start_appium_server.html
Appium官網:http://appium.io/
Appium Girls學習指南:https://www.gitbook.com/star/book/anikikun/appium-girls-tutorial
Appium Girls 學習手冊:https://anikikun.gitbooks.io/appium-girls-tutorial/content/
Appium的使用:http://icocoa.tk/appiumde-shi-yong.html
GitHub:https://github.com/appium/appium/blob/master/docs/cn/appium-setup/running-on-windows.cn.md
github:https://github.com/appium/appium/tree/master/docs/cn
MAC下的appium環境搭建:http://www.15yan.com/story/4GbuTwXQKDU/
appium簡明教程(1-11):http://www.easonhan.info/
Appium from source.cn:http://appium.readthedocs.io/en/stable/cn/contributing-to-appium/appium-from-source.cn/
appium併發測試:http://qaseven.github.io/2016/05/05/appium/
Mac Appium Python 環境搭建:http://www.aichengxu.com/view/55814