導航:首頁 > 操作系統 > androiduiautomation

androiduiautomation

發布時間:2023-02-23 21:38:31

1. 用android uiautomator做自動化測試,怎麼連接真機進行

Google在sdk4.0以後提供了一個自動化解決方案uiautomator:

優點:可以跨應用了;這可是親生的;

缺點:必須sdk4.0以上版本;要想實現的好,最好有開發配合;java項目編譯為jar後需要push到手機才能運行,也就是說必須列印日誌暴力調試。

Appium基於Android InstrumentationFramework和UIAutomator,也就是說這個工具是可以跨應用的。說遠了,好吧,為了幫大家更容易理解appium的使用,我這里就講一下uiautomator的使用方法。

你應該有android-sdk吧,升級到4.0以上,進入目錄android-sdk ools,你會看到兩個文件:

traceview.bat 和 uiautomatorviewer.bat,這倆文件讓你想起了monkeyrunner了吧,是的,traceview.bat就對應於hierarchyviewer.bat,用來查看程序的ui界面的,通常也是使用管理員許可權啟動的。

好了,現在用eclipse創建一個java project,是的,你沒看錯,是java project不是android project,添加引用:

在project.properties中內容為:

# Project target.

target=android-16

這里的android-16需要和之前的android.jar和uiautomator.jar位置相一致。

然後呢?寫代碼吧,建立一個類,得,發個給大家參考:

packagecom.uia.example.my;

importorg.apache.http.util.EncodingUtils;

importandroid.graphics.Bitmap;

importandroid.graphics.BitmapFactory;

importandroid.graphics.Rect;

importandroid.os.Environment;

importcom.android.uiautomator.core.UiObject;

importcom.android.uiautomator.core.UiObjectNotFoundException;

importcom.android.uiautomator.core.UiScrollable;

importcom.android.uiautomator.core.UiSelector;

importcom.android.uiautomator.testrunner.UiAutomatorTestCase;

importjava.io.File;

importjava.io.FileOutputStream;

importjava.io.IOException;

{

publicStringsLog;

publicFilefout=null;

=null;

publicvoidwrite2file(String filename,String sData)

{

String sLog="";

//初始化日誌文件

if(Environment.getExternalStorageState().equals(Environment.MEDIA_MOUNTED)){

sLog = Environment.getExternalStorageDirectory().getAbsolutePath();

try{

fout=newFile(sLog,filename);

outStream=newFileOutputStream(fout,true);//此處的true是append

sData=sData +" ";

outStream.write(sData.getBytes());

outStream.flush();

outStream.close();

fout=null;

}

catch(Exception e){

e.printStackTrace();

}

}else{

System.out.println("該手機沒有SD卡");

}

}

publicvoidtestDemo() {

//1.啟動app

getUiDevice().pressHome();

UiObject allAppsButton =newUiObject(newUiSelector().description("Apps"));

allAppsButton.clickAndWaitForNewWindow();

UiObject appsTab =newUiObject(newUiSelector().text("Apps"));

appsTab.click();

UiScrollable appViews =newUiScrollable(newUiSelector().scrollable(true));

UiObject settingsApp = appViews.getChildByText(newUiSelector().className(android.widget.TextView.class.getName()),"Efilm");

settingsApp.clickAndWaitForNewWindow();

//2.進入主界面

System.out.println("into main view");

System.out.println(getUiDevice().waitForWindowUpdate("com.eshore.efilm", 60000));

System.out.println("intoed main view");

UiObject tv1 =newUiObject(newUiSelector().text("影院"));

tv1.click();

//3.點擊影院

UiObject oyy=newUiObject(newUiSelector().description("cinema_row"));

System.out.println("wait yingyuan come out");

oyy.waitForExists(60000);

System.out.println("yingyuan come out");

oyy.clickAndWaitForNewWindow();

System.out.println("click yingyuan");

//4.場次

UiObject occ=newUiObject(newUiSelector().description("LinearLayout10"));

System.out.println("wait changci come out");

oyy.waitForExists(60000);

System.out.println("changci come out");

occ.clickAndWaitForNewWindow();

System.out.println("click changci");

//5.座位

UiObject oseat=newUiObject(newUiSelector().description("cinema_shows_list_item").index(0).childSelector(newUiSelector().description("LinearLayout10")));

System.out.println("wait seat come out");

oseat.waitForExists(5000);

inth=getUiDevice().getDisplayHeight();

intw=getUiDevice().getDisplayWidth();

System.out.println("(h/2,w/2)="+h/2+","+w/2);

getUiDevice().click(h/2,w/2);

//System.out.println("seat count:"+String.valueOf(oseat.getChildCount()));

//System.out.println("seat getText:"+ oseat.getText());

//截座點陣圖

Process process;

try{

process = Runtime.getRuntime().exec("screencap /mnt/sdcard/EfilmFailSnapShot01.png");

try{

process.waitFor();

}catch(InterruptedException e) {//TODOAuto-generated catch block

e.printStackTrace();

}

}catch(IOException e) {

//TODOAuto-generated catch block

e.printStackTrace();

}

//takeScreenShots("EfilmSeatSnapShot");

}

}

