Espresso Idling Resources 简介

Espresso 的核心是在测试应用时同步所有的测试操作,Espresso默认等待当前消息队列的UI事件被处理和AsyncTasks完成才进行下一步测试操作。

但是有时候应用的后台操作(如与web services 通信)使用自定义Threadde 的非标准方法,在这种情况下就需要使用 Idling Resources 去通知Espresso App正在后台进行长操作。

创建并注册 Idling Resources

可以implement IdlingResource interface 接口自定义实现,也可以使用现有的实现如CountingIdlingResource

自定义Idling Resources

第一步:定义SimpleIdlingResource implements IdlingResource

public class SimpleIdlingResource implements IdlingResource {@Nullable private volatile ResourceCallback mCallback;// Idleness is controlled with this boolean.private AtomicBoolean mIsIdleNow = new AtomicBoolean(true);@Overridepublic String getName() {return this.getClass().getName();}@Overridepublic boolean isIdleNow() {return mIsIdleNow.get();}@Overridepublic void registerIdleTransitionCallback(ResourceCallback callback) {mCallback = callback;}/*** Sets the new idle state, if isIdleNow is true, it pings the {@link ResourceCallback}.* @param isIdleNow false if there are pending operations, true if idle.*/public void setIdleState(boolean isIdleNow) {mIsIdleNow.set(isIdleNow);if (isIdleNow && mCallback != null) {mCallback.onTransitionToIdle();}}
}

setIdleState(true) : 调用ResourceCallback.onTransitionToIdle(),此时后台任务执行完成
setIdleState(false) : 后台任务正在执行

第二步: 在后台任务执行之前之前调用idlingResource.setIdleState(false),通知Espresso任务正在执行,在后台任务执行完成时调用idlingResource.setIdleState(true)使应用状态变为闲置(Idle),通知Espresso任务完成

