手记

Espresso IdlingResource 测试延时操作的使用

Espresso 自动化测试的使用中已经把一些基本的测试使用方法告诉大家了,单是数据加载之类的延时操作却没有详细说明,这篇文介绍下Espresso 延时操作的使用

之前有在谷歌搜索相关资料,确实有不少解说这个的,但多少都验证了是有问题的,只有官方给出的列子是OK的,因此我们就以官方的列子为依据来解说

库的引用

在使用之前,我们需要引入对应的库,由于耗时需要在项目中使用,所以要使用compile,而非androidTestCompile

compile 'com.android.support.test.espresso:espresso-idling-resource:2.2.2'

IdlingResource 的使用

  • IdlingResource本身是个接口,代码如下

public interface IdlingResource {  //用于日志显示的名字,可随意取
  public String getName();  //是否是空闲状态
  public boolean isIdleNow();  //注册变成空闲的回调
  public void registerIdleTransitionCallback(ResourceCallback callback);  //回调接口
  public interface ResourceCallback {   
    public void onTransitionToIdle();
  }
}
  • 我们需要实现这个接口

    SimpleIdlingResource

public class SimpleIdlingResource implements IdlingResource {    @Nullable private volatile ResourceCallback mCallback;    // Idleness is controlled with this boolean.
    private AtomicBoolean mIsIdleNow = new AtomicBoolean(true);    @Override
    public String getName() {        return this.getClass().getName();
    }    @Override
    public boolean isIdleNow() {        return mIsIdleNow.get();
    }    @Override
    public 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();
        }
    }
}
  • 耗时操作在代码中的使用

    TestActivity

public class TestActivity extends Activity{    private SimpleIdlingResource mIdlingResource;    
    private TextView content;    private Button getDataBtn;    @Override
    protected void onCreate(Bundle savedInstanceState) {        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_test);
        content = (TextView)findViewById(R.id.content);
        getDataBtn = (Button)findViewById(R.id.getdata);
        getDataBtn.setOnClickListener(new OnClickListener{           
           @Override
           void onClick(){
              loadData();
           }
        
        })
    }    private void loadData() {       //耗时操作开始,设置空闲状态为false,阻塞测试线程
       mIdlingResource.setIdleState(false);
       
       loadData(new Callback{         @Override
         void onCall(Data data){
         content.setText("finish data");         //耗时操作结束,设置空闲状态为true,放开测试线程
         mIdlingResource.setIdleState(true);
         }
    })    
    //试了一下,去除@VisibleForTesting这个注解,不妨碍Test调用,就把他当成测试标志吧
    @VisibleForTesting
    public IdlingResource getIdlingResource() {    
    if(mIdlingResource == null)
        mIdlingResource = new SimpleIdlingResource();        
    return mIdlingResource;
    }
    
}
  • 在测试中的使用

@RunWith(AndroidJUnit4.class)public class IdlingTest {    
    @Rule
    public ActivityTestRule<TestActivity> mActivityRule = new ActivityTestRule<>(TestActivity.class);    
    private IdlingResource mIdlingResource;    
    @Before
    public void registerIdlingResource(){
        mIdlingResource = mActivityRule.getActivity().getIdlingResource();
        Espresso.registerIdlingResources(mIdlingResource);
    }    
    @Test
    pubic void getData(){        //执行点击事件,进入耗时操作
        onView(withId(R.id.getdata)).perform(click());        //验证        
        onView(withId(R.id.content)).check(matchers(withText("finish data")));
    }    
    @After
    public void unregisterIdlingResource(){        if(mIdlingResource != null)
            Espresso.unregisterIdlingResources(mIdlingResource);
    }
}

这是本人已官方列子为依据总结的IdlingResource的使用,重要点都在代码中注释了,如有问题,请留言

原文链接:http://www.apkbus.com/blog-98050-68212.html

0人推荐
随时随地看视频
慕课网APP