关于 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