標籤:comm func field 階層 層級 輸入 frame 通過 ini
Android測試(八):UI Automator 自動化測試
發布時間 2017年12月20日 蟲師
原文:https://developer.android.com/training/testing/ui-testing/uiautomator-testing.html
涉及跨多個應用程式的使用者互動的使用者介面(UI)測試可以驗證應用程式在使用者流量跨越其他應用程式或進入系統UI時的行為。 這種使用者流程的一個例子是一個訊息應用程式,它允許使用者輸入簡訊,啟動Android連絡人選取器,以便使用者可以選擇收件者發送訊息,然後將控制權返回給使用者的原始應用程式並提交訊息。
這一小節介紹如何使用Android測試支援庫提供的UI Automator測試架構編寫此類UI測試。 UI Automator API可讓你與裝置上的可見元素進行互動,而不管哪個Activity處於焦點。你的測試可以使用方便的描述符(如該組件中顯示的文本或其內容描述)尋找UI組件。 UI Automator測試可以在運行Android 4.3(API層級18)或更高版本的裝置上運行。
UI Automator測試架構是基於 instrumentation的API,並與AndroidJUnitRunner測試回合器一起使用。
設定UI Automator
在使用UI Automator構建UI測試之前,請確保配置測試原始碼位置和項目依賴關係,如前面章節中所述。
在Android應用程式模組的build.gradle檔案中,必須設定對UI Automator庫的依賴關係引用:
dependencies { ... androidTestCompile ‘com.android.support.test.uiautomator:uiautomator-v18:2.1.1‘}
為了最佳化您的UI Automator測試,您應該首先檢查目標應用程式的UI組件,並確保它們可以訪問。 這些最佳化技巧將在下面兩節中介紹。
查看裝置上的UI
在設計您的測試之前,檢查裝置上可見的UI組件。 為確保您的UI Automator測試可以訪問這些組件,請檢查這些組件是否具有可見的文字標籤、android:contentDescription
值。
uiautomatorviewer工具提供了一個方便的可視化介面來檢查布局階層,並查看裝置前台中可見的UI組件的屬性。這個資訊可以讓你使用UI Automator建立更細緻的測試。例如,可以建立一個匹配特定可見屬性的UI選取器。
啟動uiautomatorviewer工具:
1.在物理裝置上啟動目標應用程式。
2.將裝置串連到你的開發機器。
3.開啟終端視窗並導航到<android-sdk> / tools /
目錄。
4.使用以下命令運行該工具:
$ uiautomatorviewer
要查看您的應用程式的UI屬性:
1.在uiautomatorviewer介面中,點擊 Device Screensho 按鈕。
2.將滑鼠移至上方在左側面板中的快照上,查看由uiautomatorviewer工具標識的UI組件。 屬性列在右下方的面板中,右上方的布局層次中列出。
3.或者,單擊 Toggle NAF Nodes 按鈕以查看UI Automator無法訪問的UI組件。 這些組件只有有限的資訊可用。
確保你的Activity是可訪問的
UI Automator測試架構對已實施Android協助工具功能的應用程式執行得更好。當你使用View類型的UI元素或SDK或Support Library中的View的子類時,不需要實現可訪問性支援,因為這些類已經為你完成了。
但是,有些應用程式使用自訂UI元素來提供更豐富的使用者體驗。 這些元素不會提供自動的可訪問性支援。如果你的應用程式套件組合含不是來自SDK或支援庫的View子類的執行個體,請確保通過完成以下步驟將可訪問性功能添加到這些元素:
1.建立一個擴充ExploreByTouchHelper
的具體類。
2.通過調用setAccessibilityDelegate()
將新類的執行個體與特定的自訂UI元素相關聯。
有關將協助工具功能添加到自訂視圖元素的其他指導,請參閱構建可訪問自訂視圖要詳細瞭解Android上可訪問性的一般最佳實務,請參閱使應用程式更易於訪問。
建立一個UI Automator測試類別
UI Automator測試類別應該像JUnit 4測試類別一樣編寫。 要瞭解有關建立JUnit 4測試類別和使用JUnit 4斷言和注釋的更多資訊,請參閱建立測試單元測試類。
在測試類別定義的開始處添加@RunWith(AndroidJUnit4.class)
注釋。 還需要將Android測試支援庫中提供的AndroidJUnitRunner類指定為您的預設測試回合器。 在裝置或模擬器上運行UI Automator測試中將更詳細地描述此步驟。
在UI Automator測試類別中實現以下編程模型:
1.通過調用getInstance()
方法並傳遞一個Instrumentation對象作為參數,擷取一個UiDevice
對象來訪問要測試的裝置。
2.通過調用findObject()
方法,擷取UiObject
對象以訪問裝置上顯示的UI組件(例如前景中的當前視圖)。
3.通過調用UiObject
方法來類比特定的使用者互動以在該UI組件上執行; 例如,調用performMultiPointerGesture()
來類比多點觸摸手勢,setText()
來編輯文字欄位。你可以根據需要重複調用步驟2和3中的API,以測試涉及多個UI組件或使用者操作序列的更複雜的使用者互動。
4.在執行這些使用者互動之後,檢查UI是否反映了預期的狀態或行為。
以下各節將詳細介紹這些步驟。
訪問UI組件
UiDevice對象是訪問和操作裝置狀態的主要方式。在測試中調用UiDevice
方法來檢查各種屬性的狀態,例如當前方向或顯示大小。 可以使用UiDevice
對象執行裝置層級的操作,例如強制裝置進入特定的旋轉狀態,按下D-pad硬體按鈕,然後按Home(首頁)和Menu(菜單)按鈕。
從裝置的主畫面開始測試是一種很好的做法。從主畫面(或在裝置中選擇的其他位置),你可以調用UI Automator API提供的方法來選擇特定的UI元素並與之互動。
下面的程式碼片段顯示了測試如何得到一個UiDevice
的執行個體,並類比按下一個首頁按鈕:
import org.junit.Before;import android.support.test.runner.AndroidJUnit4;import android.support.test.uiautomator.UiDevice;import android.support.test.uiautomator.By;import android.support.test.uiautomator.Until;...@RunWith(AndroidJUnit4.class)@SdkSuppress(minSdkVersion = 18)public class ChangeTextBehaviorTest { private static final String BASIC_SAMPLE_PACKAGE = "com.example.android.testing.uiautomator.BasicSample"; private static final int LAUNCH_TIMEOUT = 5000; private static final String STRING_TO_BE_TYPED = "UiAutomator"; private UiDevice mDevice; @Before public void startMainActivityFromHomeScreen() { // Initialize UiDevice instance mDevice = UiDevice.getInstance(InstrumentationRegistry.getInstrumentation()); // Start from the home screen mDevice.pressHome(); // Wait for launcher final String launcherPackage = mDevice.getLauncherPackageName(); assertThat(launcherPackage, notNullValue()); mDevice.wait(Until.hasObject(By.pkg(launcherPackage).depth(0)), LAUNCH_TIMEOUT); // Launch the app Context context = InstrumentationRegistry.getContext(); final Intent intent = context.getPackageManager() .getLaunchIntentForPackage(BASIC_SAMPLE_PACKAGE); // Clear out any previous instances intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TASK); context.startActivity(intent); // Wait for the app to appear mDevice.wait(Until.hasObject(By.pkg(BASIC_SAMPLE_PACKAGE).depth(0)), LAUNCH_TIMEOUT); }}
在樣本中,@SdkSuppress(minSdkVersion = 18)
語句有助於確保測試只能在Android 4.3(API層級18)或更進階別的裝置上運行,正如UI Automator架構所要求的那樣。
使用findObject()
方法來檢索一個UiObject
,它表示一個匹配給定選取器條件的視圖。根據需要重複使用在應用程式測試的其他部分建立的UIObject
執行個體。 請注意,每次測試使用UiObject執行個體單擊UI元素或查詢屬性時,UI Automator測試架構都會在當前顯示中搜尋匹配項。
以下片段顯示了測試如何構建表示應用程式中的“取消”按鈕和“確定”按鈕的UIObject
執行個體。
UiObject cancelButton = mDevice.findObject(new UiSelector() .text("Cancel")) .className("android.widget.Button"));UiObject okButton = mDevice.findObject(new UiSelector() .text("OK")) .className("android.widget.Button"));// Simulate a user-click on the OK button, if found.if(okButton.exists() && okButton.isEnabled()) { okButton.click();}
指定選取器
如果要訪問應用程式中的特定UI組件,請使用UiSelector
類。 這個類表示對當前顯示的UI中特定元素的查詢。
如果找到多個匹配元素,則階層中的第一個匹配元素將作為目標UiObject
返回。 構建UiSelector
時,可以將多個屬性連結在一起以最佳化搜尋。 如果找不到匹配的UI元素,則拋出UiAutomatorObjectNotFoundException
。
你可以使用childSelector()
方法來嵌套多個UiSelector
執行個體。 例如,下面的程式碼範例顯示如何測試搜尋以在當前顯示的UI中尋找第一個ListView
,然後在該ListView
內搜尋以尋找具有文字屬性Apps的UI元素。
UiObject appItem = new UiObject(new UiSelector() .className("android.widget.ListView") .instance(0) .childSelector(new UiSelector() .text("Apps")));
最佳做法是,在指定選取器時,應使用資源ID(如果將其分配給UI元素)而不是文本元素或內容描述符。並非所有元素都有文本元素(例如,工具列中的表徵圖)。文本選取器很脆弱,如果UI發生細微的變化,可能會導致測試失敗。他們也可能不能跨越不同的語言; 您的文本選取器可能不匹配翻譯的字串。
在選取器條件中指定對象狀態可能很有用。例如,如果要選擇所有選中的元素的列表,以便取消選中它們,請使用參數設定為true的checked()
方法。
執行操作
一旦你的測試獲得了一個UIObject
對象,可以調用UIObject
類中的方法在該對象表示的UI組件上執行使用者互動。指定如下操作:
UI Automator測試架構允許您通過getContext()
擷取Context對象來發送Intent或啟動一個Activity,而無需使用shell命令。
以下片段顯示了測試如何使用Intent來啟動測試中的應用程式。 這種方法是有用的,當你只是在測試計算機應用程式感興趣,並不關心發射器。
public void setUp() { ... // Launch a simple calculator app Context context = getInstrumentation().getContext(); Intent intent = context.getPackageManager() .getLaunchIntentForPackage(CALC_PACKAGE); intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TASK); // Clear out any previous instances context.startActivity(intent); mDevice.wait(Until.hasObject(By.pkg(CALC_PACKAGE).depth(0)), TIMEOUT);}
對集合執行操作
如果要類比項目集合(例如,音樂相簿中的歌曲或收件匣中的電子郵件列表)上的使用者互動,請使用UiCollection
類。要建立UiCollection
對象,請指定一個UiSelector
,用於搜尋UI容器或其他子UI元素的封裝器,例如包含子UI元素的布局視圖。
以下程式碼片段顯示了測試如何構建UiCollection
來表示在FrameLayout
中顯示的視頻專輯:
UiCollection videos = new UiCollection(new UiSelector() .className("android.widget.FrameLayout"));// Retrieve the number of videos in this collection:int count = videos.getChildCount(new UiSelector() .className("android.widget.LinearLayout"));// Find a specific video and simulate a user-click on itUiObject video = videos.getChildByText(new UiSelector() .className("android.widget.LinearLayout"), "Cute Baby Laughing");video.click();// Simulate selecting a checkbox that is associated with the videoUiObject checkBox = video.getChild(new UiSelector() .className("android.widget.Checkbox"));if(!checkBox.isSelected()) checkbox.click();
在可滾動視圖上執行操作
使用UiScrollable
類類比垂直或水平滾動顯示。 當UI元素位於螢幕外並且需要滾動以將其顯示在視圖中時,此技術很有用。
以下程式碼片段顯示了如何類比向下滾動“Settings ”菜單並點擊“About tablet option”:
UiScrollable settingsItem = new UiScrollable(new UiSelector() .className("android.widget.ListView"));UiObject about = settingsItem.getChildByText(new UiSelector() .className("android.widget.LinearLayout"), "About tablet");about.click();
驗證結果
InstrumentationTestCase擴充了TestCase,因此你可以使用標準的JUnit Assert
方法來測試應用程式中的UI組件,以返回預期的結果。
以下片段顯示了如何在計算機應用程式中找到幾個按鈕,然後按順序點擊它們,然後驗證是否顯示了正確的結果。
private static final String CALC_PACKAGE = "com.myexample.calc";public void testTwoPlusThreeEqualsFive() { // Enter an equation: 2 + 3 = ? mDevice.findObject(new UiSelector() .packageName(CALC_PACKAGE).resourceId("two")).click(); mDevice.findObject(new UiSelector() .packageName(CALC_PACKAGE).resourceId("plus")).click(); mDevice.findObject(new UiSelector() .packageName(CALC_PACKAGE).resourceId("three")).click(); mDevice.findObject(new UiSelector() .packageName(CALC_PACKAGE).resourceId("equals")).click(); // Verify the result = 5 UiObject result = mDevice.findObject(By.res(CALC_PACKAGE, "result")); assertEquals("5", result.getText());}
在裝置或模擬器上運行UI Automator測試
你可以從Android Studio或從命令列運行UI Automator測試。 確保將AndroidJUnitRunner指定為項目中的預設偵查工具。
要運行UI Automator測試,請按照前面章節中所述的步驟來運行測試。
Android測試(八):UI Automator 自動化測試