static void processMessage(final String message, final DelayerCallback callback,@Nullable final SimpleIdlingResource idlingResource) {// The IdlingResource is null in production.if (idlingResource != null) {idlingResource.setIdleState(false);}// Delay the execution, return message via callback.Handler handler = new Handler();handler.postDelayed(new Runnable() {@Overridepublic void run() {if (callback != null) {callback.onDone(message);if (idlingResource != null) {idlingResource.setIdleState(true);}}}}, DELAY_MILLIS);}

第三步: 在android test中测试异步任务部分,定义IdlingResource引用在Activity中创建的对象,在测试开始前注册,

Espresso.registerIdlingResources(mIdlingResource);

test完成后注销

Espresso.unregisterIdlingResources(mIdlingResource);
@RunWith(AndroidJUnit4.class)
@LargeTest
public class ChangeTextBehaviorTest {private static final String STRING_TO_BE_TYPED = "Espresso";@Rulepublic ActivityTestRule<MainActivity> mActivityRule = new ActivityTestRule<>(MainActivity.class);private IdlingResource mIdlingResource;@Beforepublic void registerIdlingResource() {mIdlingResource = mActivityRule.getActivity().getIdlingResource();// To prove that the test fails, omit this call:Espresso.registerIdlingResources(mIdlingResource);}@Testpublic void changeText_sameActivity() {// Type text and then press the button.onView(withId(R.id.editTextUserInput)).perform(typeText(STRING_TO_BE_TYPED), closeSoftKeyboard());onView(withId(R.id.changeTextBt)).perform(click());// Check that the text was changed.onView(withId(R.id.textToBeChanged)).check(matches(withText(STRING_TO_BE_TYPED)));}@Afterpublic void unregisterIdlingResource() {if (mIdlingResource != null) {Espresso.unregisterIdlingResources(mIdlingResource);}}
}

注: mIdlingResource 只有在进行Android测试时才会被初始化

/*** Only called from test, creates and returns a new {@link SimpleIdlingResource}.*/@VisibleForTesting@NonNullpublic IdlingResource getIdlingResource() {if (mIdlingResource == null) {mIdlingResource = new SimpleIdlingResource();}return mIdlingResource;}

Google Sample 地址

Check out the Espresso Idling Resource sample.

SimpleCountingIdlingResource 代码 使用AtomicInteger

public class SimpleCountingIdlingResource implements IdlingResource {private final String mResourceName;private final AtomicInteger counter = new AtomicInteger(0);private volatile ResourceCallback resourceCallback;public SimpleCountingIdlingResource(String resourceName){mResourceName = checkNotNull(resourceName);}@Overridepublic String getName() {return mResourceName;}@Overridepublic boolean isIdleNow() {return counter.get() == 0;}@Overridepublic void registerIdleTransitionCallback(ResourceCallback callback) {this.resourceCallback = callback;}public void increment(){counter.getAndIncrement();}public void decrement(){int counterVal = counter.decrementAndGet();if(counterVal == 0){if(null != resourceCallback){resourceCallback.onTransitionToIdle();}}if (counterVal < 0) {throw new IllegalArgumentException("Counter has been corrupted!");}}}

创建一个代理类EspressoIdlingResource, SimpleCountingIdlingResource 作为其静态成员。异步任务执行之前调用increment(),异步任务完成调用decrement(),在此处判断,若SimpleCountingIdlingResource 中的counter为0则应用变为idle状态,继续执行UI测试

public class EspressoIdlingResource {private static final String RESOURCE = "GLOBAL";private static SimpleCountingIdlingResource mCountingIdlingResource =new SimpleCountingIdlingResource(RESOURCE);public static void increment(){mCountingIdlingResource.increment();}public static void decrement(){mCountingIdlingResource.decrement();}public static IdlingResource getIdlingResource(){return mCountingIdlingResource;}
}

Espresso Idling Resource 使用相关推荐

  1. Espresso Idling Resource

    前沿 上一篇进行Espresso 安装方面介绍,也就是测试环境的设置.下面几篇会对照官方文档进行一个分析.避免与主题脱节.关于Espresso文章不分先后. 1.翻译官网文档 Espresso的核心是 ...

  2. Espresso:自定义Idling Resource

    原文地址:http://www.jianshu.com/p/9bda5f58daf1 Espresso的一个关键功能是测试程序和被测应用是同步执行的.这是基于idling的概念:Espresso等待a ...

  3. Espresso Test 7: Idling resource

    文章目录 1.0 知识点 2.0 Idling resources 参考 这是 Espresso UI 测试系列的第七篇文章.这篇主要是讲述 idling resources 的测试. 代码来源于 y ...

  4. 深入研究Espresso的Idling Resource

    本篇文章翻译自Wait for it...a deep dive into Espresso's Idling Resources 开发者面临的挑战之一,是在编写UI测试时需要等待异步计算或I/O操作 ...

  5. 显示空闲链表和隐式空闲链表_使用空闲资源添加Espresso UI测试

    显示空闲链表和隐式空闲链表 You may want to read the Spanish version of this article in Droid-Latam's publication ...

  6. 使用espressos idlingresource获得最高的Android测试速度

    When you first start learning UI testing with Espresso, it begins fairly quickly and easily by codin ...

  7. java espresso车架_Espresso UI自动化测试框架

    前言 Espresso是谷歌大力推荐的一套测试框架,从Android studio2.2版本开始,google就开始支持在as上espresso自动生成单元测试代码. Espresso测试运行速度很快 ...

  8. (4.5.5.6)Espresso的进阶: IdlingResource

    Espresso 的核心是它可以与待测应用无缝同步测试操作的能力.默认情况下,Espresso 会等待当前消息队列中的 UI 事件执行(默认是 AsyncTask)完毕再进行下一个测试操作.这应该能解 ...

  9. Espresso自动化测试(十一) - IdlingResource

    Espresso测试有个很强大的地方是它在多个测试操作中是线程安全的.Espresso会等待当前进程的消息队列中的UI事件,并且在任何一个测试操作中会等待其中的AsyncTask结束才会执行下一个测试 ...

最新文章

  1. 基于 OpenCV 的图像阴影去除
  2. CSS粘住固定底部的5种方法
  3. 招聘|阿丘科技招系统软件与图像算法工程师(内推)
  4. 【NOI2015】荷马史诗
  5. BOOST_VMD_ASSERT_IS_IDENTIFIER宏相关的测试程序
  6. 我的开源 GitBook: Python 之旅
  7. jdk1.8版本已经不包含jdbc.odbc连接
  8. Java7运行applet_Java applet不会在JRE7下运行,控制台中不会显示错误
  9. 和慧眼显示服务器网关错误,R680G7联想万全慧眼IV高级版用户指南2.pdf
  10. Win7双屏显示设置
  11. Labelimg讲解
  12. NODE.JS对接验证码短信接口DEMO示例
  13. SS端口已被占用 1080
  14. 后端开发常用工具指令
  15. 计算机网络考研、招聘面试问题总结
  16. 重磅推荐:机器人行业深度报告
  17. IOS 一些小知识点整理
  18. python单链表就地反转_Python中的就地字典反转
  19. 多人在线游戏开发 Unity3D 序言
  20. Linux 防火墙开启端口

热门文章

  1. 计算机管理要继续请输入,Windows 10上提示UAC错误:如要继续请输入管理员密码!...
  2. 电子科技大学计算机科学与技术考研复试,电子科技大学计算机科学与工程学院2021考研招生复试工作安排...
  3. i3cpu驱动xp_Intel英特尔 Core i3/Core i5/Core i7系列CPU显示驱动 14.46.9.5394版 For WinXP-32...
  4. swiper 上滑触发_在绝地求生加入滑铲等战术动作会怎么样?你们想过吗?
  5. 《失业七个月,面试六十家公司》的深圳体验
  6. 10月11日科技联播:美股暴跌引全球股市崩盘;腾讯跌出全球市值前十
  7. 华为Java机试题__转载
  8. eovs实训报告总结心得_实训报告心得体会
  9. WPS 如何删除我的设备
  10. 深究:app如何实现即时通讯