将 UI 线程与依赖于工作线程事件的已分派视图状态同步?
Synchronizing UI thread with dispatched View states dependant on worker thread events?
上面有一个Activity和一个按钮。任务是通过白盒测试 Activity 结果行为 "Button CLICK -> Button GONE -> Activity PAUSE -> Activity RESUME" 对按钮可见状态的影响。
天真的实现会导致 Activity 状态不一致,从而导致错误的测试输出:
// worker thread
TouchUtils.clickView(this, mButton);
...
// ui thread
instrumentation.callActivityOnStop(mActivity);
instrumentation.callActivityOnResume(mActivity);
assertTrue(View.GONE == mButton.getVisibility());
两种 glympse 方法均未成功:
1) 在 TouchUtils.clickView()
执行后为主线程添加睡眠并不能完全解决问题,而是对经验 UI 超时持续时间产生额外的依赖性。
2) 通过 AsyncTask 中的 onPostExecute()
同步触摸事件和随后的 Activity 生命周期事件调用会导致测试意外失败。
一般或专门为 Android 测试框架设计的 worker-ui 同步是否有规范或至少可行的解决方案?
必须使用 Instrumentation.class 中的 runOnMainSync()
通过 Android 测试框架工具同步 UI 和工作线程事件:
// worker thread
TouchUtils.clickView(this, mButton);
instrumentation.runOnMainSync(new Runnable() {
@Override
public void run() {
instrumentation.callActivityOnStop(mActivity);
instrumentation.callActivityOnResume(mActivity);
assertTrue(View.GONE == mButton.getVisibility());
}
});
但是,如果有任何其他建议或一般性(与 Android 测试框架无关)指南的答案,我们将不胜感激。
注:更多与主线程同步的专用工具在官方best practices for testing.
中有介绍
上面有一个Activity和一个按钮。任务是通过白盒测试 Activity 结果行为 "Button CLICK -> Button GONE -> Activity PAUSE -> Activity RESUME" 对按钮可见状态的影响。
天真的实现会导致 Activity 状态不一致,从而导致错误的测试输出:
// worker thread
TouchUtils.clickView(this, mButton);
...
// ui thread
instrumentation.callActivityOnStop(mActivity);
instrumentation.callActivityOnResume(mActivity);
assertTrue(View.GONE == mButton.getVisibility());
两种 glympse 方法均未成功:
1) 在 TouchUtils.clickView()
执行后为主线程添加睡眠并不能完全解决问题,而是对经验 UI 超时持续时间产生额外的依赖性。
2) 通过 AsyncTask 中的 onPostExecute()
同步触摸事件和随后的 Activity 生命周期事件调用会导致测试意外失败。
一般或专门为 Android 测试框架设计的 worker-ui 同步是否有规范或至少可行的解决方案?
必须使用 Instrumentation.class 中的 runOnMainSync()
通过 Android 测试框架工具同步 UI 和工作线程事件:
// worker thread
TouchUtils.clickView(this, mButton);
instrumentation.runOnMainSync(new Runnable() {
@Override
public void run() {
instrumentation.callActivityOnStop(mActivity);
instrumentation.callActivityOnResume(mActivity);
assertTrue(View.GONE == mButton.getVisibility());
}
});
但是,如果有任何其他建议或一般性(与 Android 测试框架无关)指南的答案,我们将不胜感激。
注:更多与主线程同步的专用工具在官方best practices for testing.
中有介绍