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(0);
private volatile ResourceCallback resourceCallback;
public SimpleCountingIdlingResource(String resourceName){
this.mResourceName=resourceName;
}
@Override
public String getName() {
return mResourceName;
}
@Override
public boolean isIdleNow() {
return counter.get()==0;
}
@Override
public void registerIdleTransitionCallback(ResourceCallback callback) {
this.resourceCallback=callback;
}
public void increment(){
counter.getAndIncrement();
}
public void decrement(){
int counterVal=counter.decrementAndGet();
if(counterVal==0){
if(null!=resourceCallback){
resourceCallback.onTransitionToIdle();
}
}
if(counterVal<0){
throw new IllegalArgumentException("Counter has been corrupted!");
}
}
}
6、好吧,我承认我夸张了,实际上运行结果花了不到三秒(2 s 626 ms)