這個例子是隨便寫的,可能不夠嚴謹。大體就這么個情況吧。下一步就是編譯執行了,先插上手機usb介面,然後打開cmd,執行:

找到SDKID,也就是android create中的-t參數:

cd C: PROGRAMandroid-sdk ools

android list

找到t參數的值以後:

cd C: PROGRAMandroid-sdk ools

android create uitest-project -n TAppWorkAssistV1 -t 25 -p C:android自動化Tv2.0TestSetting

cd C:android自動化Tv2.0TestSetting

ant build

cd C:android自動化Tv2.0TestSettingin

adb push TAppWorkAssistV1.jar /data/local/tmp/

adb shell uiautomator runtest TAppWorkAssistV1.jar -c com.uia.example.my. TAppWorkAssistV1

看了看,好像沒有什麼特別值得解釋的

-n TAppWorkAssistV1:類名

-p: 項目所在目錄

Ant build 把這個類編譯成一個jar包:TAppWorkAssistV1.jar

然後把jar包push到手機上,調用執行這個類就可以了

大致是這么個步驟,不過有一個非常重要的細節,就是如果你需要更省心,就最好把界面元素,無論動態的還是布局文件中的,都加上content-description屬性,並保證唯一性,根據:

UiSelector:description(String desc)

Set the search criteria to match thecontent-description property for a widget.

那就可以統一隻使用這一個引用界面元素的方法就行了,就不用去想方設法利用其它的屬性來引用了。

2. 做Android手機軟體測試需要掌握哪些工具

