4、Android UI測試

weixin_33858249發表於2016-06-15

為你的APP進行UI測試是為了確保不出現意料之外的結果,提升使用者的體驗。如果你需要驗證你的APP UI的正確性,你需要養成建立UI測試的習慣。
Espresso測試框架是由Android Testing Support Library提供,包含了編寫UI測試的API用於模擬使用者在指定的APP介面上進行互動。Espresso測試可以執行在Android 2.2(API level 8)以上的裝置。當主執行緒空閒時,Espresso可以偵測到,所以它可以在合適的時候執行你的測試指令,提升測試的可信度。
Espresso基於儀表測試。
配置Espresso
先看第一篇。
在build.gradle檔案中新增依賴。

dependencies {
    androidTestCompile 'com.android.support.test.espresso:espresso-core:2.2.1'
}

關閉測試機器的動畫。
建立一個Espresso 測試類
為了建立一個Espresso測試,按照以下的方式建立一個Java類:
1、 通過呼叫onView()方法或者onData()在Activity中找到需要測試的UI元件。
2、 通過呼叫ViewInteraction.perform()或DataInteraction.perform()在UI元件上模擬特定的使用者動作。
3、 需要的話重複如上動作。
4、 用ViewAssertions來檢測UI。
程式碼如下:

nView(withId(R.id.my_view))            
        .perform(click())              
        .check(matches(isDisplayed()));

使用帶ActivityTestRule的Espresso
下面將接受如何建立Junit 4風格的Espresso 測試,通過使用ActivityTestRule來減少不必要的程式碼。

package com.example.android.testing.espresso.BasicSample;

import org.junit.Before;
import org.junit.Rule;
import org.junit.Test;
import org.junit.runner.RunWith;

import android.support.test.rule.ActivityTestRule;
import android.support.test.runner.AndroidJUnit4;
...

@RunWith(AndroidJUnit4.class)
@LargeTest
public class ChangeTextBehaviorTest {

    private String mStringToBetyped;

    @Rule
    public ActivityTestRule<MainActivity> mActivityRule = new ActivityTestRule<>(
            MainActivity.class);

    @Before
    public void initValidString() {
        // 宣告一個String
        mStringToBetyped = "Espresso";
    }

    @Test
    public void changeText_sameActivity() {
        // 輸入文字,點選按鈕
        onView(withId(R.id.editTextUserInput))
                .perform(typeText(mStringToBetyped), closeSoftKeyboard());
        onView(withId(R.id.changeTextBt)).perform(click());

        // 檢測文字改變
        onView(withId(R.id.textToBeChanged))
                .check(matches(withText(mStringToBetyped)));
    }
}

使用帶ActivityInstrumentationTestCase2的Espresso

程式碼如下:

import android.support.test.InstrumentationRegistry;

public class MyEspressoTest
        extends ActivityInstrumentationTestCase2<MyActivity> {

    private MyActivity mActivity;

    public MyEspressoTest() {
        super(MyActivity.class);
    }

    @Before
    public void setUp() throws Exception {
        super.setUp();
        injectInstrumentation(InstrumentationRegistry.getInstrumentation());
        mActivity = getActivity();
    }
}

訪問UI元件
在測試下Espresso與你的app進行互動之前,你首先需要宣告UI 元件或者view。
程式碼如下:

public void testChangeText_sameActivity() {
    // 輸入文字,點選按鈕
    onView(withId(R.id.editTextUserInput))
            .perform(typeText(STRING_TO_BE_TYPED), closeSoftKeyboard());
    onView(withId(R.id.changeTextButton)).perform(click());
}

宣告一個ViewMatcher

可以通過如下方法宣告一個view matcher:
1、 呼叫ViewMatchers類中的方法。如下:

onView(withText("登陸"));
onView(withId(R.id.button_signin));

使用id的時候需要注意,Android中資源id並不是唯一的,使用不當,Espresso可能會丟擲AmbiguousViewMatcherException一場。
2、 使用Hamcrest Matchers類。你可以使用allof()方法來組合多個matchers。比如containsString()和instanceof()
onView(allOf(withId(R.id.button_signin), withText(“登陸”)));
onView(allOf(withId(R.id.button_signin), not(withText(“登出”))));


在AdapterView中定位View

程式碼如下:

onData(allOf(is(instanceOf(Map.class)),
hasEntry(equalTo(LongListActivity.ROW_TEXT), is(str))));


模擬動作

ViewActions.click():單擊view
ViewActions.typeText():單機view並輸入一個特定的string
ViewActions.scrollTo():滾動操作
ViewActions.pressKey();按鍵單機
ViewActions.clearText():清除text


驗證結果

通過呼叫ViewInteraction.check()或者DataInteraction.check()方法來檢測。
程式碼如下:

public void testChangeText_sameActivity() {
// 檢測text更改
onView(withId(R.id.textToBeChanged))
.check(matches(withText(STRING_TO_BE_TYPED)));
}
“`

本文作者:宋志輝
個人微博:點選進入

相關文章