创建功能测试
编写: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提供的数据呈现。
我们可以这样实现测试方法:
@MediumTestpublic 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记录的碰撞次数是否按照预想地那样增加。
设立一个ActivityMonitor
为了在应用中监视单个Activity我们可以注册一个ActivityMoniter。每当一个符合要求的Activity启动时,系统会通知ActivityMoniter,进而更新碰撞数目。
通常来说要使用ActivityMoniter,我们可以这样:
- 使用getInstrumentation()方法为测试用例实现Instrumentation。
- 使用Instrumentation的一种addMonitor()方法为当前instrumentation添加一个Instrumentation.ActivityMonitor实例。匹配规则可以通过IntentFilter或者类名字符串。
- 等待开启一个Activity。
- 验证监视器撞击次数的增加。
- 移除监视器。
下面是一个例子:
// Set up an ActivityMonitorActivityMonitor receiverActivityMonitor =getInstrumentation().addMonitor(ReceiverActivity.class.getName(),null, false);// Validate that ReceiverActivity is startedTouchUtils.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 ActivityMonitorgetInstrumentation().removeMonitor(receiverActivityMonitor);
使用Instrumentation发送一个键盘输入
如果Activity有一个EditText,我们可以测试用户是否可以给EditText对象输入数值。
通常在ActivityInstrumentationTestCase2中给EditText对象发送串字符,我们可以这样做:
- 使用runOnMainSync()方法在一个循环中同步地调用requestFocus()。这样,我们的UI线程就会在获得焦点前一直被阻塞。
- 调用waitForIdleSync()方法等待主线程空闲(也就是说,没有更多事件需要处理)。
- 调用sendStringSync()方法给EditText对象发送一个我们输入的字符串。
比如:
// Send string input valuegetInstrumentation().runOnMainSync(new Runnable() {@Overridepublic void run() {senderMessageEditText.requestFocus();}});getInstrumentation().waitForIdleSync();getInstrumentation().sendStringSync("Hello Android!");getInstrumentation().waitForIdleSync();
