TouchUtils.clickView()在单元测试中不适用于SlidingDrawer Button

时间:2012-03-16 17:44:09

标签: android unit-testing android-widget

我正在尝试为我的应用程序实现自动化测试。

我在视图中有滑动抽屉,触摸时打开,里面是一个按钮。 我想做的是触摸滑动抽屉打开它,触摸按钮内部并关闭滑动抽屉再次接触它。

以下是我的测试代码( ActivityInstrumentationTestCase2

ToggleButton insideBtn = (ToggleButton) mActivity.findViewById(R.id.sliding_btn);
Button drawerBtn = (Button) mActivity.findViewById(R.id.drawer_btn);
TouchUtils.tapView(this,drawerBtn); 
TouchUtils.tapView(this, insideBtn);
TouchUtils.tapView(this, drawerBtn);
...some assertion ...

我发现此代码有时有效,有时则无效。问题是触摸后抽屉没有打开导致 insideBtn 无法触及。

所以我尝试了这段代码:

ToggleButton insideBtn = (ToggleButton) mActivity.findViewById(R.id.sliding_btn);
Button drawerBtn = (Button) mActivity.findViewById(R.id.drawer_btn);
SlidingDrawer drawer = (SlidingDrawer) mActivity.findViewById(R.id.drawer);
while(!drawer.isOpened()) {
    TouchUtils.tapView(this,drawerBtn);
}   
TouchUtils.tapView(this, insideBtn);
TouchUtils.tapView(this, drawerBtn);
...some assertion ...

但结果是,有时当测试工作时,它会在第一时间工作,因此不需要循环。但是当它不工作时,循环工作直到无穷大 - 没有触摸导致抽屉被打开。

您是否有任何想法如何编写此测试以可靠地工作?

1 个答案:

答案 0 :(得分:1)

我找到了解决方案。错误是用于打开SlidingDrawer的错误事件选择。

Android文档说SlidingDrawer是一个由两个子视图组成的组件:句柄,用户 DRAGS ...

因此需要使用 TouchUtils.dragView()方法而不是 TouchUtils.tapView()

这是一个有效的例子:

ToggleButton insideBtn = (ToggleButton) mActivity.findViewById(R.id.sliding_btn);
Button drawerBtn = (Button) mActivity.findViewById(R.id.drawer_btn);
TouchUtils.dragViewToTop(this,drawerBtn); 
TouchUtils.tapView(this, insideBtn);
TouchUtils.dragViewToBottom(this,mActivity,drawerBtn);
...Some assertion...