1. 程式人生 > >android測試:UI automator

android測試:UI automator

一、UI automator的簡介

Uiautomator,顧名思義,是用於ui自動化測試的,主要是模擬單擊,滑動,輸入文字等操作,而不用人為地進行操作,特對對於相容測試來說,如果把一組反覆進行的操作用uiautomator實現,那麼將大大提高效率。

同時如果條件允許,可以開啟眾多程序每個程序連線一臺虛擬機器對軟體進行效能測試(訪問量效能測試)。

二、UI automator的環境配置

2.1 配置android環境

2.2 配置Ant

三、UI automator的測試

3.1 UI Automator Viewer

UI automator Viewer軟體可以對手機現時的截圖進行控制元件分析其ID進行定位。

UI Automator Viewer位於…/sdk/tools目錄下面,如D:\android-sdk-windows\tools。點選開啟uiautomatorviewer.bat如下圖所示:

 

圖表1

 

圖表2

其中對於該軟體的基本運用見圖表2,左起第一個按鈕是匯入檔案,可以匯入檔案uix格式和png格式進行分析;第二個按鈕是錄製按鈕,是對螢幕的截圖,對截圖進行控制元件分析;第三個按鈕和第二個按鈕功能相同,不同是螢幕截圖進行了壓縮;第四個按鈕是對螢幕截圖的儲存,可以輸出成uix格式和png格式的檔案。

3.2 程式碼測試的環境設定

在配置好的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 <name> -tx-p <path>

此時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沒有斷言函式。對比其餘測試工具來說是真的是易學好用。