【Appium】Appium工作原理


參考:http://www.cnblogs.com/zhjsll/p/5698878.html

原作者寫的很好,所以直接放在這里。

一、什么是Appium

Appium是一個開源、跨平台的測試框架,可以用來測試原生及混合的移動端應用。Appium支持IOS、Android及FirefoxOS平台。Appium使用WebDriver的json wire協議,來驅動Apple系統的UIAutomation庫、Android系統的UIAutomator框架。Appium對IOS系統的支持得益於Dan Cuellar’s對於IOS自動化的研究。Appium也集成了Selendroid,來支持老android版本。

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實現了真正的跨平台自動化測試。

appium選擇了client-server的設計模式。只要client能夠發送http請求給server,那么的話client用什么語言來實現都是可以的,這就是appium及webdriver如何做到支持多語言的;

下面這段介紹來自於appium的官網。

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.

二、Appium的工作原理及其相關基本概念

2.1 工作原理

2.1.1 Android

在Android端,appium基於WebDriver協議,利用Bootstrap.jar,最后通過調⽤用UiAutomator的命令,實現App的自動化測試。

UiAutomator測試框架是Android SDK自帶的App UI自動化測試Java庫。

另外由於UiAutomator對H5的支持有限,appium引入了chromedriver以及safaridriver等來實現基於H5的自動化。

appium 在android端工作流
  1. client端也就是我們 test script是我們的webdriver測試腳本。

  2. 中間是起的Appium的服務,Appium在服務端起了一個Server(4723端口),跟selenium Webdriver測試框架類似, Appium⽀持標准的WebDriver JSONWireProtocol。在這里提供它提供了一套REST的接口,Appium Server接收web driver client標准rest請求,解析請求內容,調⽤用對應的框架響應操作。

  3. appium server會把請求轉發給中間件Bootstrap.jar ,它是用java寫的,安裝在手機上.Bootstrap監聽4724端口並接收appium 的命令,最終通過調⽤用UiAutomator的命令來實現。

  4. 最后Bootstrap將執行的結果返回給appium server。

  5. appium server再將結果返回給 appium client。

2.1.2 ios

在IOS端,appium同樣使⽤WebDriver的一套協議。

與Android端測試框架不同的是,appium ios封裝了apple的 Instruments框架,主要用了Instrument里的UI Automation(Apple的⾃自動化測試框架),然后在設備中注⼊入bootstrap.js進⾏行監聽。

appium 在ios端工作流
  1. client端 依然是 test script是我們的webdriver測試腳本。

  2. 中間是起的Appium的服務,Appium在服務端起了一個Server(4723端口),跟selenium Webdriver測試框架類似, Appium⽀持標准的WebDriver JSONWireProtocol。在這里提供它提供了一套REST的接口,Appium Server接收web driver client標准rest請求,解析請求內容,調⽤用對應的框架響應操作。

  3. appium server調用instruments.js 啟動⼀一個socket server,同時分出一個⼦子進程運⾏instruments.app,將bootstrap.js(一個UIAutomation腳本)注⼊入到device⽤於和外界進行交互

  4. 最后Bootstrap.js將執行的結果返回給appium server

  5. appium server再將結果返回給 appium client。

所以我們可以看到android與ios區別在於appium 將請求轉發到bootstrap.js或者bootstrap.jar.然后由bootstrap 驅動UIAutomation和UiAutomator去devices上完成具體的動作。

2.2 Client/Server Architecture

appium的核心其實是一個暴露了一系列REST API的server。

這個server的功能其實很簡單:監聽一個端口,然后接收由client發送來的command。翻譯這些command,把這些command轉成移動設備可以理解的形式發送給移動設備,然后移動設備執行完這些command后把執行結果返回給appium server,appium server再把執行結果返回給client。

在這里client其實就是發起command的設備,一般來說就是我們代碼執行的機器,執行appium測試代碼的機器。狹義點理解,可以把client理解成是代碼,這些代碼可以是java/ruby/python/js的,只要它實現了webdriver標准協議就可以。

