概述:
在Android 4.1發布的時候包含了一種新的測試工具–uiautomator,uiautomator是用來做UI測試的。也就是普通的手工測試,點擊每個控件元素,查看輸出的結果是否符合預期。比如:在登錄界面分別輸入正確和錯誤的用戶名密碼然后點擊登錄按鈕看看是否能否登陸以及是否有錯誤提示等。
uiautomator 是一種移動端自動化UI測試工具。
環境要求:
Android SDK在4.1中提供了如下工具來支持UI自動化測試:
uiautomatorviewer – 一個圖形界面工具來掃描和分析應用的UI控件。
uiautomator – 一個測試的Java庫,包含了創建UI測試的各種API和執行自動化測試的引擎。
要使用該工具,需要滿足如下條件:
Android SDK Tools, Revision 21 or higher
Android SDK Platform, API 16 or higher
uiautomator 測試工具的工作流程:
1.安裝要測試的應用到手機中,分析應用的UI界面元素 並確保被測試應用的各個控件可以被測試工具獲取到。
2.創建指導測試案例來模擬應用中的用戶操作步驟。
3.編譯測試案例代碼為Jar包並復制該Jar包到安裝了待測應用的測試手機中。
4.運行測試並查看結果
5.修改任何發現的bug,然后修復並重新測試。
分析待測應用的UI元素:
在開始編寫測試案例代碼之前,需要熟悉待測應用的UI元素。可以通過uiautomatorviewer 工具來獲取應用的界面截圖並分析。uiautomatorviewer 工具提供了一個便利的方式來查看UI布局結構,並且可以查看各個控件的相關屬性。利用這些信息可以用來創建UI測試代碼。
創建uiautomator 測試案例:
uiautomator 測試案例(Test case)需要繼承至UiAutomatorTestCase 類。而UiAutomatorTestCase 類繼承至junit.framework.TestCase類,所以可以用JUnit的Assert類來比較測試結果。
UI測試的首要任務就是訪問測試手機。一般都是從手機的主屏開始測試的。通過uiautomator 提供的API可以從主屏來模擬用戶的操作。
uiautomator API:
uiautomator API在 uiautomator.jar 文件中。這些API分別如下:
UiDevice:代表設備狀態。在測試中,可以通過UiDevice實例來檢測設備的各種屬性,例如當前的屏幕方向以及屏幕尺寸。同時還可以通過UiDevice實例來執行設備級別的操作,例如把設備設置為橫屏或者豎屏、按下Home按鍵等。
模擬按下Home按鍵的代碼::
getUiDevice().pressHome();
詳細實例:
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() ----將手機旋轉狀態回歸正常。
UiSelector:代表一個搜索UI控件的條件。如果發現多個滿足條件的控件則會返回第一個控件。返回的結果為UiObject對象。在構造UiSelector的時候可以組合使用多個屬性來定位具體的控件。如果沒有找到控件則會拋出 UiAutomatorObjectNotFoundException 異常。還可以使用childSelector()函數來嵌套UiSelector 對象。例如,下面的代碼演示了如何在當前界面中查找第一個ListView中的帶有文本屬性為Apps的子控件:
UiObject appItem = new UiObject(new UiSelector().className("android.widget.ListView").instance(1).childSelector(newUiSelector().text("Apps")));
詳細實例:
checked(boolean val) ----描述一種check狀態為val的關系。 className(className) ----描述一種類名為className的對象關系 clickable(boolean val) ----與checked類似,描述clickable狀態為val的關系 description(desc) ----不解釋 descriptionContains(desc) ----與description類似 focusable(boolean val) ----與checked類似 index(index) ----用當前對象在父對象集中的索引作為描述 packageName(String name) ----用包名作為條件描述 selected(val) ----描述一種選擇關系 text(text) ----最為常用的一種關系,用控件上的文本即可找到當前控件,需要注意,所有使用text屬性找到的控件,必須是英文的。也就是說,不支持通過中文查找控件!(編碼改為utf-8后是可以的)。 textContains(text) ----與text類似 textStartsWith(text) ----與text類似
UiObject:代表一個UI控件。通過UiSelector來查找UiObject。如下示例代碼演示了如何查找當前顯示界面中的取消按鈕和確認按鈕:
UiObject cancelButton = new UiObject(new UiSelector().text("Cancel"));
UiObject okButton = new UiObject(new UiSelector().text("OK"));
查找到的UiObject實例可以在其他測試代碼中重用。需要注意的是:每次使用UiObject做操作的時候uiautomator 都會在當前屏幕重新查找該控件。如下代碼uiautomator 工具在當前界面查找文本內容為“OK”的控件。如果存在並且可用則模擬用戶點擊該控件:
if(okButton.exists() && okButton.isEnabled())
{
okButton.click();
}
還可以限制僅僅查找特定類型的控件。例如,如下代碼只查找文本為“Cancel”和“OK”的android.widget.Button類型控件:
UiObject cancelButton = new UiObject(new UiSelector().text("Cancel").className("android.widget.Button"));
UiObject okButton = new UiObject(new UiSelector().text("OK").className("android.widget.Button"));
詳細實例:
click() ----點擊控件 clickAndWaitForNewWindow() ----點擊某個控件,並等待窗口刷新 longClick() ----長按 clearTextField() ----清除文本,主要針對編輯框 getChildCount() ----這個方法可以看出,其實UiObject也可以是一個控件的集合 getPackageName() ----得到控件的包名 getSelector() ----得到當前控件的選擇條件 getText() ----得到控件上的Text isCheckable() isChecked() isClickable() isLongClickable() isScrollable() isScrollable() isSelected() ----判斷是否具備某個屬性
UiCollection:代表控件的集合。獲取UiCollection的方式和UiObject一樣,通過 UiSelector查找。 UiCollection對應Android系統中的ViewGroup以及子控件。如下代碼演示如何通過UiSelector來獲取包含視頻集合的UiCollection:
UiCollection videos = new UiCollection(new UiSelector().className("android.widget.FrameLayout"));
如果每個視頻是放到LinearLayout中的,則可以通過如下方式獲取視頻的數目:
int count = videos.getChildCount(new UiSelector().className("android.widget.LinearLayout"));
如果需要查找標簽為“Cute Baby Laughing”的視頻,並點擊。則可以通過如下方式:
UiObject video = videos.getChildByText(new UiSelector().className("android.widget.LinearLayout"), "Cute Baby Laughing");
video.click();
同樣還可以模擬其他用戶操作。例如,模擬選擇視頻的操作如下:
UiObject checkBox = video.getChild(new UiSelector().className("android.widget.Checkbox"));
if(!checkBox.isSelected())
checkbox.click();
詳細實例:
getChild(selector) ----從集合中再次通過UiSelector選擇一個UiObject對象 getChildByDescription(childPattern, text) ----從一個匹配模式中再次以text為條件選擇UiObject getChildByText(childPattern, text) ----與上面類似。 getChildCount() ----得到當前集合中控件的個數
UiScrollable:代表可滾動的控件。可以用UiScrollable來模擬水平或者垂直滾動的UI元素。如果需要操作的元素在屏幕外需要滾動屏幕才能看到的情況下需要使用UiScrollable。例如,下面的代碼顯示了如何模擬滾動到“Settings ”菜單並點擊“About tablet”菜單的操作:
UiScrollable settingsItem = new UiScrollable(new UiSelector().className("android.widget.ListView"));
UiObject about = settingsItem.getChildByText(new UiSelector().className("android.widget.LinearLayout"), "About tablet");
about.click()
詳細實例:
UiScrollable settingItems = new UiScrollable( new UiSelector().scrollable(true)); UiObject languageAndInputItem = settingItems.getChildByText(new UiSelector().text("Language & input"), "Language & input",true);
其他API參考uiautomator api文檔。
常用命令:
adb devices:查看設備列表
android list target:查看android sdk id
set ANDROID_SERIAL=:設置ANDROID_SERIAL為需要測試的設備序列號
部分資料為網上收集。