Android 的測試框架相關的 API 主要定義在三個包中:
Android 測試 API 是基于 JUnit 擴展而來,并添加了與 Android 平臺相關的測試 API。
JUnit
你可以直接使用 JUnit 中相關 API 編寫一些和平臺無關的測試用例(基于 TestCase), Android 測試 API 中提供了一個 TestCase 的子類 AndroidTestCase ,可以用來編寫一些 Android 相關的對象的測試用例,AndroidTestCase 支持一些和平臺相關的 setup,teardown 以及 setup 方法。
你也可以直接使用 JUnit 的 Assert 方法 顯示測試結(jié)果,這些 Assert 方法可以通過比較預期的值和實際的值,如果不同可以排除異常。Android 測試 API 擴展了一些 Assert 方法用于支持和 Android 平臺相關的比較。
要注意的是,Android 測試 API 支持 JUnit 3 代碼風格,而不支持 JUnit 4 代碼風格,也只能使用 InstrumentationTestRunner 來運行測試用例。
Instrumentation
Android 的 Instrumentation 提供了一些“鉤子”方法連接到 Android 操作系統(tǒng)中,可以獨立控制 Android 組件(Activity,Service 等)的生命周期,并可以控制 Android 如何調(diào)用一個應用。
在通常情況下(普通的 Android 應用),Android 的 activity,Service 等的生命周期是由 Android 操作系統(tǒng)來控制的。 比如一個 Activity 的生命周期開始于 onCreate (由某個 Intent 激活),然后是 onResume. 可以參見 Android 簡明開發(fā)教程五:Activities。 應用程序本身無法直接控制這些生命周期狀態(tài)的切換。但使用 Instrumatation API 時你可以直接調(diào)用這些方法。
Instrumentation API 也可以支持強制某個應用和另一個已經(jīng)在運作的應用運行在同一個進程中,這在通常的情況下是不可能實現(xiàn)的。
使用 Instrumentation API 你可以直接調(diào)用 Activity 或是 Service 的生命周期回調(diào)函數(shù),從而可以讓你運行一步一步的運行 Activity 或是 Service 的生命周期函數(shù)。如下例顯示了如何使用 Instrumentation API 來測試 Activity 保持和恢復 State。
// Start the main activity of the
// application under test
mActivity = getActivity();
// Get a handle to the Activity object's
//main UI widget, a Spinner
mSpinner
= (Spinner)mActivity
.findViewById(com.android.example.spinner.R.id.Spinner01);
// Set the Spinner to a known position
mActivity.setSpinnerPosition(TEST_STATE_DESTROY_POSITION);
// Stop the activity - The onDestroy()
//method should save the state of the Spinner
mActivity.finish();
// Re-start the Activity - the onResume()
//method should restore the state of the Spinner
mActivity = getActivity();
// Get the Spinner's current position
int currentPosition = mActivity.getSpinnerPosition();
// Assert that the current position is the
//same as the starting position
assertEquals(TEST_STATE_DESTROY_POSITION, currentPosition);
其中關鍵的一個方法是 getActivity(),只有調(diào)用 getActivity() 后被測試的 activity 才會啟動。此外 Instrumentation API 允許把測試項目和被測試的應用項目運行到同一個進程中,從而在測試代碼中可以直接調(diào)用被測試應用的方法和訪問其成員。
Test case 相關類
Android 提供了多個由 Testcase 或 Assert 派生而來的子類以支持 Android 平臺相關的 setup,teardown 和其它輔助方法。
Assertion classes
Android 測試中可以使用 JUnit 中提供的 Assert 方法來顯示測試結(jié)果。除此之外,Testing API 還提供了 MoreAsserts 和 ViewAsserts 類。其中 MoreAsserts 支持更多的比較方法包括 RegEx(正則)比較等。ViewAsserts 可以用來校驗 UI View。
Mock object classes
android.test.mock 包中定義一些測試“樁”類,如 MockApplication,MockContentProvider ,MockContext,MockCursor, MockPackagManager 等用例幫助測試。
后面將具體介紹如何使用這些 API 來編寫測試用例。