Android自动化测试技术——Espresso的使用

本文详细介绍了如何在Android中使用Espresso进行自动化测试,从配置、添加依赖开始,逐步讲解了Api组件的使用,包括普通控件、AdapterView、RecyclerView以及Intent的验证和插桩。同时,提到了自定义Matcher和ViewAction的方法,以及如何处理空闲资源。此外,还探讨了Espresso在处理RecyclerView和多窗口场景的应用,提供了官方示例作为参考。
摘要由CSDN通过智能技术生成

配置

修改设置

先启用开发者选项,再在开发者选项下,停用以下三项设置:

  • 窗口动画缩放
  • 过渡动画缩放
  • 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的操作之前,我们先要看看如何自定义MatcherViewAction

自定义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))
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值