Android 創(chuàng)建單元測(cè)試

2018-08-02 18:30 更新

編寫:huanglizhuo - 原文:http://developer.android.com/training/activity-testing/activity-unit-testing.html

Activity單元測(cè)試可以快速且獨(dú)立地(和系統(tǒng)其它部分分離)驗(yàn)證一個(gè)Activity的狀態(tài)以及其與其它組件交互的正確性。一個(gè)單元測(cè)試通常用來測(cè)試代碼中最小單位的代碼塊(可以是一個(gè)方法,類,或者組件),而且也不依賴于系統(tǒng)或網(wǎng)絡(luò)資源。比如說,你可以寫一個(gè)單元測(cè)試去檢查Activity是否正確地布局或者是否可以正確地觸發(fā)一個(gè)Intent對(duì)象。

單元測(cè)試一般不適合測(cè)試與系統(tǒng)有復(fù)雜交互的UI。我們應(yīng)該使用如同測(cè)試UI組件所描述的ActivityInstrumentationTestCase2來對(duì)這類UI交互進(jìn)行測(cè)試。

這節(jié)內(nèi)容將會(huì)講解如何編寫一個(gè)單元測(cè)試來驗(yàn)證一個(gè)Intent是否正確地觸發(fā)了另一個(gè)Activity。由于測(cè)試是與環(huán)境獨(dú)立的,所以Intent實(shí)際上并沒有發(fā)送給Android系統(tǒng),但我們可以檢查Intent對(duì)象的載荷數(shù)據(jù)是否正確。讀者可以參考一下示例代碼中的LaunchActivityTest.java,將它作為一個(gè)例子,了解完備的測(cè)試用例是怎么樣的。

注意: 如果要針對(duì)系統(tǒng)或者外部依賴進(jìn)行測(cè)試,我們可以使用Mocking Framework的Mock類,并把它集成到我們的你的單元測(cè)試中。要了解更多關(guān)于Android提供的Mocking Framework內(nèi)容請(qǐng)參考Mock Object Classes

編寫一個(gè)Android單元測(cè)試?yán)?/h2>

ActiviUnitTestCase類提供對(duì)于單個(gè)Activity進(jìn)行分離測(cè)試的支持。要?jiǎng)?chuàng)建單元測(cè)試,我們的測(cè)試類應(yīng)該繼承自ActiviUnitTestCase。繼承ActiviUnitTestCase的Activity不會(huì)被Android自動(dòng)啟動(dòng)。要單獨(dú)啟動(dòng)Activity,我們需要顯式的調(diào)用startActivity()方法,并傳遞一個(gè)Intent來啟動(dòng)我們的目標(biāo)Activity。

例如:

public class LaunchActivityTest
        extends ActivityUnitTestCase<LaunchActivity> {
    ...

    @Override
    protected void setUp() throws Exception {
        super.setUp();
        mLaunchIntent = new Intent(getInstrumentation()
                .getTargetContext(), LaunchActivity.class);
        startActivity(mLaunchIntent, null, null);
        final Button launchNextButton =
                (Button) getActivity()
                .findViewById(R.id.launch_next_activity_button);
    }
}

驗(yàn)證另一個(gè)Activity的啟動(dòng)

我們的單元測(cè)試目標(biāo)可能包括:

  • 驗(yàn)證當(dāng)Button被按下時(shí),啟動(dòng)的LaunchActivity是否正確。
  • 驗(yàn)證啟動(dòng)的Intent是否包含有效的數(shù)據(jù)。

為了驗(yàn)證一個(gè)觸發(fā)Intent的Button的事件,我們可以使用getStartedActivityIntent()方法。通過使用斷言方法,我們可以驗(yàn)證返回的Intent是否為空,以及是否包含了預(yù)期的數(shù)據(jù)來啟動(dòng)下一個(gè)Activity。如果兩個(gè)斷言值都是真,那么我們就成功地驗(yàn)證了Activity發(fā)送的Intent是正確的了。

我們可以這樣實(shí)現(xiàn)測(cè)試方法:

@MediumTest
public void testNextActivityWasLaunchedWithIntent() {
    startActivity(mLaunchIntent, null, null);
    final Button launchNextButton =
            (Button) getActivity()
            .findViewById(R.id.launch_next_activity_button);
    launchNextButton.performClick();

    final Intent launchIntent = getStartedActivityIntent();
    assertNotNull("Intent was null", launchIntent);
    assertTrue(isFinishCalled());

    final String payload =
            launchIntent.getStringExtra(NextActivity.EXTRAS_PAYLOAD_KEY);
    assertEquals("Payload is empty", LaunchActivity.STRING_PAYLOAD, payload);
}

因?yàn)長aunchActivity是獨(dú)立運(yùn)行的,所以不可以使用TouchUtils庫來操作UI。如果要直接進(jìn)行Button點(diǎn)擊,我們可以調(diào)用perfoemClick()方法。

本節(jié)示例代碼AndroidTestingFun.zip


以上內(nèi)容是否對(duì)您有幫助:
在線筆記
App下載
App下載

掃描二維碼

下載編程獅App

公眾號(hào)
微信公眾號(hào)

編程獅公眾號(hào)