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