Android教程網
  1. 首頁
  2. Android 技術
  3. Android 手機
  4. Android 系統教程
  5. Android 游戲
 Android教程網 >> Android技術 >> 關於Android編程 >> 跨多個App的UI測試

跨多個App的UI測試

編輯:關於Android編程

水平有限自己感覺很多地方表達的並不到位,但找不到更好的表達方式,如果您覺著有更好的表達方式,幫助我改進!

跨越多個App進行UI測試

通過跨越多個APP之間的交互來測試你的APPUI,讓你確認你的APP表現是否正確,比如:用戶在你的APP和其他APP之間或者進入系統UI之間進行切換操作時。一個例子比如用戶切換至短信APP它允許用戶輸入一個文本消息,然後切換到Android通訊錄來選擇要發送的目標,然後再返回短信APP來發送短信。

這節課包括了如何使用Android Testing Support Library提供的UI自動化測試框架來編寫這些UI測試。UI自動化API可以讓你和設備上可視的元素進行交互,忽視是和哪個activity在進行交互。你的測試可以通過方便的使用描述查閱一個UI組件,比如一個組件展示的text 或者它的內容描述。UI自動化測試可以運行在Android 4.3(Api level 18)或者更高的級別的Api上。

UI自動化測試框架基於instrumentation Api並且借助AndroidJUnitRunner測試運行器來工作。

設置 UI Automator

在你開始使用UI Automator 進行UI測試之前,確保你的工程按照開始你的測試中描述的那樣配置了你的測試代碼目錄和工程依賴。

在你Android APP module的build.gradle 文件中,你必須設置UI Automator library 的依賴:

dependencies {
    ...
    androidTestCompile 'com.android.support.test.uiautomator:uiautomator-v18:2.1.1'
}

為了優化你的UI automator測試,你必須首先檢查目標APP的UI組件,確保他們都是可以獲得的。這些優化建議將會在下面兩部分中講到。

在設備上檢查UI

在設計你的測試之前,你應該在設備上檢查UI組件是否是可見的。為了保證你的UI Automator測試 可以獲取這些組件,檢查這些組件是否有可見的text標簽、是否配置了android:contentDescription或者兩個都有。

Uiautomatorviewer工具提供了方便的視覺界面來檢查布局層級和查看UI組件的屬性,他們在設備的前台是可見的。借助這些信息你可以使用UI Automator創建更細膩的測試。比如,你可以創建一個UI seletor,它可以匹配一個特殊的視覺屬性。

加載一個uiautomatorviewer工具:

加載一個目標APP到物理設備上。 將該設備連接到你的開發機器上 打開一個終端然後定位到/tools/目錄下。 用命令運行該工具
    $ uiautomatorviewer

查看你的應用的UI的特性

在 uiautomatorviewer界面,點擊 設備截屏 按鈕。 通過uiautomatorviewrtool懸浮在左面板的快照可以概覽UI組件定義。該組件的特性被列在右面板下方,布局層級在右面版的上方。 選擇性的點擊 Toggle NAF 節點按鈕,來查看那些不會被UI Automator 獲取的UI組件,不過只能獲取這些組件的有限信息。

了解Android 提供的通用UI組件,查看User Interface.

確保你的Activity是可以獲得的

UI Automator測試框架依靠Android framework可獲得的特性來查看獨立的UI元素。作為一個開發者,你應該在你的Activity中實現這些最基本的優化來支持UI automator:

使用 android:contentDescription屬性來給ImageButton 、ImageView、CheckBox加標簽和其他的用戶界面控制組件。 給EditText提供一個android:hint屬性來代替內容描述。 將android:hint屬性和任何的圖形icon結合起來給用戶提供反饋(比如,狀態信息) 使用uiautomatorviewer工具類確保UI組件可以被測試框架獲取到。你也可以測試應用程序通過打開獲取服務像TalkBack 然後通過觸摸來浏覽,然後嘗試著僅在一個方向上使用你的應用。

