本文章轉(zhuǎn)載于搜狗測(cè)試
基于Appium的Android自動(dòng)化測(cè)試(一)
項(xiàng)目技術(shù)結(jié)構(gòu):Java + Appium + TestNG + Maven
Appium
Appium是一個(gè)開(kāi)源、跨平臺(tái)的自動(dòng)化測(cè)試工具,用于測(cè)試原生和輕量移動(dòng)應(yīng)用,支持iOS,Android和FirefoxOS平臺(tái)。Appium驅(qū)動(dòng)Android的UiAutomator框架,使用Selenium的WebDriver JSON協(xié)議。
相比其他的移動(dòng)自動(dòng)化測(cè)試工具,Appium測(cè)試由于調(diào)用了Selenium的client庫(kù)使其可以使用任意的語(yǔ)言,包括Python、Ruby、Node.js、Objective-C等。
Appium——C/S構(gòu)架
Appium的核心是一個(gè)web服務(wù)器,提供了一套R(shí)EST接口。它收到客戶端的連接,監(jiān)聽(tīng)到命令,接著在移動(dòng)設(shè)備上執(zhí)行這些命令,然后將執(zhí)行結(jié)果放在HTTP響應(yīng)中返還給客戶端。特點(diǎn):多語(yǔ)言編寫(xiě)測(cè)試代碼;可以將服務(wù)器放在不同的機(jī)器上;
在這里client其實(shí)就是發(fā)起command的設(shè)備,一般來(lái)說(shuō)就是我們代碼執(zhí)行的機(jī)器,執(zhí)行appium測(cè)試代碼的機(jī)器。只要client能夠發(fā)送http請(qǐng)求給server,只要它實(shí)現(xiàn)了webdriver標(biāo)準(zhǔn)協(xié)議就可以,故appium及webdriver可以支持多語(yǔ)言。
server的功能:監(jiān)聽(tīng)一個(gè)端口,然后接收由client發(fā)送來(lái)的command,解釋這些command,把這些command轉(zhuǎn)成移動(dòng)設(shè)備可以理解的形式發(fā)送給移動(dòng)設(shè)備,然后移動(dòng)設(shè)備執(zhí)行完這些command后把執(zhí)行結(jié)果返回給appium server,appium server再把執(zhí)行結(jié)果返回給client。
Session
session是一個(gè)會(huì)話,自動(dòng)化總在一個(gè)session的上下文中運(yùn)行。在webdriver/appium,所有工作永遠(yuǎn)都是在session start后才可以進(jìn)行的。客戶端初始化一個(gè)seesion(會(huì)話)來(lái)與服務(wù)端交互。不同語(yǔ)言有不同的實(shí)現(xiàn)方式,但最終都是發(fā)送為一個(gè)“desired capabilities”的JSON對(duì)象參數(shù)的POST請(qǐng)求”/session”給服務(wù)器,然后傳入Desired Capabilities,服務(wù)器會(huì)開(kāi)始一個(gè)自動(dòng)化的session,然后返回一個(gè)全局唯一的sessionID。以后幾乎所有的請(qǐng)求都必須帶上這個(gè)session id,因?yàn)檫@個(gè)seesion id代表了你所打開(kāi)的瀏覽器或者是移動(dòng)設(shè)備的模擬器。
Desired Capabilities
是一些key-value(鍵值對(duì))的集合(比如map或者h(yuǎn)ash)。可理解成是java里的map,python里的字典,ruby里的hash以及js里的json對(duì)象。實(shí)際上Desired Capabilities在傳輸時(shí)就是json對(duì)象。
Desired Capabilities最重要的作用是告訴server本次測(cè)試的上下文。客戶端將這些鍵值對(duì)發(fā)給服務(wù)端,告訴服務(wù)端我們想要啟動(dòng)怎樣的自動(dòng)化session。根據(jù)不同的capabilities 參數(shù),服務(wù)端會(huì)有不同的行為。
舉個(gè)栗子
capabilities.setCapability("platformName capability","Android");
capabilities.setCapability("platformVersion","4.3");
capabilities.setCapability("appPackage","com.sogou.map.android.maps");
capabilities.setCapability("appActivity",".MainActivity");
platformName capability 設(shè)置為Android,要啟動(dòng)一個(gè)Android的session;本次測(cè)試是啟動(dòng)andorid移動(dòng)設(shè)備;app的package是com.sogou.map.android.maps;啟動(dòng)android時(shí),app的activity是MainActivity
Appium真正的工作引擎是第三方自動(dòng)化框架,Android使用的第三方框架:為UiAutomator(Android 4.2+)。借助第三方框架,建立了服務(wù)器和設(shè)備之間的連接。
API Level對(duì)應(yīng)關(guān)系如下:
平臺(tái)版本
API級(jí)別
Android 7.1
25
Android 4.4W
不同版本,通過(guò)UiAutomator可以獲取設(shè)備屬性不同(例如:Android4.3以上版本支持source-Id,之前的版本不支持此字段,即API Level大于或者等于18才能夠獲取)。