1. 简介
众所周知在Android中一共有两种测试。
- 仪器化测试,就是利用android框架进行的测试。在项目中是
androidTest
文件夹。 - 单体测试,不利用android框架,对代码逻辑进行测试。 在项目中是
test
文件夹。
Espresso
就是在android平台上经常用于仪器化测试的框架。
Espresso
主要由下述三个部分组成:
ViewMatcher
: 在当前View层级去匹配指定的View。ViewActions
: 执行View的某些行为,比如onClick
事件。ViewAssertions
: 检查View的某些状态,比如显示与否。
2. 使用
2.1 添加依赖
在AppModule
的build.gradle
中添加依赖:
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
在AppModle
的build.gradle
的android.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,需要用到ViewMatcher
的withId
和withText
方法。
- 通过ID来获取:
引入withId
方法:
import static androidx.test.espresso.matcher.ViewMatchers.withId;
获取View:
Espresso.onView(withId(R.id.editView))
- 通过text的内容来获取:
引入withText
方法:
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.*;
常用的有以下几种。
click()
:点击closeSoftKeyboard()
:收起键盘typeText(String stringToBeTyped)
: 输入文本swipeLeft()
:向左滑swipeRight()
:向右滑swipeDown()
:向下滑swipeUp()
:向上滑doubleClick()
:双击longClick()
:长按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
方法,里面传入ViewAssertions
中maches
方法即可。虽然说的有点绕,但是看了代码就马上明白了。
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
。
onView
和onData
的区别
onView
: 要测试的元素必须在可在视图内,比如RecyclerView
的第11条不可见,那就不能选第11条元素进行测试,不然会报错。
onData
: 可以指定屏幕外的元素,如果选定的是屏幕外元素,框架会移动到指定元素上,然后进行指定的哦后续操作。
3. Record Espresso Test
除了手动的写Espresso测试代码以外,也可以通过UI让框架自动生成测试代码。
左边是测试记录,也就是待会会生成的代码,右边是被测试一起的界面。在右边界面中点击元素,可添加ViewAssertions
,如上图所示。
4. 注意点
这里有一个注意点,就是系统动画会对UI测试产生影响。所以在进行测试时需要把窗口动画缩放
,过度动画缩放
,动画程序时长缩放
关闭掉。如下图。
github: github.com/HyejeanMOON…