通常情況下,APP開發者很容易獲得View 和 ViewGroup支持,然而,一些APP使用了自定義view來給用戶提供更豐富的用戶體驗。這些自定義的元素將不會獲得標准的UI元素提供的支持。如果你的APP使用了自定義view,確保通過實現 AccessibilityNodeProvider類為Android獲取服務暴露了自定義繪圖UI元素。

如果自定義view元素包含了單個的元素,讓他通過實現Api方法來變得可以被獲得。如果自定義view包含了元素,他們不是view自己的(比如,一個WevView,確保它實現了AccessibilityNodeProvider類。)對於包裹類的view它繼承子一個存在的包裹容器實現(比如,一個listview),實現AccessibilityNodeProvider 不是必須的。

對於更多信息 關於實現和測試的可獲得性,參見 Making Applications Accessible。

創建一個UI Automator測試類

你的UI Automator測試類應該按照JUnit 4測試類的風格來寫。為了學習更多關於創建JUnit 4測試類和使用JUnit 4進行斷言、注解

在你開始定義測試類的地方添加@RunWith(AndroidJUnit4.class)注解。你也應該聲明Android Testing Support Library 中提供的 AndroidJUnitRunner 作為你的默認測試運行器。
這個步驟更詳細的描述參見: Run UI Automator Tests on a Device or Emulator.

根據下面的編程規則來編寫你的UI Automator測試類:

獲取UiDevice對象來訪問你想測試的設備,通過調用getInstance()方法然後傳遞一個Instrumentation對象參數進入 通過調用 findObject()方法,獲取一個UIObject對象來訪問在設備上展示的UI組件(比如,正在前台的當前view)。 通過調用UiObject的方法來模擬一個具體的和UI組件之間的交互。比如,調用performMultiPointerGesture()來模擬復雜的觸摸手勢,和setText()來編輯一個text字段。你可以按照需要重復調用第2步和第3步的Api來測試更復雜的用戶交互它讓更多的UI組件參與進來或者一系列的用戶動作。 Check that the UI reflects the expected state or behavior, after these user interactions are performed.檢查當這些用戶交互執行後,UI是否按照期望的狀態或表現給予了回饋。

這些步驟在下面的章節中被大量使用到。

訪問UI組件

UiDevice是最基本的訪問和操作你的設備狀態的方式。在你的測試中,你可以調用UiDevice方法來檢查不同的特性,比如當前方向或者展示的尺寸。你的測試可以使用UiDevice對象來執行設備級別的動作,比如對設備進行旋轉,按壓D-pad硬件按鈕,以及按壓 Home 和 Menu 按鈕。

最好的做法是從設備的Home屏開始測試,在Home屏幕(或者設備上你選擇的其他開始的位置),你可以調用UI Automator Api 提供的方法來選擇和具體的UI元素進行交互。

下面的代碼片段向你展示了如何來獲取UiDevice的實例和模擬按壓Home鍵:

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 level 18)或者更高的版本上,因為UI Automator框架需要的android SDK版本最低不能低於18.

使用findObject()方法來獲取一個UiObject它代表了和給定選擇標准相匹配的一個view。你可以復用在你的APP測試中的其它部分創建的UiObject實例。需要注意的是,在你每次使用UiObject實例來點擊一個UI element 或者查詢一個屬性時,UI Automator 測試框架就會尋找一個相匹配的顯示。

The following snippet shows how your test might construct UiObject instances that represent a Cancel button and a OK button in an app.下面的代碼片段向你展示了,你的測試如何創建一個UiObject實例,它代表APP中的一個Cancle按鈕和一個OK按鈕。

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();
}

具體聲明一個selector

如果你想訪問APP中的一個具體的UI組件,可以使用 UiSelector類。這個類代表了一個對當前顯示的UI的具體元素的查詢。

如果有多個匹配元素被找到的話,在布局層級中第一個匹配到的元素將被作為一個UiObject對象返回。當構建一個UiSelector的時候,你可以將多個屬性串聯起來,來重新組織一個查詢。如果沒有找到相匹配的UI 元素,將會拋出一個 UiAutomatorObjectNotFoundException

