1

Я использую Espresso для проверки списка, которое появляется, когда я ищу элемент (например, автозаполнение). Просмотр списка не появляется, пока пользователь не набрал что-то в SearchView. то есть я установил ListView в View.VISIBLE только тогда, когда пользователь набрал что-то в SearchView.android.support.test.espresso.PerformException: Ошибка при выполнении «данных адаптера нагрузки» на вид

. . .

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

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

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

  • Я пробовал посмотреть, что делает тестовый магнитофон Espresso, но когда я использую код тестового регистратора, я получаю ошибку выше. Я считаю, что это связано с тем, что рекордер вводит некоторую задержку.

  • Я прочитал эти StackOverflow вопросы, но они не решают мою проблему:

Мой код

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

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, когда он может выполнять тесты без потери данных и времени.

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

0

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

Testing RecyclerView if it has data with Espresso
Espresso onData Error performing 'load adapter data' on view
Espresso. Error performing 'load adapter data'

Я в конечном итоге с помощью Espresso UI test recorder в Android Studio. Перейдите к Запустите в верхнем раскрывающемся меню, затем нажмите Запишите эспрессо-тест. Он попросит вас выбрать устройство для запуска, как только приложение будет запущено, вручную сделайте тесты ui, которые вы хотите выполнить, и добавьте утверждения, когда это необходимо. Hit OK когда сделано. Он будет генерировать тестовый файл UI для вас.

Код, созданный для , нажав на элемент на 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 UI не является совершенным либо, она работает большую часть времени, но не 100%