Espresso IdlingResource 测试延时操作的使用

来源:互联网 发布:关于在义乌外贸数据 编辑:程序博客网 时间:2024/06/01 07:17

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


0 0
原创粉丝点击