Android測試(八):UI Automator 自動化測試

來源:互聯網
上載者:User

標籤: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組件上執行使用者互動。指定如下操作:

  • click():單擊UI元素的可見邊界的中心。

  • dragTo():將此對象拖動到任意座標。

  • setText():清除欄位內容後,設定可編輯欄位中的文本。 相反,clearTextField()方法會清除可編輯欄位中的現有文本。

  • swipeUp():對UiObject執行滑動操作。 同樣,swipeDown(),swipeLeft()和swipeRight()方法也會執行相應的操作。

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 自動化測試

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.