請注意測試本身不是靠工具的而是靠設計,這是我的理念,所以我一向覺得,很多人認為做測試做的好就是靠掌握一門好的工具,這個觀點是不正確的,所以我可以負責任的告訴你,做Android手機需要掌握的不是工具、而是理念、思維、以及框架,總的來說是本質,而工具只是輔助,那麼現在我來介紹一些我了解的工具(僅僅是了解,很多沒用過)
開源 Android 軟體測試工具包括:Android Test Kit, AndroidJUnit4, Appium, calabash-android, Monkey, MonkeyTalk, NativeDriver, Robolectric, RoboSpock, Robotium, UIAutomator, Selendroid。
Android Test Kit
Android Test Kit 是一組 Google 開源測試工具,用於 Android 平台,包含 Espresso API 可用於編寫簡潔可靠的 Android UI 測試。
AndroidJUnit4
AndroidJUnit4 是一個讓 JUnit 4 可以直接運行在 Android 設備上的開源命令行工具。
Appium
Appium 是一個開源、跨平台的自動化測試工具,用於測試原生和輕量移動應用,支持 iOS, Android 和 FirefoxOS 平台。Appium 驅動蘋果的 UIAutomation 庫和 Android 的 UiAutomator 框架,使用 Selenium 的 WebDriver JSON 協議。Appinm 的 iOS 支持是基於 Dan Cuellar's 的 iOS Auto. Appium 同時綁定了 Selendroid 用於老的 Android 平台測試。
Calabash-android
calabash-android 是一個基於 Cucumber 的 Android 的功能自動化測試框架。Calabash 允許你寫和執行,是開源的自動化移動應用測試工具,支持 Android 和 iOS 原生應用。Calabash 的庫允許原生和混合應用的交互測試,交互包括大量的終端用戶活動。Calabash 可以媲美 Selenium WebDriver。但是, 需要注意的是 web 應用和桌面環境的交互跟觸摸屏應用的交互是不同的。Calabash 專為觸摸屏設備的原生應用提供 APIs。
Monkey
Monkey 是 Google 開發的 UI/應用測試工具,也是命令行工具,主要針對壓力測試。你可以在任意的模擬器示例或者設備上運行。Monkey 發送一個用戶事件的 pseudo-random 流給系統,作為你開發應用的壓力測試。
MonkeyTalk
MonkeyTalk 是世界上最強大的移動應用測試工具。MonkeyTalk 自動為 iOS 和 Android 應用進行真實的,功能性交互測試。MonkeyTalk 提供簡單的 "smoke tests",復雜數據驅動的測試套件。MonkeyTalk 支持原生,移動和混合應用,真實設備或者模擬器。MonkeyTalk 使得場景捕獲非常容易,可以記錄高級別,可讀的測試腳本。同樣的命令可以用在 iOS 和 Android 應用上。你可以記錄一個平台的一個測試,並且可以在另外一個平台回放。MonkeyTalk 支持移動觸摸和基於手勢交互為主的移動體驗。點擊,拖拽,移動,甚至是手指繪制也可以被記錄和回放。
NativeDriver
NativeDriver 是 WebDriver API 的實現,是原生應用 UI 驅動,而不是 web 應用。
Robolectric
Robolectric 是一款Android單元測試框架,使用 Android SDK jar,所以你可以使用測試驅動開發 Android 應用。測試只需幾秒就可以在工作站的 JVM 運行。Robolectric 處理視圖縮放,資源載入和大量 Android 設備原生的 C 代碼實現。Robolectric 允許你做大部分真實設備上可以做的事情,可以在工作站中運行,也可以在常規的 JVM 持續集成環境運行,不需要通過模擬器。
RoboSpock
RoboSpock 是一個開源的 Android 測試框架。提供簡單的編寫 BDD 行為驅動開發規范的方法,使用Groovy 語音,支持 Google Guice 庫。RoboSpock 合並了 Robolectric 和 Spock 的功能。
Robotium
Robotium 是一款國外的Android自動化測試框架,主要針對Android平台的應用進行黑盒自動化測試,它提供了模擬各種手勢操作(點擊、長 按、滑動等)、查找和斷言機制的API,能夠對各種控制項進行操作。Robotium結合Android官方提供的測試框架達到對應用程序進行自動化的測 試。另外,Robotium 4.0版本已經支持對WebView的操作。Robotium 對Activity,Dialog,Toast,Menu 都是支持的。
UIAutomator
uiautomator 測試框架提高用戶界面(UI)的測試效率,通過自動創建功能 UI 測試示例,可以在一個或者多個設備上運行你的應用。
Selendroid
Selendroid 是一個 Android 原生應用的 UI 自動化測試框架。測試使用 Selenium 2 客戶端 API 編寫。Selendroid 可以在模擬器和實際設備上使用,也可以集成網格節點作為縮放和並行測試。

3. 如何注入click事件與Android UiAutomation.injectInputEvent

