一天一个关于测试知识点,5分钟内讲解你最关心的软件测试问题,今天就接着来谈谈关于软件测试中的“Uiwatcher类介绍”。
Uiwatcher用于处理脚本执行过程中遇到非预想的步骤,比如以下场景。
l 测试过程中来了一个电话。
l 测试过程中来了一条短信或微信。
l 测试过程中闹钟响了。
l 出现各种非预想的步骤。
Uiwatcher的定义方法如下。
UiDevice.getInstance(instrumentation).registerWatcher("phone",new UiWatcher() {
@Override
public boolean checkForCondition() {
…}
}
其中代码public boolean checkForCondition() {…}为中断监听检查条件,是必须有的。
另外,需要注意以下几个方面。
l UiWatcher写在所有的用例之前,要在用例之前启动,启动之后,后面的正常用例才能执行,执行过程中出现异常的时候调监听器。
l 若测试用例运行较快,有时候不是完美的被打断的时候,监听器有时候也会失败,不会刚好监听到异常情况,这个时候可以把用例之间执行步骤停顿的时间加长,sleep(2000)之类。
l 如果循环体(方法体也是)被打断以后,就算监听器处理完异常也不可能再回到循环体里面,可以简单的复制代码循环,如果代码太长就算了。
l UiDevice 是不会触发监听器的,比如按home键、菜单键调用到UiDevice的功能,他的顺序执行是不会调用到UiWatcher的。
Uiwatcher类的API如表4-41所示。
案例4-38:监听电话。
@Test
public void testWatcher() throws UiObjectNotFoundException {
UiDevice.getInstance(instrumentation).registerWatcher("phone",new UiWatcher() {
@Override
public boolean checkForCondition() {
//电话监听
UiObject call = new UiObject(new UiSelector().resourceId("com.android.dialer:id/primary_call_banner"));//由接听按钮判断为来电
UiObject call_reject = new UiObject(new UiSelector().resourceId("com.android.dialer:id/floating_end_call_action_button"));//挂断按钮
if (call.exists()) {
Log.i("AAA","电话监听器被触发啦!!!!");
try {
call_reject.click();
return true;
} catch (UiObjectNotFoundException e) {
e.printStackTrace();
}
}
return false;
}
});
testScroll();
Log.i("AAA","是否有监听器触发过:" + UiDevice.getInstance(getInstrumentation()).hasAnyWatcherTriggered());
Log.i("AAA","电话监听器是否被触发过:" + UiDevice.getInstance(getInstrumentation()).hasWatcherTriggered("phone"));
UiDevice.getInstance(getInstrumentation()).removeWatcher("phone");///移除之后,后面的测试过程中有电话拨进来,不会调用监听器
}
其中代码testScroll();是在测试这个用例的时候监听是否有电话进入。这个测试用例只能用半人工的方法来测试,测试的时候建议先拨通电话,然后单独运行这个测试用例,在运行测试用例testScroll()的时候激活刚才被挂断的电话,程序通过语句UiObject call = new UiObject(new UiSelector().resourceId("com.android.dialer:id/primary_call_banner"));检查到屏幕中出现resourceId为"com.android.dialer:id/primary_call_banner"即认为电话被激活,然后通过语句 call_reject.click();(UiObject call_reject = new UiObject(new UiSelector().resourceId("com.android.dialer:id/floating_end_call_action_button"));//挂断按钮)即resourceId为"com.android.dialer:id/floating_end_call_action_button"的组件点击挂断电话。在程序结尾有这么两行语句:
Log.i("AAA","是否有监听器触发过:" + UiDevice.getInstance(getInstrumentation()).hasAnyWatcherTriggered());
Log.i("AAA","电话监听器是否被触发过:" + UiDevice.getInstance(getInstrumentation()).hasWatcherTriggered("phone"));
所以运行完毕通过查看Log日志来检查是否监听被触发。最后特别需要注意需要关闭监听,其语句是:
UiDevice.getInstance(getInstrumentation()).removeWatcher("phone");。