android.support.test.espresso.PerformException: ошибка при выполнении «загрузки данных адаптера» при просмотре

Я использую Espresso для тестирования представления списка, которое появляется, когда я ищу элемент (например, автозаполнение). Представление списка не появляется, пока пользователь не введет что-то в SearchView. т. е. я устанавливаю ListView в View.VISIBLE только тогда, когда пользователь ввел что-то в SearchView

Я получаю эту ошибку, когда пытаюсь щелкнуть текст в представлении списка. android.support.test.espresso.PerformException: Error performing 'load adapter data' on view 'with id:'. Использование onData не сработало.

Добавление искусственной задержки работает, но я не уверен, что это плохая практика, поскольку кажется, что это противоречит цели таких методов, как onData и т. д.

Что я пробовал:

Мой код

Этот код работает, но я бы предпочел не вводить искусственную задержку.

public pickSuggestion(int index){

    /** artificial delay to allow list to appear. 
    This works but I shouldn't have to do this right? **/

    SystemClock.sleep(1000);

    onData(anything())
        .inAdapterView(withId(R.id.list))
        .atPosition(index)
        .onChildView(withId(R.id.mTextView))
        .perform(click());
}



Ответы (2)


Добавление искусственной задержки работает, но я не уверен, что это плохая практика, поскольку кажется, что это противоречит цели таких методов, как onData и т. д.

Ваш error имеет ограничение Espresso. Этот фреймворк должен работать в потоке пользовательского интерфейса, и он «ждет», пока не станет бездействующим. Он не ждет загрузки данных адаптера, а ожидает получения ресурса бездействия.

Проверьте: http://dev.jimdo.com/2014/05/09/wait-for-it-a-deep-dive-into-espresso-s-idling-resources/

Справочник по IdlingResource: https://developer.android.com/reference/android/support/test/espresso/IdlingResource.html

Документация IdlingResource: https://google.github.io/android-testing-support-library/docs/espresso/idling-resource/index.html

CountingIdlingResource: https://developer.android.com/reference/android/support/test/espresso/idling/CountingIdlingResource.html

Такой код, как SystemClock.sleep(1000) или Thread.sleep(1000), является плохой практикой, потому что лучшим устройствам не требуется столько времени, а более старым требуется больше, поэтому ваш код может быть ненадежным, а не быстрым и гибким.

Решение состоит в том, чтобы создать собственный Espresso IdlingResource, чтобы сообщать Espresso, когда он может выполнять тесты без потери данных и времени.

Надеюсь, это поможет.

person piotrek1543    schedule 14.09.2016

Получил то же сообщение об ошибке Ошибка при выполнении «загрузки данных адаптера» при просмотре, ни один из ответов из этих сообщений не помог мне.

Тестирование RecyclerView на наличие данных с помощью Espresso
Espresso onData Ошибка при выполнении "загрузки данных адаптера" при просмотре
Эспрессо. Ошибка при выполнении "загрузки данных адаптера"

В итоге я использовал тестовый рекордер Espresso UI в Android Studio. . Выберите Выполнить в верхнем раскрывающемся меню, затем нажмите Записать тест эспрессо. Он попросит вас выбрать устройство для запуска, после запуска приложения вручную выполнить тесты пользовательского интерфейса, которые вы хотите выполнить, и добавить утверждения, когда это необходимо. Нажмите ОК, когда закончите. Он сгенерирует для вас тестовый файл пользовательского интерфейса.

Код, сгенерированный для нажатия элемента в RecyclerView, выглядит следующим образом. Тяжелая работа здесь — это метод Matcher childAtPosition() В начале теста он спит в течение 10 секунд, чтобы убедиться, что все загружено, обычно это не занимает 10 секунд, вы можете уменьшить его до 2 секунд. Альтернативой является использование Espresso IdlingResource, как предложил @piotrek1543, но это требует добавления вмешательств (специфических кодов смешивания тестов) в производственный код для проведения тестирования.

@LargeTest
@RunWith(AndroidJUnit4.class)
public class MainActivityTest {

    @Rule
    public ActivityTestRule<MainActivity> mActivityTestRule = new ActivityTestRule<>(MainActivity.class);

    @Test
    public void mainActivityTest() {
        // Added a sleep statement to match the app's execution delay.
        // The recommended way to handle such scenarios is to use Espresso idling resources:
        // https://google.github.io/android-testing-support-library/docs/espresso/idling-resource/index.html
        try {
            Thread.sleep(10000);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }

        ViewInteraction recyclerView = onView(
                allOf(withId(R.id.recycler_view_list),
                        childAtPosition(
                                withClassName(is("android.support.constraint.ConstraintLayout")),
                                0)));
        recyclerView.perform(actionOnItemAtPosition(0, click()));
    }

    private static Matcher<View> childAtPosition(
            final Matcher<View> parentMatcher, final int position) {

        return new TypeSafeMatcher<View>() {
            @Override
            public void describeTo(Description description) {
                description.appendText("Child at position " + position + " in parent ");
                parentMatcher.describeTo(description);
            }

            @Override
            public boolean matchesSafely(View view) {
                ViewParent parent = view.getParent();
                return parent instanceof ViewGroup && parentMatcher.matches(parent)
                        && view.equals(((ViewGroup) parent).getChildAt(position));
            }
        };
    }
}

Примечание. Код, сгенерированный тестовым рекордером пользовательского интерфейса Espresso, также не идеален, он работает большую часть времени, но не на 100%.

person s-hunter    schedule 28.11.2017