基本介紹
有時候我們需要更快捷的運行UIAutomation,下面就給大家分享一下在Command Line中運行UIAutomation的方法
instruments -w deviceID -t defaultTemplateFilePath targetAppName -e UIASCRIPT scriptFilePath -e UIARESULTSPATH resultsFolderPath
各參數釋義:
deviceID:就是通常說的UDID,一個40位的設備唯一識別碼,可以在Xcode–organizer中的devices中找到(注意:最新的Xcode6已經把devices從organizer中分離了出來)
defaultTemplateFilePath:Automation的默認模板文件路徑,如果你使用的是Xcode5,其路徑在「/Applications/Xcode.app/Contents/Applications/Instruments.app/Contents/PlugIns/
AutomationInstrument.bundle/Contents/Resources/Automation.tracetemplate」,如果你已經升級到了Xcode6,則其路徑就變成了「/Applications/Xcode.app/Contents/Applications/Instruments.app/Contents/PlugIns/
AutomationInstrument.xrplugin/Contents/Resources/Automation.tracetemplate」。
targetAppName:應用的名稱,也就是應用的Bundle Identifier,在Xcode General中可以看到
scriptFilePath:需要執行的腳本路徑
resultsFolderPath:需要輸出的結果路徑
實踐
如果你使用的是Xcode5
模擬器(在模擬器上運行不需要UDID,但是需要將targetAppName替換成具體的模擬器的沙盒應用程序,在Xcode5下模擬器的沙盒應用程序位於 /Users/Your_UserName/Library/Application Support/iPhone Simulator/Simulator_Version/Applications中)
instruments -t /Applications/Xcode.app/Contents/Applications/Instruments.app/Contents/PlugIns/
AutomationInstrument.xrplugin/Contents/Resources/Automation.tracetemplate "/Users/kingson/Library/Application Support/iPhone Simulator/7.1/Applications/C28DDC1B-810E-43BD-A0E7-C16A680D8E15/Testapp.app" -e UIASCRIPT/Users/kingson/PycharmProjects/ynm3k/robot4ios/util/logtree.js -e UIARESULTSPATH /Users/kingson/UIAutomationResult
真機
instruments -w ae04eebadcd519******** -t /Applications/Xcode.app/Contents/Applications/Instruments.app/Contents/PlugIns/
AutomationInstrument.bundle/Contents/Resources/Automation.tracetemplate Testapp -e UIASCRIPT/Users/kingson/PycharmProjects/ynm3k/robot4ios/util/logtree.js -e UIARESULTSPATH /Users/kingson/UIAutomationResult
如果你使用的是Xcode6
模擬器(注意:在Xcode6中,模擬器的沙盒應用程序位置變成了 /Users/Your_UserName/Library/Developer/CoreSimulator/Devices/Simulator_UDID/data/Containers/Bundle/Application中)
instruments -t /Applications/Xcode.app/Contents/Applications/Instruments.app/Contents/PlugIns/
AutomationInstrument.xrplugin/Contents/Resources/Automation.tracetemplate "/Users/kingson/Library/Developer/CoreSimulator/Devices/E48D90E6-8313-4318-8064-48B16462AD8E/data/Containers/Bundle/Application/35A7348C-059D-42BA-86F4-ADFFD76DC182/Testapp.app" -e UIASCRIPT/Users/kingson/PycharmProjects/ynm3k/robot4ios/util/logtree.js -e UIARESULTSPATH /Users/kingson/UIAutomationResult
真機
instruments -w ae04eebadcd519******** -t /Applications/Xcode.app/Contents/Applications/Instruments.app/Contents/PlugIns/
AutomationInstrument.xrplugin/Contents/Resources/Automation.tracetemplate Testapp -e UIASCRIPT/Users/kingson/PycharmProjects/ynm3k/robot4ios/util/logtree.js -e UIARESULTSPATH /Users/kingson/UIAutomationResult
其他注意點問題
運行時需要關閉設備的密碼驗證,否則會提示:device locked
如果指定目錄,就會在指定目錄中生成一個Run 1的文件,其中是一些運行的截圖以及Plist文件以及在當前目錄下生成一個instrumentscli.trace文件,如果沒有指定輸出結果路徑或者指定的路徑不存在,默認只會在當前目錄生成一個instrumentscli.trace文件