你可以將childSelector()方法和UiSelector實例相互嵌套來使用。比如,下面的代碼實例向你展示了如何在你的測試裡具體聲明一個查詢,來尋找當前展示的UI裡的第一個listview ,然後來尋找這個listview中的有text屬性的UI元素。

UiObject appItem = new UiObject(new UiSelector()
        .className("android.widget.ListView")
        .instance(1)
        .childSelector(new UiSelector()
        .text("Apps")));

最好的方式,當具體聲明一個selector的時候,你應該使用一個Resource ID (如果你已經給一個UI元素聲明了的話) 來代替一個text元素或者 content-descriptor。不是所有的元素都有text元素(比如,toolbar 中的icons)。Text selectors是非常脆弱的,如果你修改UI的話很容易導致測試失敗。他們可能也不會跨語言,你的text selectors 可能不會匹配翻譯後的strings.

指定對象的狀態在你的selector標准裡是非常有用的。比如,如果你想選擇一系列的被選擇的元素,那樣你可以uncheck他們,調用checked()方法並傳遞true作為他們的參數。

執行Actions

一旦你的測試已經獲得了一個UiObject 對象,你可以調用在UiObject類中的方法來執行那個對象代表的UI組件的用戶交互。 你可以具體聲明這些動作為:

click() :點擊UI元素可視區域的中心 dragTo() : 拖拽這個對象至指定的坐標 setText() : 在清除完該字段的內容後,給該字段設置內容。相反的,clearTextField()方法清除一個可編輯字段中存在的內容。 swipeUp() :在UiObject對象上執行swipe up 動作,相似的,swipeDown() , swipeLeft() 和 swipeRight()方法執行相匹配的動作。

UI自動化測試框架允許你發送一個Intent或者加載一個Activity 在不使用shell命令的情況下,通過getContext()方法來獲取一個Context對象。

下面的代碼片段告訴你如何使用Intent來加載一個App進行測試。這種方式是非常有用的當你僅僅對測試計算器App感興趣時,並且不擔心launcher

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);
}

在集合上執行操作

如果你想模擬和一個集合的條目進行交互(比如,在一個音樂album中的歌曲或者在收件箱中的一個郵件列表),可以使用UiCollection類。為了創建一個UiCollection對象,具體聲明一個UiSelector它尋找一個UI容器或者一個其它子UI元素的包裝器,比如一個布局view它包含子UI元素。

下面的代碼片段向你展示了如何在你的測試中構建一個UiCollection來代表一個video album 它被展示在一個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 it
UiObject video = videos.getChildByText(new UiSelector()
        .className("android.widget.LinearLayout"), "Cute Baby Laughing");
video.click();

// Simulate selecting a checkbox that is associated with the video
UiObject checkBox = video.getChild(new UiSelector()
        .className("android.widget.Checkbox"));
if(!checkBox.isSelected()) checkbox.click();

在可滾動的view中執行動作

Use the UiScrollable class to simulate vertical or horizontal scrolling across a display. This technique is helpful when a UI element is positioned off-screen and you need to scroll to bring it into view.使用UiScrollable類來模擬水平或者豎直方向上的滾動。這個技巧是非常有用的,當一個UI元素已經滾動出屏幕後,你需要通過滾動來讓它進入視野。

下面的代碼片段展示了如何來模擬向下滾動設置菜單,然後點擊about選項:

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 斷言方法來測試你的App中的UI元素是否返回預期的結果。

下面的代碼片段展示了你的測試如何找出一個計算器App的button,按照順序來點擊他們,接著驗證展示的結果是否正確。

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

你可以從Android Studio或者命令行來運行UI 自動化測試。確保在你的工程中聲明了 AndroidJUnitRunner作為默認的instrumentation runner 。

 

  1. 上一頁:
  2. 下一頁:
熱門文章
閱讀排行版
Copyright © Android教程網 All Rights Reserved