[android test] service測試

來源:互聯網
上載者:User

原文地址:http://developer.android.com/tools/testing/service_testing.html

android為service提供了一套測試架構,可以讓service隔離運行,同時能夠提供類比對象以供使用。測試  service使用的test case 類是ServiceTestCase。因為Service類假設它與用戶端是分開的,所以測試service不需要使用instrumentation。

下面的文檔描述了service測試技術,如果你對Service類還不太熟悉,可以閱讀 Services文檔,如果你對android測試還不太熟悉,可以閱讀Testing Fundamentals文檔,它是android測試和instrumentation架構的簡介。

Service設計和測試

當你設計一個Service時,你應該考慮測試類別如何檢查Service生命週期中的各個狀態,如果啟動Service的方法,例如onCreate()或者onStartCommand(),沒有設定一個全域變數來標識啟動是否成功,那麼你可能需要提供這樣的一個變數用作測試。

測試中的大部分都由ServiceTestCase類中的方法來完成。例如,getService()將會返回一個被測試Service的控制代碼,甚至在測試的末尾你都可以用來確認service是否在運行。

ServiceTestCase

ServiceTestCase類在繼承JUnit中TestCase類的基礎上添加一些其它方法,如測試應用許可權、控制被測試應用及Service,它同樣也提供類比的Application和Context對象來讓你將測試和真實系統相隔離。

ServiceTestCase類會延遲測試環境的初始化,直到你調用ServiceTestCase.startService()或者ServiceTestCase.bindService()。這樣可以方便你在Service啟動前自訂測試環境,特別是類比對象。

注意ServiceTestCase.bindService()的參數和Service.bindService()的參數是不一樣的,前者你只需要提供一個Intent,同時返回的也不是boolean值,而是一個IBinder子類的對象。

ServiceTestCasesetUp()方法在每項測試前都會被調用,它會通過複製一份當前系統的Context對象來初始化測試環境,你可以通過getSystemContext()方法來取得這個Context,如果你覆寫該方法,你必須先執行super.setUp()方法。

setApplication()setContext(Context)方法允許你在Service啟動前為它設定一個類比的Context或者Application或者同時設定這兩個。這些類比對象在Mock
object classes中有描述。

預設情況下,ServiceTestCase類會執行測試方法testAndroidTestCaseSetupProperly(),它斷言test
case類的基類能夠成功地初設定Context對象。

類比對象

ServiceTestCase假定你會在測試環境中使用類比的Context或者Application對象,這些對象將測試與真實系統內容相隔離。如果你在啟動Service前不提供這些對象的執行個體,ServiceTestCase將會建立建立的實體並注入到Service中,要覆蓋該行為,你可過在Service啟動前自己建立這些實體並且注入到Service中。

要將一個類比的Application對象注入到被測試的Service中,首先建立一個MockApplication類的子類。MockApplication是Application類的子類,它的所有方法都會拋出異常,所以要使用它的話需要繼承它並且覆寫需要的方法,然後使用setApplication()方法將它注入到Service中。該類比對象可以讓你控制service看到的應用的屬性,並且將它與真實系統隔離開。另外,在測試工程匯總,service的任何隱藏依賴都會作為異常被暴露

你可以用setContext()方法將一個類比的Context對象注入到被測試的service中,可以使用的類比Context類在
Testing Fundamentals中都有描述。

測試什麼

What To Test列出了測試andorid組件時的常見考慮,下面是特別針對service測試的考慮:

  • 確保調用Context.startService()或者Context.bindService()onCreate()方法被調用,同樣地,你應該確保在調用Context.stopService()Context.unbindService()stopSelf()或者stopSelfResult()onDestroy()方法被調用。
  • 確保Service能夠正確地處理多次Context.startService()調用,只有第一次調用會觸發Service.onCreate(),但是每次調用都會觸發Service.onStartCommand()。注意:startService()調用並不是嵌套的,所以調用一次Context.stopService()或者Service.stopSelf()就會結束該Service。你應該測試你的service是否在正確的時候結束。
  • 測試service實現的商務邏輯,商務邏輯包含檢查非法值、算術運算等。

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.