四、Android UI測試

爲你的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文件中添加依賴。css

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

關閉測試機器的動畫。
建立一個Espresso 測試類
爲了建立一個Espresso測試,按照如下的方式建立一個Java類:
一、 經過調用onView()方法或者onData()在Activity中找到須要測試的UI組件。
二、 經過調用ViewInteraction.perform()或DataInteraction.perform()在UI組件上模擬特定的用戶動做。
三、 須要的話重複如上動做。
四、 用ViewAssertions來檢測UI。
代碼以下:android

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

使用帶ActivityTestRule的Espresso
下面將接受如何建立Junit 4風格的Espresso 測試,經過使用ActivityTestRule來減小沒必要要的代碼。markdown

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的Espressoapp

代碼以下:框架

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

聲明一個ViewMatchergradle

能夠經過以下方法聲明一個view matcher:
一、 調用ViewMatchers類中的方法。以下:動畫

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

使用id的時候須要注意,Android中資源id並非惟一的,使用不當,Espresso可能會拋出AmbiguousViewMatcherException一場。
二、 使用Hamcrest Matchers類。你可使用allof()方法來組合多個matchers。好比containsString()和instanceof()
onView(allOf(withId(R.id.button_signin), withText(「登錄」)));
onView(allOf(withId(R.id.button_signin), not(withText(「登出」))));ui

在AdapterView中定位View

代碼以下:

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

模擬動做

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

本文做者:宋志輝
我的微博:點擊進入

相關文章
相關標籤/搜索