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