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


你可能感兴趣的:(Espresso IdlingResource 测试延时操作的使用)