鍍金池/ 教程/ Android/ Android 測試教程(11):ActivityUnitTestCase 示例
monkeyrunner 簡介
Android 測試教程(14):ActivityInstrumentationTestCase2 示例
ApplicationTestCase 示例
Android 測試教程(13):TestCase 示例
ActivityInstrumentationTestCase2 示例
測試 Activity
測試項(xiàng)目
Android 測試教程(12):ServiceTestCase 示例
測試相關(guān) API
Monkey 命令行工具
第一個測試項(xiàng)目 HelloWorldTest
測試 Content Provider
Android 測試教程(11):ActivityUnitTestCase 示例
測試基礎(chǔ)
AndroidTestCase 示例
測試 Service

Android 測試教程(11):ActivityUnitTestCase 示例

ActivityUnitTestCase 通常用來測試單獨(dú) Activity。在啟動被測試的 Activity 之前,你可以 Inject 一個假的 Context 或是 Application ,使用這個 Mock 的 Context 中一個隔離環(huán)境中運(yùn)行被測試的 Activity。通常用于 Activity 的單元測試,而不和 Anroid 系統(tǒng)進(jìn)行交互。

ActivityUnitTestCase 的類繼承關(guān)系如下圖:

http://wiki.jikexueyuan.com/project/android-test-course/images/11.1.jpg" alt="picture11.1" />

應(yīng)該要注意的是,作為單純的單元測試,被測試的 Activity 不運(yùn)行在一般應(yīng)用運(yùn)行的環(huán)境中也不和其它 Activity 產(chǎn)生交互。在這種情況下,不能調(diào)用下面的方法,如果調(diào)用一般會拋出異常:

createPendingResult(int, Intent, int)
startActivityIfNeeded(Intent, int)
startActivityFromChild(Activity, Intent, int)
startNextMatchingActivity(Intent)
getCallingActivity()
getCallingPackage()
createPendingResult(int, Intent, int)
getTaskId()
isTaskRoot()
moveTaskToBack(boolean)

下面的方法可以調(diào)用,但一般不起任何作用,你可以使用 getStartedActivityIntent() 和 getStartedActivityRequest() 來檢查參數(shù)值。

startActivity(Intent)
startActivityForResult(Intent, int)

下面的方法也可以調(diào)用,一般也無效果,可以使用 isFinishCalled() 和 getFinishedActivityRequest 檢查傳入的參數(shù)。

finish()
finishFromChild(Activity)
finishActivity(int)

ForwardingTest 的代碼如下:


    public class ForwardingTest
     extends ActivityUnitTestCase<Forwarding> {

     private Intent mStartIntent;
     private Button mButton;

     public ForwardingTest() {
     super(Forwarding.class);
     }

     @Override
     protected void setUp() throws Exception {
     super.setUp();

     mStartIntent = new Intent(Intent.ACTION_MAIN);
     }

     @MediumTest
     public void testPreconditions() {
     startActivity(mStartIntent, null, null);
     mButton = (Button) getActivity().findViewById(R.id.go);

     assertNotNull(getActivity());
     assertNotNull(mButton);
     }

     @MediumTest
     public void testSubLaunch() {
     Forwarding activity
     = startActivity(mStartIntent, null, null);
     mButton = (Button) activity.findViewById(R.id.go);

     mButton.performClick();

     assertNotNull(getStartedActivityIntent());
     assertTrue(isFinishCalled());
     }

     @MediumTest
     public void testLifeCycleCreate() {
     Forwarding activity
     = startActivity(mStartIntent, null, null);
     getInstrumentation().callActivityOnStart(activity);
     getInstrumentation().callActivityOnResume(activity);

     getInstrumentation().callActivityOnPause(activity);

     getInstrumentation().callActivityOnStop(activity);
     }

    }

在 setUp 中,創(chuàng)建了一個 Mock Intent 對象 mStartIntent 用于測試 Activity。

按慣例測試方法 testPreconditions 通常作為第一個測試方法,如果該方法 Fail 的話,表示測試所需的條件不滿足,此時其它測試一般也會 Fail 。但這個方法并不一定是第一個運(yùn)行。

testSubLaunch 可以測試當(dāng)前 Activity 能否成功啟動其它 Activity,方法 getStartedActivityRequest 返回 當(dāng)前 Activity 調(diào)用 startActivityForResult(Intent, int) 的 request code. 方法 isFinishCalled 將在當(dāng)前 activity 調(diào)用 finish() 或 finishActivity, finishFromChild 后返回 true. Forwarding 示例參照 Android ApiDemos 示例解析(7):App->Activity->Forwarding

testLifeCycleCreate 測試 Activity 的生命周期回調(diào)函數(shù),使用 getInstrumentation 取的 Instrumentation 對象,通過 Instrumentation 對象可以調(diào)用 Activity 對應(yīng)的生命周期回調(diào)函數(shù)來測試 Activity 的 onCreate, onStart,onResume 等方法。

ActivityUnitTestCase 還提供了 sendKeys 方法模擬按鍵事件,可以用來測試 UI。

Tags: Android 測試