爲你的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)));
}
「`
本文做者:宋志輝
我的微博:點擊進入