Androidx:如何在UI测试(Espresso)中测试滑块?

6

如何在滑块上执行动作(移动光标)?

如何检查滑块的值?

是否存在现有的函数可供使用?

滑块长这样:

<com.google.android.material.slider.Slider
            android:id="@+id/sliderRating"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:stepSize="1"
            android:valueFrom="1.0"
            android:valueTo="5.0" />

Espresso检查: onView(withId(R.id.sliderRating)).check( -> 待办事项 <- )

1个回答

10

要做到这一点很容易创建几个方法。

以下是我创建的方法:

fun withValue(expectedValue: Float): Matcher<View?> {
    return object : BoundedMatcher<View?, Slider>(Slider::class.java) {
        override fun describeTo(description: Description) {
            description.appendText("expected: $expectedValue")
        }

        override fun matchesSafely(slider: Slider?): Boolean {
            return slider?.value == expectedValue
        }
    }
}

fun setValue(value: Float): ViewAction {
    return object : ViewAction {
        override fun getDescription(): String {
            return "Set Slider value to $value"
        }

        override fun getConstraints(): Matcher<View> {
            return ViewMatchers.isAssignableFrom(Slider::class.java)
        }

        override fun perform(uiController: UiController?, view: View) {
            val seekBar = view as Slider
            seekBar.value = value
        }
    }
}

第一项是自定义视图匹配器,用于测试Slider是否具有特定的值;第二项是自定义视图操作,用于设置新值。
使用它们的一个简单的测试示例,只是为了了解它们如何工作:
@Test
fun testSlider() {
    onView(withId(R.id.sliderRating)).check(matches(withValue(1.0F)))

    onView(withId(R.id.sliderRating)).perform(setValue(2.0F))

    onView(withId(R.id.sliderRating)).check(matches(withValue(2.0F)))
}

这个测试首先检查滑块是否具有值1.0,然后将其值更改为2.0,并使用匹配器检查该值现在是否为2.0。

我有Kotlin代码,但如果需要Java,它可以很容易地转换(Android Studio可以完成)。由于问题未标记语言,我不知道你需要哪个,下次请标记。


1
太棒了!!! 非常非常有用!非常感谢 @jeprubio - Jesse Lima
我刚刚测试了!运行得很好。我稍微改进了代码,使其更具可重用性。这使得可以更轻松地对任何滑块进行断言。 :Dfun assertSlider(@IdRes sliderId: Int, initialValue: Float, onChangedValue: Float) { onView(withId(sliderId)).check(matches(withValue(initialValue))) onView(withId(sliderId)).perform(setValue(onChangedValue)) onView(withId(sliderId)).check(matches(withValue(onChangedValue))) }然后,我只需从任何测试中进行调用: assertSlider(R.id.sliderViewId, 50.0f, 200.0f) - Jesse Lima

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接