App寫完了一個使用者登入邏輯,如何測試效果呢?
運作到手機上,然後慢慢輸入嗎?
如果有問題改了一點,然後繼續運作到手機上嗎?
…
下面教大家使用Espresso進行網絡測試(寫完後,運作,别眨眼,因為測試耗時不到1秒鐘)
1、辨別網絡請求的狀态
//我在進行網絡請求,測試等一等
EspressoIdlingResource.increment();
//普通網絡請求代碼
cline.doPost(...,
//收到網絡回複了
new Resposnse(){
if(!EspressoIdlingResource.getIdlingResource().isIdleNow()){
//網絡請求完了
EspressoIdlingResource.decrement();
}
});
2、在測試用例中添加網絡狀态的檢測
@Before
public void registerIdlingResource(){
Espresso.registerIdlingResource(rule.getActivity.getCountingIdlingResource());
@After
public void unregisterIdlingResource(){
Espresso.unregisterIdlingResource(rule.getActivity.getCountingIdlingResource());
}
}
//測試用例
@Test
public void onLogin(){
//輸入使用者名
onView(withId(R.id.etUsername)).perform(typeText("admin"),closeSoftKeyboard());
//輸入密碼
onView(withId(R.id.etPassword)).perform(typeText("admin"),closeSoftKeyboard());
//點選确定
onView(withId(R.id.btnLogin)).perform(click());
//檢測錯誤提示
onView(withId(R.id.tvError)).check(isDisplayed())
}
3、告訴測試用例,現在界面的狀态
@VisibleForTesting
public IdlingResource getCountingIdlingResource(){
return EspressoIdlingResource.getIdlingResource();
}
4、狀态辨別方法
public class EspressoIdlingResource {
private static final String RESOURCE="GLOBAL";
private static SimpleCountingIdlingResource mCountingIdlingResource=new SimpleCountingIdlingResource(RESOURCE);
public static void increment(){
mCountingIdlingResource.increment();
}
public static void decrement(){
mCountingIdlingResource.decrement();
}
public static IdlingResource getIdlingResource(){
return mCountingIdlingResource;
}
}
5、網絡請求狀态的同步狀态
public class SimpleCountingIdlingResource implements IdlingResource {
private final String mResourceName;
private final AtomicInteger counter=new AtomicInteger();
private volatile ResourceCallback resourceCallback;
public SimpleCountingIdlingResource(String resourceName){
this.mResourceName=resourceName;
}
@Override
public String getName() {
return mResourceName;
}
@Override
public boolean isIdleNow() {
return counter.get()==;
}
@Override
public void registerIdleTransitionCallback(ResourceCallback callback) {
this.resourceCallback=callback;
}
public void increment(){
counter.getAndIncrement();
}
public void decrement(){
int counterVal=counter.decrementAndGet();
if(counterVal==){
if(null!=resourceCallback){
resourceCallback.onTransitionToIdle();
}
}
if(counterVal<){
throw new IllegalArgumentException("Counter has been corrupted!");
}
}
}
6、好吧,我承認我誇張了,實際上運作結果花了不到三秒(2 s 626 ms)