Espresso утверждает, что в этом нет необходимости Thread.sleep();
, но мой код не работает, если я его не включу. Я подключаюсь к IP. Во время подключения отображается диалоговое окно прогресса. Мне нужно sleep
дождаться закрытия диалогового окна. Это мой тестовый фрагмент, в котором я его использую:
IP.enterIP(); // fills out an IP dialog (this is done with espresso)
//progress dialog is now shown
Thread.sleep(1500);
onView(withId(R.id.button).perform(click());
Я попробовал этот код с и безThread.sleep();
, но он говорит ,R.id.Button
, не существует. Единственный способ заставить его работать - это спать.
Кроме того, я попытался заменить Thread.sleep();
такими вещами, какgetInstrumentation().waitForIdleSync();
и все еще не повезло.
Это единственный способ сделать это? Или я что-то упускаю?
Заранее спасибо.
android
testing
android-espresso
Чад Бингем
источник
источник
Ответы:
На мой взгляд, правильным подходом будет:
И тогда схема использования будет такой:
источник
Спасибо AlexK за отличный ответ. Есть случаи, когда вам нужно немного задержать код. Он не обязательно ждет ответа сервера, но может ждать завершения анимации. У меня лично проблема с Espresso idolingResources (я думаю, что мы пишем много строк кода для простой вещи), поэтому я изменил способ работы AlexK на следующий код:
Таким образом, вы можете создать
Delay
класс и поместить в него этот метод, чтобы легко получить к нему доступ. Вы можете использовать его в своем классе Test таким же образом:onView(isRoot()).perform(waitFor(5000));
источник
Thread.sleep()
Я наткнулся на эту ветку, когда искал ответ на аналогичную проблему, когда я ждал ответа сервера и менял видимость элементов на основе ответа.
Хотя вышеприведенное решение определенно помогло, я в конце концов нашел этот отличный пример от chiuki и теперь использую этот подход в качестве основного, когда я жду действий, которые произойдут во время периодов простоя приложения.
Я добавил ElapsedTimeIdlingResource () в свой собственный класс утилит, теперь могу эффективно использовать его в качестве альтернативы, подходящей для эспрессо, и теперь использование приятное и чистое:
источник
I/TestRunner: java.lang.NoClassDefFoundError: fr.x.app.y.testtools.ElapsedTimeIdlingResource
ошибку Любая идея. Я использую Proguard, но с отключенной обфускацией.-keep
оператор для классов, которые не обнаруживаются, чтобы убедиться, что ProGuard не удаляет их как ненужные. Подробнее здесь: developer.android.com/tools/help/proguard.html#keep-codeДумаю, проще добавить такую строчку:
Ожидает заданное количество миллисекунд (uptimeMillis) перед возвратом. Подобно sleep (long), но не генерирует InterruptedException; События interrupt () откладываются до следующей прерываемой операции. Не возвращается, пока не истечет как минимум указанное количество миллисекунд.
источник
Вы можете просто использовать методы Бариста:
BaristaSleepActions.sleep(2000);
BaristaSleepActions.sleep(2, SECONDS);
Barista - это библиотека, которая обертывает Espresso, чтобы избежать добавления всего кода, необходимого для принятого ответа. А вот ссылка! https://github.com/SchibstedSpain/Barista
источник
Thread.sleep()
. Сожалею! Это было в некоторых из первых видеороликов, которые Google сделал об эспрессо, но я не помню, в каком ... это было несколько лет назад. Сожалею! :·) Ой! Редактировать! Я выложил ссылку на видео в PR, который открыл три года назад. Проверьте это! github.com/AdevintaSpain/Barista/pull/19Это похоже на этот ответ, но использует тайм-аут вместо попыток и может быть связан с другими ViewInteractions:
Использование:
источник
Я новичок в программировании и эспрессо, поэтому, хотя я знаю, что хорошим и разумным решением является использование холостого хода, я еще недостаточно умен для этого.
Пока я не стану более осведомленным, мне все еще нужно, чтобы мои тесты как-то запускались, поэтому сейчас я использую это грязное решение, которое делает несколько попыток найти элемент, останавливается, если находит его, а если нет, ненадолго засыпает и запускается снова, пока не будет достигнуто максимальное количество попыток (максимальное количество попыток до сих пор было около 150).
Я использую это во всех методах поиска элементов по идентификатору, тексту, родительскому элементу и т. Д .:
источник
findById(int itemId)
метод вернет элемент (который может быть NULL) независимо от того,waitForElementUntilDisplayed(element);
возвращает ли он значение true или false .... так что это не нормальноIdlingResource
s недостаточно для меня из-за 5-секундной детализации частоты опроса (слишком большой для моего варианта использования). Принятый ответ для меня тоже не работает (объяснение того, почему уже включено в длинную ленту комментариев этого ответа). Спасибо за это! Я взял вашу идею и сделал собственное решение, и оно работает как шарм.Espresso создан, чтобы избежать вызовов sleep () в тестах. Ваш тест не должен открывать диалоговое окно для ввода IP-адреса, это должно быть ответственностью тестируемого действия.
С другой стороны, ваш UI-тест должен:
Тест должен выглядеть примерно так:
Espresso ожидает завершения всего, что происходит как в потоке пользовательского интерфейса, так и в пуле AsyncTask, прежде чем выполнять ваши тесты.
Помните, что ваши тесты не должны делать ничего, что является ответственностью вашего приложения. Он должен вести себя как «хорошо информированный пользователь»: пользователь, который нажимает, проверяет, что что-то отображается на экране, но на самом деле знает идентификаторы компонентов.
источник
Вы должны использовать ресурс Espresso Idling Resource, это предлагается в этой CodeLab
Пример асинхронного вызова от Presenter
Зависимости
Для androidx
Официальное репо: https://github.com/googlecodelabs/android-testing
Пример IdlingResource: https://github.com/googlesamples/android-testing/tree/master/ui/espresso/IdlingResourceSample
источник
Хотя я считаю, что для этого лучше всего использовать ресурсы ожидания ( https://google.github.io/android-testing-support-library/docs/espresso/idling-resource/ ), вы, вероятно, можете использовать это как запасной вариант:
а затем назовите его в своем коде, например:
вместо того
Это также позволяет вам добавлять тайм-ауты для действий просмотра и просмотра утверждений.
источник
return new TimedViewInteraction(Espresso.onView(viewMatcher));
наreturn new TimedViewInteraction(Espresso.onView(viewMatcher).check(matches(isDisplayed())));
Моя утилита повторяет запускаемое или вызываемое выполнение до тех пор, пока не пройдет без ошибок или не выдаст throwable после тайм-аута. Он отлично подходит для тестов эспрессо!
Предположим, что последнее взаимодействие с просмотром (нажатие кнопки) активирует некоторые фоновые потоки (сеть, база данных и т. Д.). В результате должен появиться новый экран, и мы хотим проверить его на следующем шаге, но мы не знаем, когда новый экран будет готов для тестирования.
Рекомендуемый подход - заставить ваше приложение отправлять в тест сообщения о состояниях потоков. Иногда мы можем использовать встроенные механизмы, такие как OkHttp3IdlingResource. В других случаях вам следует вставлять фрагменты кода в разные места источников вашего приложения (вы должны знать логику приложения!) Только для поддержки тестирования. Более того, мы должны отключить все ваши анимации (хотя это часть пользовательского интерфейса).
Другой подход - ожидание, например SystemClock.sleep (10000). Но мы не знаем, сколько ждать, и даже большие задержки не могут гарантировать успеха. С другой стороны, ваш тест продлится долго.
Мой подход - добавить временное условие для просмотра взаимодействия. Например, мы проверяем, что новый экран должен появиться в течение 10000 мс (таймаут). Но мы не ждем и не проверяем его так быстро, как хотим (например, каждые 100 мс). Конечно, мы блокируем тестовый поток таким образом, но обычно это как раз то, что нам нужно в таких случаях.
Это источник моего класса:
https://gist.github.com/alexshr/ca90212e49e74eb201fbc976255b47e0
источник
Это помощник, который я использую в Kotlin для тестов Android. В моем случае я использую longOperation для имитации ответа сервера, но вы можете настроить его для своих целей.
источник
Я добавлю свой способ сделать это в микс:
Вызывается так:
Вы можете добавить параметры, такие как максимальное количество итераций, длина итерации и т. Д., В функцию suspendUntilSuccess.
Я по-прежнему предпочитаю использовать ресурсы на холостом ходу, но когда тесты срабатывают, например, из-за медленной анимации на устройстве, я использую эту функцию, и она хорошо работает. Конечно, он может зависать до 5 секунд, как и перед тем, как выйти из строя, поэтому он может увеличить время выполнения ваших тестов, если успешное действие никогда не увенчается успехом.
источник