Android官方開發文件Training系列課程中文版:Activity測試之建立功能性測試

weixin_33858249發表於2016-11-14

原文地址:http://android.xsoftlab.net/training/activity-testing/activity-functional-testing.html

功能性測試包括模擬使用者操作之類的元件驗證。例如開發者可以通過功能性測試來驗證在使用者執行了UI操作之後Activity是否啟動了Activity。

如要為Activity建立功能性測試,測試類應當繼承ActivityInstrumentationTestCase2。與ActivityUnitTestCase不同,ActivityInstrumentationTestCase2既可以與Android系統通訊,又能使程式可以接收鍵盤輸入事件與螢幕點選事件。

驗證功能行為

一般功能性測試可能會有以下測試目的:

  • 驗證在某個UI控制器被按下後,目標Activity是否被啟動。
  • 驗證目標Activity是否將在啟動之前的使用者輸入資料正確顯示。

開發者所實現的程式碼可能如下:

@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
    ...
}

測試框架會等待ReceiverActivity啟動,否則的話將會在超時後返回null。如果ReceiverActivity啟動,那麼ActivityMonitor則會收到一個命中。開發者可以通過斷言方法來驗證ReceiverActivity是否被啟動,命中數是否會如所期望的那樣有所增長。

設定ActivityMonitor

如果需要監視Activity,可以註冊ActivityMonitor。當目標Activity啟動時,系統會通知ActivityMonitor一個事件。如果目標Activity啟動,那麼ActivityMonitor的計數器則會更新。

一般使用ActivityMonitor應當執行以下步驟:

  • 1.通過getInstrumentation()方法獲得用於測試的Instrumentation例項。
  • 2.通過Instrumentation的addMonitor()過載方法將Instrumentation.ActivityMonitor的例項新增到當前的instrumentation中,具體的匹配規則可由IntentFilter或者類名指定。
  • 3.等待被監視的Activity啟動。
  • 4.驗證監視器的數字增長。
  • 5.移除監視器。

例如:

// 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傳送鍵盤事件

如果Activity含有EditText,可能需要測試使用者是否可以對其輸入資料。

一般來說,要傳送字串到EditText,應當:

例如:

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

相關文章