Android UI測試之Espresso

1. 簡介

衆所周知在Android中一共有兩種測試。java

  1. 儀器化測試,就是利用android框架進行的測試。在項目中是androidTest文件夾。
  2. 單體測試,不利用android框架,對代碼邏輯進行測試。 在項目中是test文件夾。

Espresso就是在android平臺上常常用於儀器化測試的框架。android

Espresso主要由下述三個部分組成:git

  1. ViewMatcher: 在當前View層級去匹配指定的View。
  2. ViewActions: 執行View的某些行爲,好比onClick事件。
  3. ViewAssertions: 檢查View的某些狀態,好比顯示與否。

2. 使用

2.1 添加依賴

AppModulebuild.gradle中添加依賴:github

androidTestImplementation 'androidx.test.espresso:espresso-core:3.2.0'
    androidTestImplementation 'androidx.test:runner:1.2.0'
    androidTestImplementation 'androidx.test:rules:1.2.0'
    androidTestImplementation 'androidx.test:core:1.2.0'
複製代碼

2.2 添加testRunner

AppModlebuild.gradleandroid.defaultConfig中添加下面的配置:
(此設置在建立項目時會被默認的添加上去)框架

testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner"
複製代碼

2.3 建立測試類

androidTest文件夾中建立測試類,按照建議在起名時最好在尾部加上AndroidTest。 由於須要用到AndroidJunit4, 因此在class的上部加上@RunWith(AndroidUnit4.class)。還有須要建立TestRule變量,建立方法以下。
還有在每一個測試方法的上部須要添加@Test佈局

@RunWith(AndroidJUnit4.class)
public class MainActivityUITest {

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

    @Test
    public void checkMainActivity() {
    }

}
複製代碼

2.4 Espresso的基本用法

2.4.1 獲取View

匹配獲取View的方法是Espresso.onView。爲了找到指定的View,須要用到ViewMatcherwithIdwithText方法。測試

  1. 經過ID來獲取:

引入withId方法:gradle

import static androidx.test.espresso.matcher.ViewMatchers.withId;
複製代碼

獲取View:動畫

Espresso.onView(withId(R.id.editView))
複製代碼
  1. 經過text的內容來獲取:

引入withText方法:ui

import static androidx.test.espresso.matcher.ViewMatchers.withText;
複製代碼

獲取View:

Espresso.onView(withText("hello"))
複製代碼
2.4.2 執行事件

執行某些事件,好比點擊事件等等時須要用到ViewActions中的方法。 首先,不要忘了引入ViewActions中的方法。

import static androidx.test.espresso.action.ViewActions.*;
複製代碼

經常使用的有如下幾種。

  1. click():點擊
  2. closeSoftKeyboard():收起鍵盤
  3. typeText(String stringToBeTyped): 輸入文本
  4. swipeLeft():向左滑
  5. swipeRight():向右滑
  6. swipeDown():向下滑
  7. swipeUp():向上滑
  8. doubleClick():雙擊
  9. longClick():長按
  10. pressKey(int keyCode):按指定按鍵

總體代碼以下:

Espresso.onView(withId(R.id.editText)).perform(typeText("hello"),closeSoftKeyboard());
Espresso.onView(withId(R.id.btnSend)).perform(click());
複製代碼
2.4.3 檢查

咱們對View進行了一系列的操做之後就須要判斷是否符合咱們的預期。固然這也是在儀器化測試的關鍵所在。 咱們須要用到ViewAssertions的方法來進行檢查。 首先引入ViewAssertions的方法。

import static androidx.test.espresso.assertion.ViewAssertions.*;
複製代碼

對View的檢查咱們使用check方法,裏面傳入ViewAssertionsmaches方法便可。雖說的有點繞,可是看了代碼就立刻明白了。

Espresso.onView(withId(R.id.textViewInSecond)).check(matches(withText("hello")));
複製代碼
2.4.4 RecyclerView的測試

若是在佈局中有RecyclerView,此時要測試裏面的內容會變得複雜一點。 首先引入外部方法:

import static org.hamcrest.Matchers.containsString;
import static org.hamcrest.Matchers.is;
複製代碼

測試方法方法以下:

// 獲取spinner中選項數據
String[] arrays = rule.getActivity().getResources().getStringArray(R.array.spinner);
for (int i = 0; i < arrays.length; i++) {
    Espresso.onView(withId(R.id.spinner)).perform(click());
    Espresso.onData(is(arrays[i])).perform(click());
        Espresso.onView(withId(R.id.textViewInSecondTwo)).check(matches(withText(containsString(arrays[i]))));
        }
複製代碼

Esspresso.onData(Matcher<? extends Object> dataMatcher)是經過綁定數據來獲取指定元素,onData只適用於Adapter,不適用於RecyclerView

onViewonData的區別

onView: 要測試的元素必須在可在視圖內,好比RecyclerView的第11條不可見,那就不能選第11條元素進行測試,否則會報錯。

onData: 能夠指定屏幕外的元素,若是選定的是屏幕外元素,框架會移動到指定元素上,而後進行指定的哦後續操做。

3. Record Espresso Test

除了手動的寫Espresso測試代碼之外,也能夠經過UI讓框架自動生成測試代碼。

左邊是測試記錄,也就是待會會生成的代碼,右邊是被測試一塊兒的界面。在右邊界面中點擊元素,可添加 ViewAssertions,如上圖所示。

4. 注意點

這裏有一個注意點,就是系統動畫會對UI測試產生影響。因此在進行測試時須要把窗口動畫縮放過分動畫縮放動畫程序時長縮放關閉掉。以下圖。

github: github.com/HyejeanMOON…

相關文章
相關標籤/搜索