对于每秒重绘一次的视图,我如何解决AppNotIdleException?

时间:2018-05-23 19:55:43

标签: android kotlin wait android-espresso

我正在使用仪表图形测试Android应用程序,其中屏幕上的元素(仪表)每秒重绘一次。我的想法是点击一个开始按钮,仪表打开,当我点击一个停止按钮时,仪表关闭。

手动它运行正常,但是当我运行我的Espresso测试时,测试在我点击开始后挂起,因为应用程序从不闲置,因为它每秒重绘一次。正如所料,我得到:

android.support.test.espresso.AppNotIdleException:循环播放超过60秒的13452次迭代。以下空闲条件失败。

我在Android Developers docs中找到noActivity(),认为这可能会有所帮助,但我无法弄清楚如何正确使用它,也无法找到任何好的例子。停止按钮显然在页面上,但是这一步被绕过并直接进入tearDown(),它告诉我我没有正确使用它或者我不明白它在做什么:

    onView(withId(R.id.stop_button)).noActivity().perform()

那我该怎么做呢?是否有一种简单的方法可以告诉Espresso不使用空闲资源进行某项测试或部分测试?我是否需要编写一个闲置资源,说明何时找到停止按钮,应用程序是空闲的?还有其他方法可以丢失吗?

FWIW我使用的是Kotlin,但我也欢迎Java的答案,因为他们非常相似。谢谢!

1 个答案:

答案 0 :(得分:0)

在自定义视图中,检索系统设置ANIMATOR_DURATION_SCALE

private fun getAnimatorSpeed() = 
  if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN_MR1) {
  getAnimatorSpeedNew()
} else {
  getAnimatorSpeedOld()
}

@RequiresApi(Build.VERSION_CODES.JELLY_BEAN_MR1)
private fun getAnimatorSpeedNew() = Settings.Global.getFloat(
    context.contentResolver,
    Settings.Global.ANIMATOR_DURATION_SCALE,
    1f)

@Suppress("DEPRECATION")
private fun getAnimatorSpeedOld() = Settings.System.getFloat(
    context.contentResolver,
    Settings.System.ANIMATOR_DURATION_SCALE,
    1f)

当动画师速度为零时,禁用自定义视图中的重绘。在您熟悉它的同时,您可能需要调整动画以尊重系统动画师的速度。

在运行测试之前,请转到设置>将系统动画制作器速度设置为零。您设备上的开发者选项