在Espresso 自動(dòng)化測(cè)試的使用中已經(jīng)把一些基本的測(cè)試使用方法告訴大家了拙已,但是數(shù)據(jù)加載之類(lèi)的延時(shí)操作卻沒(méi)有詳細(xì)說(shuō)明,這篇文介紹下Espresso 延時(shí)操作的使用
之前有在谷歌搜索相關(guān)資料摧冀,確實(shí)有不少解說(shuō)這個(gè)的倍踪,但多少都驗(yàn)證了是有問(wèn)題的,只有官方給出的列子是OK的索昂,因此我們就以官方的列子為依據(jù)來(lái)解說(shuō)
庫(kù)的引用
在使用之前建车,我們需要引入對(duì)應(yīng)的庫(kù),由于耗時(shí)需要在項(xiàng)目中使用楼镐,所以要使用compile,而非androidTestCompile
compile 'com.android.support.test.espresso:espresso-idling-resource:2.2.2'
IdlingResource 的使用
-
IdlingResource本身是個(gè)接口癞志,代碼如下
public interface IdlingResource {
//用于日志顯示的名字,可隨意取
public String getName();
//是否是空閑狀態(tài)
public boolean isIdleNow();
//注冊(cè)變成空閑的回調(diào)
public void registerIdleTransitionCallback(ResourceCallback callback);
//回調(diào)接口
public interface ResourceCallback {
public void onTransitionToIdle();
}
}
-
我們需要實(shí)現(xiàn)這個(gè)接口
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.
* 我們只需要在耗時(shí)完成后框产,調(diào)用次方法凄杯,即可執(zhí)行耗時(shí)后的操作
*/
public void setIdleState(boolean isIdleNow) {
mIsIdleNow.set(isIdleNow);
if (isIdleNow && mCallback != null) {
mCallback.onTransitionToIdle();
}
}
}
-
耗時(shí)操作在代碼中的使用
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() {
//耗時(shí)操作開(kāi)始,設(shè)置空閑狀態(tài)為false秉宿,阻塞測(cè)試線(xiàn)程
mIdlingResource.setIdleState(false);
loadData(new Callback{
@Override
void onCall(Data data){
content.setText("finish data");
//耗時(shí)操作結(jié)束戒突,設(shè)置空閑狀態(tài)為true,放開(kāi)測(cè)試線(xiàn)程
mIdlingResource.setIdleState(true);
}
})
//試了一下描睦,去除@VisibleForTesting這個(gè)注解膊存,不妨礙Test調(diào)用,就把他當(dāng)成測(cè)試標(biāo)志吧
@VisibleForTesting
public IdlingResource getIdlingResource() {
if(mIdlingResource == null)
mIdlingResource = new SimpleIdlingResource();
return mIdlingResource;
}
}
-
在測(cè)試中的使用
@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(){
//執(zhí)行點(diǎn)擊事件忱叭,進(jìn)入耗時(shí)操作
onView(withId(R.id.getdata)).perform(click());
//驗(yàn)證
onView(withId(R.id.content)).check(matchers(withText("finish data")));
}
@After
public void unregisterIdlingResource(){
if(mIdlingResource != null)
Espresso.unregisterIdlingResources(mIdlingResource);
}
}
這是本人已官方列子為依據(jù)總結(jié)的IdlingResource的使用隔崎,重要點(diǎn)都在代碼中注釋了,如有問(wèn)題韵丑,請(qǐng)留言