配置
修改设置
先启用开发者选项,再在开发者选项下,停用以下三项设置:
- 窗口动画缩放
- 过渡动画缩放
- Animator 时长缩放
添加依赖
在app/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'
在app/build.gradle
文件中的android.defaultConfig
中添加
testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner"
注意:上面的依赖只能实现基本功能,如果你想使用所有的功能,则按下面的配置:
所有依赖
androidTestImplementation 'androidx.test.ext:junit:1.1.1'
androidTestImplementation 'androidx.test.ext:truth:1.2.0'
androidTestImplementation 'androidx.test.espresso:espresso-core:3.2.0'
androidTestImplementation 'androidx.test.espresso:espresso-contrib:3.2.0'
androidTestImplementation 'androidx.test:runner:1.2.0'
androidTestImplementation 'androidx.test:rules:1.2.0'
androidTestImplementation 'androidx.test.espresso:espresso-intents:3.2.0'
implementation 'androidx.recyclerview:recyclerview:1.1.0'
implementation 'androidx.test.espresso:espresso-idling-resource:3.2.0'
下面调用的方法如onView()
等都是静态方法,可以通过import static XXX
来直接调用,所有需要导入的静态方法如下:
import static androidx.test.espresso.Espresso.*;
import static androidx.test.espresso.action.ViewActions.*;
import static androidx.test.espresso.assertion.ViewAssertions.*;
import static androidx.test.espresso.intent.Intents.intended;
import static androidx.test.espresso.intent.Intents.intending;
import static androidx.test.espresso.intent.matcher.ComponentNameMatchers.*;
import static androidx.test.espresso.intent.matcher.IntentMatchers.*;
import static androidx.test.espresso.matcher.ViewMatchers.*;
import static androidx.test.ext.truth.content.IntentSubject.assertThat;
Api组件
常用Api组件包括:
- Espresso - 用于与视图交互(通过 onView() 和 onData())的入口点。此外,还公开不一定与任何视图相关联的 API,如 pressBack()。
- ViewMatchers - 实现 Matcher<? super View> 接口的对象的集合。您可以将其中一个或多个对象传递给 onView() 方法,以在当前视图层次结构中找到某个视图。
- ViewActions - 可传递给 ViewInteraction.perform() 方法的 ViewAction 对象(如 click())的集合。
- ViewAssertions - 可传递给 ViewInteraction.check() 方法的 ViewAssertion 对象的集合。在大多数情况下,您将使用 matches 断言,它使用视图匹配器断言当前选定视图的状态。
大多数可用的 Matcher、ViewAction 和 ViewAssertion 实例如下图(来源官方文档):
常用的api实例pdf
使用
普通控件
示例:MainActivity
包含一个 Button
和一个 TextView
。点击该按钮后,TextView
的内容会变为 “改变成功”。
使用 Espresso
进行测试方法如下:
@RunWith(AndroidJUnit4.class)
@LargeTest
public class ChangeTextTest {
@Rule
public ActivityTestRule<MainActivity> activityRule =
new ActivityTestRule<>(MainActivity.class);
@Test
public void test_change_text(){
onView(withId(R.id.change))
.perform(click());
onView(withId(R.id.content))
.check(matches(withText("改变成功")));
}
}
onView()
方法用来获取匹配的当前视图,注意匹配的视图只能有一个,否则会报错。
withId()
方法用来搜索匹配的视图,类似的还有withText()
、 withHint()
等。
perform()
方法用来执行某种操作,例如点击click()
、长按longClick()
、双击doubleClick()
check()
用来将断言应用于当前选定的视图
matches()
最常用的断言,它断言当前选定视图的状态。上面的示例就是断言id为content的View它是否和text为"改变成功"的View匹配
AdapterView相关控件
与普通控件不同,AdapterView
(常用的是ListView
)只能将一部分子视图加载到当前视图层次结构中。简单的 onView()
搜索将找不到当前未加载的视图。Espresso
提供一个单独的 onData()
入口点,该入口点能够先加载相关适配器项目,并在对其或其任何子级执行操作之前使其处于聚焦状态。
示例:打开Spinner
,选择一个特定的条目,然后验证 TextView
是否包含该条目。Spinner
会创建一个包含其内容的 ListView
,因此需要onData()
@RunWith(AndroidJUnit4.class)
@LargeTest
public class SpinnerTest {
@Rule
public ActivityTestRule<MainActivity> activityRule =
new ActivityTestRule<>(MainActivity.class);
@Test
public void test_spinner(){
String content = "学校";
//点击Spnner,显示项目
onView(withId(R.id.change)).perform(click());
//点击指定的内容
onData(allOf(is(instanceOf(String.class)), is(content))).perform(click());
//判断TextView是否包含指定内容
onView(withId(R.id.content))
.check(matches(withText(containsString(content))));
}
}
下图为AdapterView的继承关系图:
警告:如果 AdapterView 的自定义实现违反继承约定,那么在使用 onData() 方法(尤其是 getItem() API)时可能会出现问题。在这种情况下,最好的做法是重构应用代码。如果您无法执行此操作,则可以实现匹配的自定义 AdapterViewProtocol。
自定义Matcher和ViewAction
在介绍RecyclerView
的操作之前,我们先要看看如何自定义Matcher
和ViewAction
。
自定义Matcher
Matcher<T>
是一个用来匹配视图的接口,常用的是它的两个实现类BoundedMatcher<T, S extends T>
和TypeSafeMatcher<T>
BoundedMatcher<T, S extends T>
:一些匹配的语法糖,可以让你创建一个给定的类型,而匹配的特定亚型的只有过程项匹配。
类型参数:<T> - 匹配器的期望类型。<S> - T的亚型
TypeSafeMatcher<T>
:内部实现了空检查,检查的类型,然后进行转换
示例:输入EditText值,如果值以000
开头,则让内容为 “成功” 的TextView可见,否则让内容为 失败 的TextView可见.
@RunWith(AndroidJUnit4.class)
@LargeTest
public class EditTextTest {
@Rule
public ActivityTestRule<MainActivity> activityRule =
new ActivityTestRule<>(MainActivity.class);
@Test
public void rightInput() {
onView(withId(R.id.editText))
.check(matches(EditMatcher.isRight()))
.perform(typeText("000123"), ViewActions.closeSoftKeyboard());
onView(withId(R.id.button)).perform(click());
onView(withId(R.id.textView_success)).check(matches(isDisplayed()));
onView(withId(R.id.textView_fail)).check(matches(not(isDisplayed())));
}
@Test
public void errorInput() {
onView(withId(R.id.editText))