Android自动化测试(二)
测试是应用开发中不可或缺的一部分。测试所做的工作,虽然不能让用户看到效果,但是想要保证一个有一定用户基础的应用的稳定性,测试是必须做的,否则严重的崩溃率肯定会导致用户的差评或者流失。
Espresso是谷歌力推的一个UI自动化测试框架,新建一个Andrdoid工程的时候默认就引入了Espresso的核心依赖,所以作为Android开发者,非常有必要学习这个框架。
简单测试
新建一个测试类HelloWorldTest
@RunWith(AndroidJUnit4.class)
public class HelloWorldTest {
@Rule
public ActivityTestRule<MainActivity> activityRule =
new ActivityTestRule<>(MainActivity.class);
@Test
public void listGoesOverTheFold() {
onView(withText("Hello World!")).check(matches(isDisplayed()));
}
}
HelloWorldTest非常简单,就是判断"Hello World!"是不是已经显示在屏幕上
- 通过
@Rule
注解来规定测试的Activity是MainActivity,并且测试完后关闭它 - 通过withText方法找到屏幕上的对应的控件
- onView方法可以等待寻找完成之后再工作。寻找完成之后,调用check方法来判断该控件是不是已经显示在屏幕上
- 点击类旁边的 run Test按钮 测试完成
Espresso
API组成
onView()
和onData()
是Espresso和视图交互的入口都是用来定位一个View,onView()
是定位普通Vew,onData()
可以定位ListVew、GridView 中的一个条目- ViewMatchers: 实现了
Matcher<? super View>
接口,是onView()
的参数,将它传到onView()
中帮助定位一个View。 - ViewActions:对一个View的动作,比如点击
click()
,可以传递给ViewInteraction.perform()
方法 - ViewAssertions:用来断言测试结果是否正确,可以传递给
ViewInteraction.check()
方法
测试按钮
创建一个clickTest()测试方法,点击界面上的某个按钮
@Test
public void clickTest(){
onView(withId(R.id.btn_click))
.perform(click())
.check(matches(isDisplayed()));
}
一般情况下使用withId方法通过View的id来找到一个View,不过有时候可能不同界面中使用了相同的id,这时候可以多个条件一起使用来定位一个View,比如下面
//id为R.id.my_view text为"Hello!"的控件
onView(allOf(withId(R.id.my_view), withText("Hello!")));
//既有text "7" 又有text "item: 0"的控件
onView(allOf(withText("7"), hasSibling(withText("item: 0"))))
.perform(click());
点击按钮,将TextView的文字由Hello World!改为Hello Espresso!,并检查结果。
app中的代码
final TextView textView = findViewById(R.id.tv_text);
findViewById(R.id.btn_click).setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
textView.setText("Hello Espresso");
}
});
测试类中添加新的测试方法
@Test
public void matchText(){
//点击按钮,将Hello World!改为Hello Espresso!
onView(withId(R.id.btn_click)).perform(click());
//检查TextView上的文字是不是Hello Espresso!
onView(withId(R.id.tv_text)).check(matches(withText("Hello Espresso!")));
}
测试RecyclerView
测试RecyclerView,跳到RecyclerView的某一位置处执行点击
首先需要引入一个依赖espresso-contrib这里面包含包含 DatePicker、RecyclerView 和 Drawer 操作、无障碍功能检查以及 CountingIdlingResource
androidTestImplementation 'androidx.test.espresso:espresso-contrib:3.3.0-alpha04'
首先在应用的app中新建一个Activty来显示一个列表,接着前面的例子,在MainActivity中定义一个按钮点击进入列表页。
findViewById(R.id.btn_to_recyclerview).setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
startActivity(new Intent(getApplicationContext(),RecyclerViewActivity.class));