我在做一些 Espresso UI 测试时遇到了一个问题:我想禁用应用程序内的动画,这样我就不需要设置超时/需要等待动画完成。
在我的 android 设备上的开发人员选项中禁用窗口动画比例、过渡动画比例、动画师持续时间比例不会在使用 android 导航组件在片段之间导航时禁用动画。
动画的设置如下:
<action
android:id="@+id/confirmationAction"
app:destination="@id/confirmationFragment"
app:enterAnim="@anim/slide_in_right"
app:exitAnim="@anim/slide_out_left"
app:popEnterAnim="@anim/slide_in_left"
app:popExitAnim="@anim/slide_out_right" />
如何在运行浓缩咖啡 UI 测试时禁用此动画?
更新:
我遵循了谷歌的这个关于使用导航组件在片段之间导航的指南。
然后我查看了谷歌关于使用 Espresso 测试我的应用程序的指南,在第一个指南和第二个指南中,我发现第一点是通过开发人员选项禁用动画,因此我认为这是禁用动画的正确方法
我遇到了同样的问题,我能想到的最好的办法是以编程方式禁用导航动画,以防我正在运行测试:
fun getBuilderWithAdditionalNavOptions(): NavOptions.Builder {
val optionsBuilder = NavOptions.Builder()
if (inTest)
optionsBuilder
.setEnterAnim(0).setExitAnim(0)
.setPopEnterAnim(0).setPopExitAnim(0)
return optionsBuilder
}
其中inTest
是项目范围的变量,在您运行浓缩咖啡测试时设置为true
。
经过更多的研究,我发现 Espresso 在执行断言之前会自动等待 UI 线程上的所有动画完成。
通常,如果您使用普通动画,则无事可做。
如果你必须等待服务调用在 Espresso 测试中返回值,你可以编写一些代码来扩展 ViewInteraction 类。 在扩展类中,您可以执行 CHECK 方法并捕获任何错误。如果出现错误,您可以给出一个小的超时(20ms(,然后尝试使用 while 循环再次执行它。当 2-3 秒后您仍然有异常时,您可以抛出该异常