

可以看到isCompleted是標識異步任務是否執行完畢的,無論異步任務返回是onSuccess、onError還是onIOException都會進行置位;result則是異步調用的返回,可以看到這里無論接口調用是成功、失敗還是io異常都會將這個結果暴露出來以使測試代碼能夠獲取到;
interfaceAction是測試代碼需要實現的接口,內容如下:

由于有些接口是必須登錄才能訪問的,所以前兩個接口實現是為其服務的,如果訪問的接口必須處于登錄狀態則先調用login()方法,然后再調用實際的action()方法。另外,書寫測試代碼的時候為了減少對異步任務等待的代碼以及顯示對InterfaceActivity這個樁Activity

的調用還需要完善測試基類:這樣上層test case只需要關心具體的測試邏輯而不用關心異步調用及等待處理
二、測試方法
以商橋訪問接口測試為例,由于它是一個需要登陸才能訪問的接口,寫自動化case的時候需要完成兩個類:BridgeAction和BridgeTest。其中BridgeAction主要是接口的調用,BridgeTest是測試內容:

這里BaseLoginAction實現了needLogin()和login()方法,主要是登錄邏輯,BridgeAction的action()是真正接口的調用。

測試類主要是對BridgeAction的調用,它可以向接口傳遞不同的參數,同時也可傳遞登錄操作的用戶名和密碼。waitAsyncTaskComplete(action)完成了接口邏輯的調用及時間的等待,測試代碼只需著重關注result并進行斷言。
三、總結
異步接口的集成測試的側重點在于Android手機端向服務器端發送的請求是否正確,以上測試CASE的斷言與后端數據其實是強耦合的,即后端caiye這個賬戶的數據變化可能導致CASE的fail,所以可以考慮引入hamcrest包,做一些匹配校驗,主要測試正常和異常情況服務器返回的內容是否符合預期,比如上面最后一個斷言可以寫成:assertEquals(intValue(),greaterThan(0));當然,服務器端接口的正確性正常情況下應該由服務器端的自動化Case來保證,這樣才不至于前后端測試緊耦合在一起。