• <ruby id="5koa6"></ruby>
    <ruby id="5koa6"><option id="5koa6"><thead id="5koa6"></thead></option></ruby>

    <progress id="5koa6"></progress>

  • <strong id="5koa6"></strong>
  • Android集成測試

    發表于:2013-05-20來源:博客園作者:qileilove點擊數: 標簽:集成測試
    Android集成測試主要是在單元測試的基礎上測試接口訪問或者異步任務是否正確,在移動鳳巢系統中,

      Android集成測試主要是在單元測試的基礎上測試接口訪問或者異步任務是否正確,在移動鳳巢系統中,大概有30+個接口需要測試,他們都遵循一個特定的訪問模式:前臺的Activity獲取到觸發事件后,將它傳給這些接口,這些接口都是AsyncTask的實現——即后臺異步線程執行某個任務(一般是發送http請求到后端服務或者執行存取數據庫等耗時操作),完畢后調用回調函數,示意圖如下:

      一、測試框架

      對于Android中這種異步接口的自動化測試需要解決3個問題:

      1)如何獲取到異步任務執行結果;

      2)如何讓上層測試代碼盡量不處理任務等待;

      3)如何處理需要登錄的接口。

      對于問題1)每個異步任務在獲取結果后就直接調用onPostExecute()方法了,測試代碼獲取不到結果,所以必須有一個專門的樁Activity負責異步任務的執行并將結果暴露出來;

      對于問題2)盡量將等待操作交給測試基類,上層測試代碼只需要執行被測邏輯;

      對于問題3)采用模板模式,如果接口需要登錄則先執行登錄操作后再調用,整體解決方案如下:

      其中樁Activity的邏輯如下,它實際決定接口的調用方式,如果被測接口需要登錄則先登錄后調用,如果不需要登錄則直接調用。

      可以看到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來保證,這樣才不至于前后端測試緊耦合在一起。

    原文轉自:http://www.blogjava.net/qileilove/archive/2013/03/12/396305.html

    老湿亚洲永久精品ww47香蕉图片_日韩欧美中文字幕北美法律_国产AV永久无码天堂影院_久久婷婷综合色丁香五月

  • <ruby id="5koa6"></ruby>
    <ruby id="5koa6"><option id="5koa6"><thead id="5koa6"></thead></option></ruby>

    <progress id="5koa6"></progress>

  • <strong id="5koa6"></strong>