1.架構(gòu)原理
Appium架構(gòu)由客戶端(Appium client)和服務(wù)器(Appium server)兩部分組成。客戶端與服務(wù)器通過JSON Wire Protocol進行通信。
test scripts? ? ? ? ? ? ? ?-—— Appium server? ? ? ? ? ? ——UIAutomator——Bootstrap.jar
Appium client? ? ? ? ? ? ? ? ? ? ?(node.js)? ? ? ? ? ? ? ? ——UIAutomation(iOS<9.3)\ XCUITest(9.3及以上)——Bootstarp.js
Appium使用以下系統(tǒng)自帶的自動化框架:
iOS 9.3 及以上:蘋果的?XCUITest
iOS 9.3 及以下:蘋果的?UIAutomation
Android 4.2+: 谷歌的?UiAutomator
Android 2.3+: 谷歌的?Instrumentation(通過綁定另外的項目——?Selendroid?提供 Instrumentation 的支持)
Windows: 微軟的?WinAppDriver
各部分介紹如下:
(1)Appium服務(wù)器
? ? ? ? Appium服務(wù)器是基于Node.js實現(xiàn)的HTTP服務(wù)器。主要功能是接受從Appium客戶端發(fā)起的連接,監(jiān)聽從客戶端發(fā)送過來的命令,將命令發(fā)送給android手機上的bootstrap.jar及ios手機上的bootstrap.js去執(zhí)行。同時服務(wù)器將命令執(zhí)行的結(jié)果通過http應(yīng)答返回給Appium的客戶端。
(2)Bootstrap.jar。是在android手機上運行的一個應(yīng)用程序。在手機上扮演TCP服務(wù)器的角色。當(dāng)Appium服務(wù)器需要運行命令時,Appium服務(wù)器會與Bootstrap.jar建立TCP通信(默認(rèn)端口4724)并把命令發(fā)送給Bootstrap.jar。由Bootstrap.jar負責(zé)運行測試命令。
(3)Appium客戶端。主要是指實現(xiàn)了Appium功能的WebDriver協(xié)議的客戶端Library。它負責(zé)與Appium服務(wù)器建立連接,并將測試腳本的指令發(fā)送給Appium服務(wù)器。現(xiàn)有的客戶端Library有多種語言的實現(xiàn)如Ruby,python,java,js,oc,php等。Appium的測試是在這些Library的基礎(chǔ)上進行開發(fā)的。
(4)Session。Appium的客戶端和服務(wù)器之間的通信都必須在一個Session的上下文中進行。客戶端在發(fā)起通信的時候首先會發(fā)送一個“Desired Capabilities”的JSON對象給服務(wù)器。服務(wù)器收到該數(shù)據(jù)后,會創(chuàng)建一個session并將session的id返回給客戶端,之后客戶端可以用該session的id發(fā)送后續(xù)的命令。
(5)Desired Capabilities。是一組設(shè)置的key value的集合。用于通知Appium服務(wù)器建立需要的session。其中的某些設(shè)置還可以在Appium的運行過程中改變服務(wù)器的運行行為。
Appium在Android上基于UIAutomator實現(xiàn)了測試的代理程序Bootstrap.jar。在iOS上基于UIAutomation實現(xiàn)了測試的代理程序Bootstrap.js。當(dāng)測試腳本運行時,每行WebDriver的腳本都將轉(zhuǎn)換成Appium的指令發(fā)送給Appium服務(wù)器。而Appium服務(wù)器將測試指令交給代理程序。將由代理程序負責(zé)執(zhí)行測試。如腳本上的一個點擊操作,在Appium服務(wù)器上都是touch指令,當(dāng)指令發(fā)送到Android系統(tǒng)上時,Android系統(tǒng)上的Bootstrap.jar將調(diào)用UIAutomator的方法實現(xiàn)點擊操作。而當(dāng)指令發(fā)送到iOS系統(tǒng)上時,iOS的Bootstrap.js將調(diào)用UIAutomation的方法實現(xiàn)點擊操作。故同樣的測試腳本可以實現(xiàn)跨平臺運行。
2.Appium框架的優(yōu)缺點
優(yōu)點
(1)Appium支持多種應(yīng)用程序的測試。適用于Native Application(基于智能手機本地操作系統(tǒng)如iOS和Android并使用原生編程語言(如Android上使用Java)編寫并運行的第三方應(yīng)用程序)、Mobile Web Application(基于Web的系統(tǒng)和應(yīng)用)、Hybrid Application(在手機原生應(yīng)用程序中嵌入Webview)
(2)被測試的應(yīng)用程序不需要特殊編譯。Appium的測試對象一般不需要做特殊修改如不需要引入任何額外的測試sdk,不需要添加任何權(quán)限,也不要求被測程序與腳本的簽名一致。故可以直接對發(fā)布的程序進行測試。
(3)Appium的腳本不限制語音和工具。(由于Appium的客戶端支持多種測試語言)
(4)Appium支持應(yīng)用之間跳轉(zhuǎn)的測試。可用于測試多個應(yīng)用程序相互交互的場景。
(5)Appium是一個跨平臺的測試框架,可以使用同一個API開發(fā)出在Android和iOS上都可以運行的腳本。
缺點:
(1)必須連接電腦才能實施自動化測試。不適用與需要脫機執(zhí)行的場景。
(2)只能用于UI的自動化測試。在很多情況下測試驗證只能通過界面來進行。
為了實現(xiàn)上述優(yōu)點(3),我們把這些(系統(tǒng)本身的)供應(yīng)商提供的框架包裝進一套 API ——?WebDriver?API 中。WebDriver(也叫 "Selenium WebDriver")規(guī)定了一個客戶端-服務(wù)器協(xié)議(稱為?JSON Wire Protocol),按照這種客戶端-服務(wù)器架構(gòu),可以使用任何語言編寫的客戶端向服務(wù)器發(fā)送適當(dāng)?shù)?HTTP 請求。已經(jīng)有各個流行編程語言編寫的客戶端了。這也意味著你可以自由使用任何你想要的測試運行器和測試框架;客戶端程序庫不過是 HTTP 客戶端,可以以任何你喜歡的方式混入你的代碼。換句話說,Appium 和 WebDriver 客戶端不是嚴(yán)格意義上的“測試框架”,而是“自動化程序庫”。你可以以任何你喜歡的方式管理你的測試環(huán)境!