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進行定位。
圖表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
(3)對用例專案進行編譯。此時編譯測試用例的uiautomator的編譯工具是Ant,在編譯之前我們要先生成build.xml。
生成方法為:進入…/sdk/tools目錄下,使用命令列:
android create uitest-project -n <name> -t
x
-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沒有斷言函式。對比其餘測試工具來說是真的是易學好用。