4. Android uiautomator 自動化測試如何打log,方便查看測試結果

互相學習android自動化測試,請關注我的微博:weibo.com/ganchaojiang
一、一個BUG引發的問題
如果研發過程中有一個BUG:「不斷的切換手機語言出現花屏現象」。這個問題我們如何驗證呢?我想,最好的方式應該是自動化測試。
那麼,自動化測試可以完成哪些任務呢?
簡單的說,那些重復性的測試工作,都可以交給自動化完成:
1、設置手機的語言
2、添加、刪除、收藏聯系人
3、撥號、掛斷
4、甚至發送簡訊、收藏簡訊

如果需要上面的功能,那麼就開始自動化之旅吧。

二、Android自動化測試簡單介紹
Android自動化測試主要分為Monkeyrunner、Rubotium、UiAutomator、Monkey(在我看來這個不算)等。主要特點:
1、Monkeyrunner:優點:操作最為簡單,可以錄制測試腳本,可視化操作;缺點:主要生成坐標的自動化操作,移植性不強,功能最為局限;
2、Rubotium:主要針對某一個APK進行自動化測試,APK可以有源碼,也可以沒有源碼,功能強大;缺點是針對APK操作,而且需要對APK重新簽名(有工具),因此操作相對復雜;
3、UiAutomator:優點:可以對所有操作進行自動化,操作簡單;缺點:Android版本需要高於4.0,無法根據控制項ID操作,相對來說功能較為局限,但也夠用了;
4、Monkey:准確來說,這不算是自動化測試,因為其只能產生隨機的事件,無法按照既定的步驟操作;
由上面介紹可以有這樣的結論:測試某個APK,可以選擇Rubotium;測試過程可能涉及多個APK,選擇UiAutomator;一些簡單的測試,選擇Monkeyrunner;

本文主要介紹UiAutomator的使用方法。

三、環境搭建
3.1、必備條件:
1、JDK
2、SDK(API高於15)
3、Eclipse(安裝ADT插件)
4、ANT(用於編譯生成jar)

3.2、簡要步驟:
1、安裝JDK並添加環境變數。
安裝後,一定要通過JAVA_HOME的方式添加環境變數,即先建立JAVA_HOME變數,然後在path中添加%JAVA_HOME%\bin;
2、添加SDK環境變數。
一定要先建立ANDROID_HOME,然後把%ANDROID_HOME%\tools添加到path中;
3、安裝Eclipse,並安裝ADT插件。
4、安裝ANT工具,並添加環境變數。

同樣一定要先建立%ANT_HOME%變數,然後在path中添加%ANT_HOME%\bin

四、詳細操作
4.1、建立工程
用Eclipse新建Java Project,注意,不是Android Project!
4.2、添加JUnit庫
next->Libraries->Add Library

4.3、添加Android庫
Add External JARs:
找到路徑Android-sdk\platforms\android-17\下面的android.jar和uiautomator.jar添加進來:
所有庫添加完應該是這個樣子:

4.4、在src中添加包,然後添加class文件
文件內容為:

[java] view plain
package com;
import com.android.uiautomator.core.UiObject;
import com.android.uiautomator.core.UiObjectNotFoundException;
import com.android.uiautomator.core.UiScrollable;
import com.android.uiautomator.core.UiSelector;
import com.android.uiautomator.testrunner.UiAutomatorTestCase;

public class Runner extends UiAutomatorTestCase {

public void testDemo() throws UiObjectNotFoundException {
getUiDevice().pressHome();
// 進入設置菜單
UiObject settingApp = new UiObject(new UiSelector().text("Settings"));
settingApp.click();
//休眠3秒
try {
Thread.sleep(3000);
} catch (InterruptedException e1) {
// TODO Auto-generated catch block
e1.printStackTrace();
}
// 進入語言和輸入法設置
UiScrollable settingItems = new UiScrollable( new UiSelector().scrollable(true));

UiObject languageAndInputItem = settingItems.getChildByText(
new UiSelector().text("Language & input"), "Language & input", true);
languageAndInputItem.clickAndWaitForNewWindow();

}
}
上面工程路徑在e:\workspace\AutoRunner,類全名為com.Runner,至於具體的作用我們現在不去關心。

