Android 創(chuàng)建功能測試

2018-08-02 18:31 更新

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

功能測試包括驗證單個應(yīng)用中的各個組件是否與使用者期望的那樣(與其它組件)協(xié)同工作。比如,我們可以創(chuàng)建一個功能測試驗證在用戶執(zhí)行UI交互時Activity是否正確啟動目標(biāo)Activity。

要為Activity創(chuàng)建功能測,我們的測試類應(yīng)該對ActivityInstrumentationTestCase2進(jìn)行擴(kuò)展。與ActivityUnitTestCase不同,ActivityInstrumentationTestCase2中的測試可以與Android系統(tǒng)通信,發(fā)送鍵盤輸入及點擊事件到UI中。

要了解一個完整的測試?yán)涌梢詤⒖际纠龖?yīng)用中的SenderActivityTest.java

添加測試方法驗證函數(shù)的行為

我們的函數(shù)測試目標(biāo)應(yīng)該包括:

  • 驗證UI控制是否正確啟動了目標(biāo)Activity。
  • 驗證目標(biāo)Activity的表現(xiàn)是否按照發(fā)送Activity提供的數(shù)據(jù)呈現(xiàn)。

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

@MediumTest
public void testSendMessageToReceiverActivity() {
    final Button sendToReceiverButton = (Button)
            mSenderActivity.findViewById(R.id.send_message_button);

    final EditText senderMessageEditText = (EditText)
            mSenderActivity.findViewById(R.id.message_input_edit_text);

    // Set up an ActivityMonitor
    ...

    // Send string input value
    ...

    // Validate that ReceiverActivity is started
    ...

    // Validate that ReceiverActivity has the correct data
    ...

    // Remove the ActivityMonitor
    ...
}

測試會等待匹配的Activity啟動,如果超時則會返回null。如果ReceiverActivity啟動了,那么先前配置的ActivityMoniter就會收到一次碰撞(Hit)。我們可以使用斷言方法驗證ReceiverActivity是否的確啟動了,以及ActivityMoniter記錄的碰撞次數(shù)是否按照預(yù)想地那樣增加。

設(shè)立一個ActivityMonitor

為了在應(yīng)用中監(jiān)視單個Activity我們可以注冊一個ActivityMoniter。每當(dāng)一個符合要求的Activity啟動時,系統(tǒng)會通知ActivityMoniter,進(jìn)而更新碰撞數(shù)目。

通常來說要使用ActivityMoniter,我們可以這樣:

  1. 使用getInstrumentation()方法為測試用例實現(xiàn)Instrumentation。
  2. 使用Instrumentation的一種addMonitor()方法為當(dāng)前instrumentation添加一個Instrumentation.ActivityMonitor實例。匹配規(guī)則可以通過IntentFilter或者類名字符串。
  3. 等待開啟一個Activity。
  4. 驗證監(jiān)視器撞擊次數(shù)的增加。
  5. 移除監(jiān)視器。

下面是一個例子:

// Set up an ActivityMonitor
ActivityMonitor receiverActivityMonitor =
        getInstrumentation().addMonitor(ReceiverActivity.class.getName(),
        null, false);

// Validate that ReceiverActivity is started
TouchUtils.clickView(this, sendToReceiverButton);
ReceiverActivity receiverActivity = (ReceiverActivity)
        receiverActivityMonitor.waitForActivityWithTimeout(TIMEOUT_IN_MS);
assertNotNull("ReceiverActivity is null", receiverActivity);
assertEquals("Monitor for ReceiverActivity has not been called",
        1, receiverActivityMonitor.getHits());
assertEquals("Activity is of wrong type",
        ReceiverActivity.class, receiverActivity.getClass());

// Remove the ActivityMonitor
getInstrumentation().removeMonitor(receiverActivityMonitor);

使用Instrumentation發(fā)送一個鍵盤輸入

如果Activity有一個EditText,我們可以測試用戶是否可以給EditText對象輸入數(shù)值。

通常在ActivityInstrumentationTestCase2中給EditText對象發(fā)送串字符,我們可以這樣做:

  1. 使用runOnMainSync()方法在一個循環(huán)中同步地調(diào)用requestFocus()。這樣,我們的UI線程就會在獲得焦點前一直被阻塞。
  2. 調(diào)用waitForIdleSync()方法等待主線程空閑(也就是說,沒有更多事件需要處理)。
  3. 調(diào)用sendStringSync()方法給EditText對象發(fā)送一個我們輸入的字符串。

比如:

// Send string input value
getInstrumentation().runOnMainSync(new Runnable() {
    @Override
    public void run() {
        senderMessageEditText.requestFocus();
    }
});
getInstrumentation().waitForIdleSync();
getInstrumentation().sendStringSync("Hello Android!");
getInstrumentation().waitForIdleSync();

本節(jié)例子AndroidTestingFun.zip


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

掃描二維碼

下載編程獅App

公眾號
微信公眾號

編程獅公眾號