天天看點

從零單排Espresso系列-----網絡請求測試

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)

繼續閱讀