Androidx: как протестировать слайдер в тестах пользовательского интерфейса (эспрессо)?

Как я могу выполнять действия на слайдере (перемещать курсор)?

Как я могу проверить значение слайдера?

Существуют ли какие-либо существующие функции для этого?

Слайдер выглядит так:

<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" />

И чек на эспрессо: onView(withId(R.id.sliderRating)).check( -> TODO <- )

5
0
1 246
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Для этого легко создать пару методов.

Вот что у меня есть:

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 может это сделать). Поскольку вопрос не помечен языком, я не знаю, какой из них вам нужен, отметьте его в следующий раз.

Прекрасный!!! Очень очень полезно! Большое спасибо @jeprubio

Jesse Lima 11.12.2021 21:41

Я только что протестировал! Прекрасно работает. Я сделал небольшое улучшение, чтобы сделать код более пригодным для повторного использования. Это упрощает выполнение утверждения на любом слайдере. :D fun assertSlider(@IdRes sliderId: Int, initialValue: Float, onChangedValue: Float) { onView(withId(sliderId)).check(matches(withValue(initialValue‌​e))) onView(withId(sliderId)).perform( setValue(onChangedValue)) onView(withId(sliderId)).check(matches(withValue(onChangedVa‌​lue))) } Затем я просто вызываю из любого теста: assertSlider(R.id.sliderViewId, 50.0f, 200.0f)

Jesse Lima 11.12.2021 22:00

Другие вопросы по теме