Android UI 测试指南之 Espresso

关于 Espresso

Espresso 是一个简单好用的 Android UI 测试框架Espresso 主要由以下三个基础部分组成:ViewMatchers – 在当前View层级去匹配指定的View .ViewActions – 执行Views的某些行为,如点击事件 .ViewAssertions – 检查Views的某些状态,如是否显示 .Espresso 使用示例

准备

第一步.

build.gradle

添加如下依赖:

第二步. android.defaultConfig添加如下配置

基础用法

获得View

withId方式

withText方式

执行View行为

点击

文本内容输入

scrollTo 滑动

检验View

检验View的文本内容

检验View的显示状态

示例场景:

简单的登陆场景测试

public ActivityTestRule<LoginActivity> rule=new ActivityTestRule<LoginActivity>(LogingActivity.class,true);

进阶用法

1. 使用IdlingResource

通常,我们实际的应用当中会有很多异步任务,例如网络请求,图片加载等,但是Espresso并不知道你的异步任务什么时候结束,所以需要借助于IdlingResource .

这里需要注意的是,如果你是通过AsyncTask或者AsyncTaskCompat方式的异步任务,Espresso已经处理好,并不需要去额外的处理。

第一步:添加依赖库

第二步:定义一个 IdlingResource 接口 .

下面我们以一个示例来说明:

场景:假设当前我们需要测试用户的头像的是否正常显示。

Activity代码

Glide.with(this).load(“https://avatars2.githubusercontent.com/u/2297803?v=3&s=460”).into(new GlideDrawableImageViewTarget(mAvatar) {

SimpleIdlingResource代码

IdlingResourceTest代码

public ActivityTestRule<AvatarActivity> rule=new ActivityTestRule<>(AvatarActivity.class,true);

另外,Espresso 提供了一个实现好的CountingIdlingResource类,所以如果没有特别需求的话,直接使用CountingIdlingResource即可。

2.创建一个自定义 Espresso matcher目前Espresso提供的方法基本上可以满足你的测试需求,如下图所示:

如果你需要对自定义的View中某个自定义属性进行测试的话,你可以创建一个自定义的Matcher

3.如何处理动画

系统动画:为了避免动画线程运行期间对Espresso测试产生的影响,官方强烈建议关闭系统动画。如图所示:

自定义动画:对于自定义动画,开发者可以借助以下代码去控制动画的开和关。

该方法可以监听系统动画的开关事件,这是一个值得推荐的做法,不仅仅是在Espresso测试中。

if (Settings.Global.getFloat(getContentResolver(),Settings.Global.ANIMATOR_DURATION_SCALE)==0.0f){

4.优雅的 IntentTest

普通的方式

public ActivityTestRule<MainActivity> rule=new ActivityTestRule<MainActivity>(MainActivity.class){

如果使用普通的方式,那么该单元测试类下的所有测试都是基于该Intent启动的Activity,这样显然不够灵活。

优雅的方式

5.保证测试的独立性通常使用Espresso进行UI测试的时候,你并不期望去测试网络或者远程的服务相关的东西,所以,你可以借助于Espresso Intent,Mockito for mocking,以及依赖注射、Dagger2。

总之,尽量去分离那些不属于UI层面的内容。

例如:你需要某个按钮的点击事件进行测试,但是该按钮的点击后,会跳转到别的Activity,可是你不希望去测试别的Activity,那么这里就可以通过拦截Intent来解决。

首先你需要添加IntentTest依赖库:

InterceptIntentTest示例代码

// Create the ActivityResult, with a null Intent since we do not want to return any data

6.避免直接复制粘贴test代码

举个简单的例子。

onData(allOf(is(instanceOf(Map.class)),hasEntry(equalTo(“STR”),is(“item:50”)))).perform(click());

以上这段代码是匹配列表中符合条件的item,并执行执行点击事件,测试也正常,同样这段代码也被复制到了其他的测试方法中使用,这时,设想一下,如果你的adapter中的数据源改成了cursor或者其他,于是悲催了,你需要修改很多地方,显然,这不是一个合格的CV战士。

所以,我们需要对之前那行代码进行改装:

很简单,只需将可能变化的部分抽出来即可。

7.如何测试View的位置

如图所示:

8.自定义错误日志

默认的错误日志打印信息比较多,如图:

如果你只想显示你关心的日志信息,你可以自定义FailureHandler:

0

评论0

站点公告

 

AI创作与绘画大师,国内版chatGPT在线版本免费使用哦

点击打开: https://ai.uiya.cn

   
显示验证码
没有账号?注册  忘记密码?

社交账号快速登录

微信扫一扫关注
如已关注,请回复“登录”二字获取验证码