Android 的測(cè)試框架相關(guān)的 API 主要定義在三個(gè)包中:
Android 測(cè)試 API 是基于 JUnit 擴(kuò)展而來,并添加了與 Android 平臺(tái)相關(guān)的測(cè)試 API。
JUnit
你可以直接使用 JUnit 中相關(guān) API 編寫一些和平臺(tái)無關(guān)的測(cè)試用例(基于 TestCase), Android 測(cè)試 API 中提供了一個(gè) TestCase 的子類 AndroidTestCase ,可以用來編寫一些 Android 相關(guān)的對(duì)象的測(cè)試用例,AndroidTestCase 支持一些和平臺(tái)相關(guān)的 setup,teardown 以及 setup 方法。
你也可以直接使用 JUnit 的 Assert 方法 顯示測(cè)試結(jié)果,這些 Assert 方法可以通過比較預(yù)期的值和實(shí)際的值,如果不同可以排除異常。Android 測(cè)試 API 擴(kuò)展了一些 Assert 方法用于支持和 Android 平臺(tái)相關(guān)的比較。
要注意的是,Android 測(cè)試 API 支持 JUnit 3 代碼風(fēng)格,而不支持 JUnit 4 代碼風(fēng)格,也只能使用 InstrumentationTestRunner 來運(yùn)行測(cè)試用例。
Instrumentation
Android 的 Instrumentation 提供了一些“鉤子”方法連接到 Android 操作系統(tǒng)中,可以獨(dú)立控制 Android 組件(Activity,Service 等)的生命周期,并可以控制 Android 如何調(diào)用一個(gè)應(yīng)用。
在通常情況下(普通的 Android 應(yīng)用),Android 的 activity,Service 等的生命周期是由 Android 操作系統(tǒng)來控制的。 比如一個(gè) Activity 的生命周期開始于 onCreate (由某個(gè) Intent 激活),然后是 onResume. 可以參見 Android 簡明開發(fā)教程五:Activities。 應(yīng)用程序本身無法直接控制這些生命周期狀態(tài)的切換。但使用 Instrumatation API 時(shí)你可以直接調(diào)用這些方法。
Instrumentation API 也可以支持強(qiáng)制某個(gè)應(yīng)用和另一個(gè)已經(jīng)在運(yùn)作的應(yīng)用運(yùn)行在同一個(gè)進(jìn)程中,這在通常的情況下是不可能實(shí)現(xiàn)的。
使用 Instrumentation API 你可以直接調(diào)用 Activity 或是 Service 的生命周期回調(diào)函數(shù),從而可以讓你運(yùn)行一步一步的運(yùn)行 Activity 或是 Service 的生命周期函數(shù)。如下例顯示了如何使用 Instrumentation API 來測(cè)試 Activity 保持和恢復(fù) 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);
其中關(guān)鍵的一個(gè)方法是 getActivity(),只有調(diào)用 getActivity() 后被測(cè)試的 activity 才會(huì)啟動(dòng)。此外 Instrumentation API 允許把測(cè)試項(xiàng)目和被測(cè)試的應(yīng)用項(xiàng)目運(yùn)行到同一個(gè)進(jìn)程中,從而在測(cè)試代碼中可以直接調(diào)用被測(cè)試應(yīng)用的方法和訪問其成員。
Test case 相關(guān)類
Android 提供了多個(gè)由 Testcase 或 Assert 派生而來的子類以支持 Android 平臺(tái)相關(guān)的 setup,teardown 和其它輔助方法。
Assertion classes
Android 測(cè)試中可以使用 JUnit 中提供的 Assert 方法來顯示測(cè)試結(jié)果。除此之外,Testing API 還提供了 MoreAsserts 和 ViewAsserts 類。其中 MoreAsserts 支持更多的比較方法包括 RegEx(正則)比較等。ViewAsserts 可以用來校驗(yàn) UI View。
Mock object classes
android.test.mock 包中定義一些測(cè)試“樁”類,如 MockApplication,MockContentProvider ,MockContext,MockCursor, MockPackagManager 等用例幫助測(cè)試。
后面將具體介紹如何使用這些 API 來編寫測(cè)試用例。