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的使用,重要点都在代码中注释了,如有问题,请留言


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值