原文地址:http://developer.android.com/tools/testing/contentprovider_testing.html
Content Provider是android API的重要部分,應用程式間可以通過它來實現儲存和提取資料。
本文檔描述如何測試公用的content provider,當然也適用於供開發人員自己應用使用的provider。如果你不熟悉content provider或者android 測試,可以參見Content Providers和Testing
Fundamentals。
content provider設計和測試
在android系統中,content provider從外部看來就是提供資料表的API,其內部是隱藏的。一個content provider可能會有很多公開的常量,但是它的公用方法很少,幾乎沒有公開變數,這表明你的測試應該基於provider的公用成員,這樣設計的content provider會為自己和使用者提供一個溝通的渠道。
content provider的test case 類ProviderTestCase2允許你在一個獨立的環境中測試content provider,android類比對象如IsolatedContext和MockContentResolver同樣協助提供一個隔離的測試環境。
類似其它的android測試,content provider的測試包也在InstrumentationTestRunner的控制下運行,
Running Tests With InstrumentationTestRunner詳細的描述了該test runner。
content provider API
content provider測試API的重點在於提供一個隔離的測試環境。test case類和類比對象類可以協助你建立隔離的測試環境。
ProviderTeseCase2
你可以使用ProviderTestCase2的子類來測試content provider,該類繼承自AndroidTestCase類,因此它既提供JUnit測試架構,同時也提供android特有的用來測試應用許可權的方法。該類最重要的特點是它在初始化時會建立隔離的測試環境。
初始化是在ProviderTestCase2類的構造方法中完成的,子類都會在自己的構造方法中調用它。ProviderTestCase2類的構造方法會建立一個IsolatedContext對象,該對象允許檔案和資料庫操作,但是不允許與android系統的其它互動,檔案和資料庫操作在裝置或者模擬器的一個本地目錄中進行,該目錄有一個特定的首碼。
隨後建構函式會建立一個MockContentResolver對象作為測試用的Resolver對象。MockContentResolver類在Mock
objectclasses中有詳細描述。
最後建構函式會建立一個被測試content provider的實體,這是一個正常的ContentProvider對象,但是它的所有系統資訊都來源於IsolatedContext對象,所以它被限制在隔離的測試環境中。test
case類中的所有測試項都運行於隔離的類比對象。
類比對象
ProviderTestCase2使用IsolatedContext和MockContentResolver這些標準的類比對象。
測試什麼
What To Test列出了測試andorid組件時的常見考慮,下面是特別針對content provider測試的考慮:
- 用resolver的方法測試:儘管你可以在
ProviderTestCase2類中執行個體化一個provider對象,但是你應該使用有合適URI的resolver對象來進行測試,這樣確保你是用通常應用程式會使用的互動方式來測試該provider。
- 將公用provider作為contract來測試:如果你希望你的provider是公用的並且能夠被其它應用程式訪問,你應該講它作為contract來測試。包含如下方法:
- 使用provider公開的常量進行測試。例如,尋找表示provider中資料表列名的常量,這些都應該是provider定義的公開的常量。
- 測試provider提供的所有URI。你的provider可能會提供多個URI,每一個都指向不同的資料。例如Note Pad執行個體實現了一個provider,其中一個URI用來擷取notes列表,另一個用於擷取單個note的資料庫ID,第三個用來顯示live folder中的note。
- 測試非法URI:你的測試應該故意用一個非法的URI來調用provider,設計良好的provider對於非法URI應該會拋出一個IlleagalArgumentException。
- 測試標準的provider互動:大多數provider都提供六種存取方法:qurey、insert、delete、update、getType以及onCreate。你的測試應該驗證這些方法都能正常工作。
- 測試商務邏輯:不要忘記測試provider需要執行的商務邏輯。商務邏輯包含處理非法資料、算術運算、消除或者整合重複項等。content provider並不一定需要有商務邏輯,因為商務邏輯可能會由使用資料的Actiivity來實現。如果provider確實提供了商務邏輯,那麼你應該對其進行測試。