Android 培训

创建功能测试

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

功能测试包括验证单个应用组件是否与使用者期望的那样(与其它组件)协同工作。比如,你可以创建一个功能测试验证在用户执行UI交互时Activity是否正确启动目标Activity

要为你的Activity创建功能测试,你的测试类应该扩展ActivityInstrumentationTestCase2。与ActivityUnitTestCase不同的是在ActivityInstrumentationTestCase2中可以与Android系统通信以及发送键盘输入和点击事件到UI。

要了解一个完整的测试例子,看一下示例应用中的SenderActivityTest.java。

添加测试方法验证函数的行为

你的函数测试目标应该包括:

  • 验证UI控制是否正确启动了目标Activity

  • 验证目标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
    ...
}

测试等待与屏幕匹配的Activity,否则返回会在超时后返回null。如果ReceiverActivity启动了,那么你先前设立的ActivityMoniter就会收到一次撞击。你可以使用断言方法验证ReceiverActivity是否的确启动了,并且ActivityMoniter记录撞击次数会按照预想的那样增加。

设立一个ActivityMonitor

为了在你的应用中监视单个Activity,你可以注册一个ActivityMoniterActivityMoniter是由系统在每当一个Activity与你的要求符合是开启的。如果发现匹配,监视器的撞击计数就会更新。

通常来说要使用ActivityMoniter,你应该这样:

  1. 使用getInstrumentation())方法为你的测试用例实现Instrumentation

  2. 为当前使用InstrumentationaddMonitor()方法的instrumentation添加一个Instrumentation.ActivityMonitor实例。匹配规则可以是通过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对象输入数值。

通常在ActivityInstrumentationTestCase2中给EditText对象发送串字符,你应该这样作:

  1. 使用runOnMainSync())方法在一个循环中同步调用requestFocus())。这样,你的UI线程就会在获得焦点前一直被阻塞。

  2. 调用waitForIdleSync())方法等待主线程空闲(也就是说,没有更多的运行事件)。

  3. 调用sendStringSync())方法给EditText对象发送一个你输入的字符串。

想这样:

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

本节例子AndroidTestingFun.zip