微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

AndroidStudio 运行录制的 Espresso 测试失败

如何解决AndroidStudio 运行录制的 Espresso 测试失败

我正在尝试在 AndroidStudio 4.2 中录制浓缩咖啡测试。录音似乎工作正常。但是,当我尝试运行记录的测试时,它们运行了大约一半,直到出现活动切换,然后它失败了,因为找不到视图,并且我一直收到 NoMatchingViewException

我在第一个活动中点击了一堆,这触发了第二个活动的加载。在运行测试时,尝试在第二个活动中查找视图永远不会奏效。

@Test
fun firstRecordedtest() {
    val materialButton = onView(
        allOf(
            withId(R.id.key1Button),withText("1"),childAtPosition(
                childAtPosition(
                    withClassName(`is`("android.widget.LinearLayout")),0
                ),3
            ),isdisplayed()
        )
    )
    materialButton.perform(click())
    
    // Activity switches here
    // The following never works

    val matcher: Matcher<View> = allOf(
        withId(R.id.tab_contacts),withContentDescription("Contacts"),childAtPosition(
            childAtPosition(
                withId(R.id.navigation_view),0
            ),1
        ),isdisplayed()
    )
    val bottomNavigationItemView = onView(matcher)
    bottomNavigationItemView.perform(click())
    
}

我尝试放置不同类型的计时器等以等待视图加载,但它要么卡住,要么失败。我也试过 this answer 没有运气。

我错过了什么吗?即使浓缩咖啡记录仪允许,切换活动后也无法继续测试吗?

解决方法

浓缩咖啡不需要计时器。它将等到 Activity 完全加载,您可以阅读它here

其次,我自己没有使用过录音机,因为它会产生很多噪音。例如下面的代码

val matcher: Matcher<View> = allOf(
        withId(R.id.tab_contacts),withContentDescription("Contacts"),childAtPosition(
            childAtPosition(
                withId(R.id.navigation_view),0
            ),1
        ),isDisplayed()
    )

我在这里假设点击了 navigation_view 中的一个按钮。 可以简单地替换为

onView(withId(R.id.tab_contacts)).perform(click())

现在,谈到您的测试失败的原因,似乎 materialButton 点击正在执行一些异步工作或执行某种动画。 您可以像这样在 build.gradle 中禁用动画

android {
    ...
    testOptions {
        animationsDisabled = true
    }
    ...
}

如果您阅读 here,我总结一下,espresso 应该等待执行任何操作(在您的情况下,单击 tab_contacts)直到消息队列为空,它将与异步任务同步同样,但是 espresso 不知道其他异步长时间运行的操作。因此,如果您正在使用一些异步操作,您应该考虑使用空闲资源来进行可靠的测试。

但是如果你想快速破解,你可以使用这个睡眠方法:

    private fun sleep(millis: Long): ViewAction {
        return object : ViewAction {
            override fun getConstraints(): Matcher<View> {
                return isRoot()
            }

            override fun getDescription(): String {
                return "Going to sleep for " + millis + "milliseconds"
            }

            override fun perform(uiController: UiController,view: View) {
                uiController.loopMainThreadForAtLeast(millis)
            }
        }
    }

并像这样调用上面的方法:

    onView(isRoot())
                .perform(sleep(
                        TimeUnit.SECONDS.toMillis(10)
                ))
,

Espresso 的观点有时很不稳定。您是否尝试使用第二个活动中的另一个视图,或者删除导致测试失败的视图并在没有它的情况下运行测试?

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。