Espresso中IdlingResource详解

在ui测试中经常会遇到异步线程的操作(例如网络请求,后台计算等操作后验证界面元素),在uiautomator中一般会使用sleep方法来进行等待,在espresso中已经不推荐使用sleep这种形式来等待异步线程操作完成了。

IdlingResource

在espresso中,基于AsynTask的异步任务都会自动在测试中转化为同步线程,例如基于rxjava,rxandroid的异步网络请求,在等网络请求返回结果后Espresso才会执行下一步的操作,除了AsynTask外还有其他的异步操作,例如IntentService等,在这些场景下就需要用到IdlingResource了.

先贴一下idlingresource源码:

public interface IdlingResource
    {
    // 返回idlingresource名字,必须返回
    public String getName();
    // 主线程执行的方法,主要实现该方法
    public boolean isIdleNow();
    public void registerIdleTransitionCallback(ResourceCallback callback);
    public interface ResourceCallback {
    //回调方法,用于通知主线程是否从busy-idle
         public void onTransitionToIdle();
    }
}

要使IdlingResource生效,必须在测试时先进行注册,通过espresso.registerIdlingResources(yourIdlingResource);注册成功后,IdlingResource在运行时就会检查主线程的运行状态,espresso的IdlingResourceRegistry实现了onTransitionToIdle()的回调方法

private void registerToIdleCallback(final IdlingResource resource, final int position) {
     resource.registerIdleTransitionCallback(new ResourceCallback() {
         @Override
         public void onTransitionToIdle() {
              Message m = handler.obtainMessage(DYNAMIC_RESOURCE_HAS_IDLED);
              m.arg1 = position;
              m.obj = resource;
              handler.sendMessage(m);
         }
     });
}

IdlingResource在主线程中通过isIdleNow方法来判断主线程是否idle,若idle则回调onTransitionToIdle()方法告知espresso我已经处于idle状态,若false继续通过isIdleNow状态检测,直到超时或者回调onTransitionToidle()方法为止

附上自己写的一个小例子,场景是发送图片动态,界面出现发送成功后通知espresso执行下一步操作,其中textview由外部传入,通过activityTestRule的getActivity()方法获取当前activity并通过findViewById获取:

public class SendingIdlingResources implements IdlingResource{
     private TextView textView;
     private ResourceCallback mResourceCallback;
     public SendingIdlingResources(TextView textView){ this.textView=textView; }
     @Override
     public String getName() { return "sendingidlingresources"; }
     @Override public boolean isIdleNow() {
          String text = (String) textView.getText();
          String expectedString = "发送成功";
          boolean idle = (text.equals(expectedString));
          if (idle){
               System.out.println("发送成功:"+text);
               mResourceCallback.onTransitionToIdle();
          } else{
                 System.out.println("发送成功没有出现:"+text);
                }
          return idle;
      }
      @Override public void registerIdleTransitionCallback(ResourceCallback callback) {
                      this.mResourceCallback = callback;
       }
}

发表评论

电子邮件地址不会被公开。 必填项已用*标注