4.5、找到SDK ID
CMD進入\Android-sdk\tools\目錄下,運行命令:

android list

查看對應android版本的SDK的ID值,當前是60;

4.6、創建build文件
仍然在\Android-sdk\tools\目錄下,運行命令:
android create uitest-project -n <name> -t <android-sdk-ID> -p <path>
比如:
android create uitest-project -n AutoRunner -t 60 -p e:\workspace\AutoRunner
上面的name就是將來生成的jar包的名字,可以自己定義,android-sdk-ID就是上面看到的6;path是Eclipse新建的工程的路徑;運行命令後,將會在工程的根目錄下生成build.xml文件。如果沒生成,檢查上面的步驟。

4.7、編譯生成jar
CMD進入項目的工程目錄,然後運行ant build,將使用ant編譯生成jar,成功將會提示:

然後會在bin目錄下生成jar文件。

4.8、push並運行jar
adb push <jar文件路徑> data/local/tmp
adb shell uiautomator runtest <jar文件名> -c <工程中的類名,包含包名>
比如:
adb push e:\workspace\AutoRunner\bin\AutoRunner.jar data/local/tmp
adb shell uiautomator runtest AutoRunner.jar -c com.Runner

然後就能看到手機會按照Runner中的步驟自動執行。具體效果就是,進入設置菜單,然後再進入「語言和輸入法」菜單

五、代碼分析
我們從幾個最重要的對象來介紹。

5.1、UiDevice對象
getUiDevice()的方法可以得到一個UiDevice的對象,通過這個對象可以完成一些針對設備的動作:
click(int x, int y)
----在(x,y)表示的像素地方點擊
pressBack()
pressDelete()
pressEnter()
pressHome()
pressMenu()
pressSearch()
----點擊相應的按鍵
wakeUp()
----當手機處於滅屏狀態時,喚醒屏幕,並解鎖。
swipe(startX, startY, endX, endY, steps)
----在手機上滑動,從(startX,startY)到(endX,endY)。steps表示滑動的這個距離分為幾步完成,數目越少,滑動幅度越大。
setOrientationLeft()
setOrientationRight()
----將手機向相應方向旋轉。
setOrientationNatural()
----將手機旋轉狀態回歸正常。

5.2、UiSelector對象
這個對象可以理解為一種條件對象,描述的是一種條件,經常配合UiObject使用,可以得到某個(某些)符合條件的控制項對象。
checked(boolean val)
----描述一種check狀態為val的關系。
className(className)
----描述一種類名為className的對象關系
clickable(boolean val)

http://blog.csdn.net/g19920917/article/details/16131565

閱讀全文

與androiduiautomation相關的資料

熱點內容
java同步並發 瀏覽:249
fw壓縮圖片 瀏覽:256
淘寶申請源碼靠譜嗎 瀏覽:872
androidupdater 瀏覽:635
c2d游戲源碼大全可復製版 瀏覽:771
電腦怎樣重置網關命令 瀏覽:411
winftplinux 瀏覽:335
推特app界面如何設置成中文 瀏覽:452
太空工程師轉子編程屬性 瀏覽:32
windowscmd關機命令 瀏覽:342
雲桌面只要伺服器裝一套軟體 瀏覽:247
電腦右鍵按到什麼導致文件夾全屏 瀏覽:454
我的世界如何製造伺服器主城 瀏覽:365
linuxssh連不上 瀏覽:297
永宏plc用什麼編程電纜 瀏覽:371
win激活命令行 瀏覽:886
新手學電腦編程語言 瀏覽:893
雲空間在哪個文件夾 瀏覽:926
編程游戲小貓抓小魚 瀏覽:790
安卓dosbox怎麼打開 瀏覽:774