這樣的設計思想帶來了一些好處:

  1. 可以帶來多語言的支持;

  2. 可以把server放在任意機器上,哪怕是雲服務器都可以;(是的,appium和webdriver天生適合雲測試)

2.3 Session

session就是一個會話,在webdriver/appium,你的所有工作永遠都是在session start后才可以進行的。一般來說,通過POST /session這個URL,然后傳入Desired Capabilities就可以開啟session了。

開啟session后,會返回一個全局唯一的session id,以后幾乎所有的請求都必須帶上這個session id,因為這個seesion id代表了你所打開的瀏覽器或者是移動設備的模擬器。

進一步思考一下,由於session id是全局唯一,那么在同一台機器上啟動多個session就變成了可能,這也就是selenium gird所依賴的具體理論根據。

2.4 Desired Capabilities

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

2.5 Appium Server

這就是每次我們在命令行用appium命令打開的東西。

Appium server 是用 Node.js 寫的。我們可以用源碼編譯或者從 NPM 直接安裝。

2.6 Appium 服務端

Appium 服務端有很多語言庫 Java, Ruby, Python, PHP, JavaScript 和 C#,這些庫都實現了 Appium 對 WebDriver 協議的擴展。當使用 Appium 的時候,你只需使用這些庫代替常規的 WebDriver 庫就可以了。 你可以從這里看到所有的庫的列表。

2.7 Appium Clients

由於原生的webdriver api是為web端設計的,因此在移動端用起來會有點不倫不類。appium官方提供了一套appium client,涵蓋多種語言ruby/java/python,在我看來ruby client是實現最好的。在測試的時候,一般要使用這些client庫去替換原生的webdriver庫。這實際上不是替換,算是client對原生webdriver進行了一些移動端的擴展,加入了一些方便的方法,比如swipe之類,appium client讓我們可以更方便的寫出可讀性更好的測試用例。

2.8 Appium.appAppium.exe

官方提供了GUI封裝的Appium服務端下載,它封裝了Appium服務端的所有依賴,用戶不用擔心怎樣安裝Node.js。GUI封裝的Appium中還包括了一個Inspector工具,可以幫助用戶檢查應用的節目層級,雖然Android官方的SDK中的Android Device Monitor和UI Automator Viewer也可以實現,但是相比較Inspector還是有不足之處。

三、Appium並發

關於appium並發,我將之分為2類,第一類單機並發。第二類基於selenium grid 多節點並發測試,也可稱之為雲測。

3.1 appium 單機並發

Android並發測試

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並發測試

不幸的是,IOS不能進行本地並發測試。跟Android不一樣,IOS在同一時間只能啟動一個版本的模擬器來運行多個測試。

總結: 單機並發目前只能在android實現,且必須啟動n個appium server 對應不同devices,這里devices可以是真機或模擬器。但是必須保證端口后沒有重復使用。 接下來工作就是利用測試框架(testng,jasmine,rspec,cucumber等)將測試分發到不同appium server上。

代碼示例:GitHub

代碼解析:

  1. 首先讓我們來看下代碼中的AppiumParallelTest這個類,他們先判斷操作系統,並獲取操作系統上連接的devices。利用AndroidDeviceConfiguration.java 與IOSDeviceConfiguration.java 中的getIOSUDID,getDevices方法分別獲取真機與模擬器的id.

  2. 然后利用startAppiumServer方法啟動appium server, 利用appiumServerForAndroid()或者appiumServerForIOS().

3.2 appium grid 分布式並發

1、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

2、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

3、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

iOS 需求

Android 需求

  • Android SDK API >= 17 (額外的特性需要 18/19)
  • Appium 支持OS X,Linux,Windows 上的 Android,確保你是按照如下文檔的指示來配置不同的測試環境的。

FirefoxOS 需求

限制

如果你在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


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM