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…

相关文章
相关标签/搜索