編輯:關於Android編程
Uiautomator,顧名思義,是用於ui自動化測試的,主要是仿真單擊,滑動,輸入文本等操作,而不用人為地進行操作,特對對於兼容測試來說,如果把一組反復進行的操作用uiautomator實現,那麼將大大提高效率。
同時如果條件允許,可以開啟眾多進程每個進程連接一台虛擬機對軟件進行性能測試(訪問量性能測試)。
UI automator Viewer軟件可以對手機現時的截圖進行控件分析其ID進行定位。UI Automator Viewer位於…/sdk/tools目錄下面,如D:\android-sdk-windows\tools。點擊打開uiautomatorviewer.bat如下圖所示:
圖表1
圖表2
其中對於該軟件的基本運用見圖表2,左起第一個按鈕是導入文件,可以導入文件uix格式和png格式進行分析;第二個按鈕是錄制按鈕,是對屏幕的截圖,對截圖進行控件分析;第三個按鈕和第二個按鈕功能相同,不同是屏幕截圖進行了壓縮;第四個按鈕是對屏幕截圖的保存,可以輸出成uix格式和png格式的文件。
在配置好的android環境中打開IDE(eclipse或者android studio都行),創建一個java項目,注意不是android項目!
下面以在eclipse的操作進行講解:
(1)首先創建好java項目後導入依賴包:見圖表3.具體操作為打開項目的Properties,選取Java BuildPath,在Libraries欄中ADD ExternalJARs中導入android.jar和uiautomator.jar倆個第三方包,位置位於…/sdk/platforms/android-xxx.,注意選取android-18以上的版本,後續代碼操作api很多是18以前所缺少的。在Add Library中導入JUnit 4,eclipse已經配置好。
圖表3
(2)其次編寫代碼,編寫代碼的過程見四UI automator的參考案例,此處只談環境配置。此時你可以看見項目的結構如果類似圖表4,則證明已經配置成功。
圖表4
(3)對用例項目進行編譯。此時編譯測試用例的uiautomator的編譯工具是Ant,在編譯之前我們要先生成build.xml。
生成方法為:進入…/sdk/tools目錄下,使用命令行:
android create uitest-project -n
x
-p
此時name表示你的項目的名字,輸入對應的名字,-t表示target,對應版本號,也就是x,表示上文中你選取的android-xx對應的編號,-p是路徑,是你的項目的具體路徑(絕對路徑)。
target x在每台電腦中都可能不一樣,在第一次運行時需要查閱。輸入命令:android list,具體結果見圖表5:
圖表5
見圖表5,例如選取的是android-19,此時id為18,即x為18。運行後輸出結果無異常即可以進入下一步。(異常通常原因是輸入路徑或者名稱有錯誤)
然後進入到項目路徑進行編譯,輸入ant build,見圖表6:
圖表6
此時顯示編譯成功,在項目的bin文件夾會生成項目名.jar。
(4)導入文件進行執行。此時我們首先要把該jar文件拷貝到手機的/data/local/tmp/ 目錄中。,命令如下:
adbpush F:\android學習1\client\bin\client.jar/data/local/tmp(文件名要改成自己的)
圖表7
此時見圖7可以發現已經導入成功,生成文件為client.,注意並不是client.jar。
此時我們便可以運行用例對軟件進行測試,輸入命令行:adb shell uiautomatorruntest client. -c test.login。-c後面的test.login是java中包名.class名,表明運行某個用例。
此時見圖8則完成了測試,斷言函數的輸出也是在cmd中,返回看見OK表示測試成功,此用例表明了對渠道通app進行了登錄測試:
圖表8
四、UI automator的參考案例
4.1 核心類
此處重點介紹一下用例編寫的核心類,主要包括UiDevice、UiSelector以及UiObject三種。
(1)UiDevice代表設備狀態。在測試時,可以調用UiDevice實例的方法來檢查不同屬性的狀態,如當前的屏幕旋轉方向貨展示大小。測試代碼還能使用UiDevice實例來執行設備級的操作,如強制設備橫豎屏,按壓d-pad硬件按鈕,或按壓主屏幕鍵和菜單鍵。
獲取UiDevice實例,模擬按壓主屏幕鍵的代碼如下:getUiDevice (). pressHome ();
(2) UiSelector代表一種搜索標准,可以在當前展示界面上查詢和獲取特定元素的句柄。若找到多於一個的匹配元素,則返回布局層次結構上的第一個匹配元素作為目標UiObject。當構造一個UiSelector對象時,可以使用鏈式調用多個屬性來縮小查詢范圍。如無匹配元素,則返回異常 UiAutomatorObjectNotFoundException 。你還可以使用childSelector()來嵌套多個Uiselector實例。
UiSelector()常用的方法有resourceId(),根據ID才定位控件;index(),根據索引定位控件。見圖表9,在上文所述的UI Automator Viewer可以找到resource-id和index:
圖表9
(3) UiObject代表一個UI元素。為創建一個UiObject實例,使用用來描述如何搜索、選定UI元素的UiSelector實例。如:UiObject account=new UiObject(newUiSelector().resourceId("cn.com.do1.qyw.account.manager:id/text_userName"));
4.2 斷言函數
斷言函數判斷被測試的方法是否按照預期的效果正常工作。
斷言函數輸出是在命令行輸出,也可以導出為一個文件。
4.3 代碼編寫
packagetest; import java.io.IOException; import android.os.RemoteException; import com.android.uiautomator.core.UiDevice; import com.android.uiautomator.core.UiObject; import com.android.uiautomator.core.UiObjectNotFoundException; import com.android.uiautomator.core.UiSelector; import com.android.uiautomator.testrunner.UiAutomatorTestCase; public classlogin extendsUiAutomatorTestCase //繼承 { public void testDemo() throws RemoteException,UiObjectNotFoundException { UiDevicedevice=getUiDevice();//獲得系統服務 device.wakeUp();//喚醒屏幕 device.pressHome();//系統主界面 sleep(1000);//暫停1000ms try { Runtime.getRuntime().exec("am start -ncn.com.do1.qyw.account.manager/cn.com.do1.qyw.account.activity.home.MainActivity");//啟動具體的包和activity } catch (IOException e) { // TODO Auto-generated catch block e.printStackTrace(); } sleep(1000); UiObjectaccount=newUiObject(newUiSelector().resourceId("cn.com.do1.qyw.account.manager:id/text_userName"));//句柄返回一個界面控件對象 assertTrue("賬戶的控件無法找到!", account.exists()); sleep(100); UiObjectpassword=newUiObject(newUiSelector().resourceId("cn.com.do1.qyw.account.manager:id/text_password")); assertTrue("密碼控件無法找到!",password.exists()); sleep(100); UiObjectloginButton=newUiObject(newUiSelector().resourceId("cn.com.do1.qyw.account.manager:id/sumbit")); assertTrue("登陸按鈕無法找到",loginButton.exists()); UiObjectfailLogin =newUiObject(newUiSelector().resourceId("cn.com.do1.qyw.account.manager:id/btn_ok")); //account.setText(""); //account.setText("chenjianping"+"6".toString()); sleep(100); password.setText("NICO0816q"); sleep(100); loginButton.click(); sleep(100); if (failLogin.exists()) { assertTrue("登陸失敗!檢測賬戶密碼!",failLogin.exists()); return; } //enter the Main home UiObjectuserName=newUiObject(newUiSelector().resourceId("cn.com.do1.qyw.account.manager:id/tv_username")); assertTrue("user_name控件不存在!",userName.exists()); sleep(100); if(userName.getText().toString()==null||(userName.getText().toString().equals(""))) { assertTrue("用戶名無法顯示!", userName.exists()); } } }
五、UI automator的總結
能很好的做功能測試,比起monkeyrunner來說性能優越很多。後者錄制腳本會卡頓若按id找尋控件真機測試還要root,特別麻煩,而且monkeyrunner沒有斷言函數。對比其余測試工具來說是真的是易學好用。
本菜開源的一個自己寫的Demo,希望能給Androider們有所幫助,水平有限,見諒見諒.. https://github.com/zhiaixinyang/MyFir
導讀:在過去的一年裡,移動成主流也讓眾多的移動應用如雨後春筍般層出不窮,在眾多開發者從中獲利的同時競爭也愈演愈烈,如何才能保證自己立於不敗之地?用戶是上帝,一切還得從應用
1、概述 上一篇已經基本給大家介紹了如何自定義ViewGroup,如果你還不了解,請查看:Android 手把手教您自定ViewGroup ,本篇將使用上篇
Glide是一款基於Android的圖片加載和圖片緩存組件,它可以最大性能地在Android設備上讀取、解碼、顯示圖片和視頻。Glide可以將遠程的圖片、視頻、動畫圖片等