Intereting Posts
Заменить ListView с помощью RecyclerView Платформа L представляет собой предварительный просмотр и требует манифеста приложения, чтобы установить minSdkVersion в 'L' Как открыть программу SearchView программно? Apache Commons Codec с Android: не удалось найти метод Как получить RegistrationID с помощью GCM в android IllegalStateException: контент был использован Google Calendar Api для Android Как передать значение с одной HTML-страницы на другую с помощью JavaScript? Диалог пользовательского прогресса со скругленным поворотом изображения с помощью AsynTask Как получить доступ к представлениям оригинальной активности из созданной фоновой службы Динамические меню в NavigationView Диалоги / AlertDialogs: как «блокировать выполнение» во время диалога вверх (стиль .NET) Kotlin Coroutines правильный путь в Android Отключить встроенную проверку орфографии на сэндвиче с мороженым Как программно изменить тайм-аут экрана?

TestUI (Дженкинс) с использованием эспрессо

Приложение проходит тесты эспрессо локально, я имею в виду прямо к устройствам и эмуляторам genymotion. Когда я использую Jenkins для создания образа приложения. Тест эспрессо не увенчался успехом. Я получаю эту ошибку.

Дженкинс:

java.lang.RuntimeException: Waited for the root of the view hierarchy to have window focus and not be requesting layout for over 10 seconds. If you specified a non default root matcher, it may be picking a root that never takes focus. Otherwise, something is seriously wrong. Selected Root: Root{application-window-token=android.view.ViewRootImpl$W@536a97d4, window-token=android.view.ViewRootImpl$W@536a97d4, has-window-focus=false, layout-params-type=1, layout-params-string=WM.LayoutParams{(0,0)(fillxfill) sim=#100 ty=1 fl=#1810100 pfl=0x8 wanim=0x103028f}, decor-view-string=DecorView{id=-1, visibility=VISIBLE, width=800, height=1184, has-focus=true, has-focusable=true, has-window-focus=false, is-clickable=false, is-enabled=true, is-focused=false, is-focusable=false, is-layout-requested=false, is-selected=false, root-is-layout-requested=false, has-input-connection=false, x=0.0, y=0.0, child-count=1}} . All Roots: Root{application-window-token=android.view.ViewRootImpl$W@536a97d4, window-token=android.view.ViewRootImpl$W@536a97d4, has-window-focus=false, layout-params-type=1, layout-params-string=WM.LayoutParams{(0,0)(fillxfill) sim=#100 ty=1 fl=#1810100 pfl=0x8 wanim=0x103028f}, decor-view-string=DecorView{id=-1, visibility=VISIBLE, width=800, height=1184, has-focus=true, has-focusable=true, has-window-focus=false, is-clickable=false, is-enabled=true, is-focused=false, is-focusable=false, is-layout-requested=false, is-selected=false, root-is-layout-requested=false, has-input-connection=false, x=0.0, y=0.0, child-count=1}} at com.google.android.apps.common.testing.ui.espresso.base.RootViewPicker.get(RootViewPicker.java:84) at com.google.android.apps.common.testing.ui.espresso.ViewInteractionModule.provideRootView(ViewInteractionModule.java:51) at com.google.android.apps.common.testing.ui.espresso.ViewInteractionModule$$ModuleAdapter$ProvideRootViewProvidesAdapter.get(ViewInteractionModule$$ModuleAdapter.java:187) at com.google.android.apps.common.testing.ui.espresso.ViewInteractionModule$$ModuleAdapter$ProvideRootViewProvidesAdapter.get(ViewInteractionModule$$ModuleAdapter.java:151) at com.google.android.apps.common.testing.ui.espresso.base.ViewFinderImpl.getView(ViewFinderImpl.java:52) at com.google.android.apps.common.testing.ui.espresso.ViewInteraction$2.run(ViewInteraction.java:141) at java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:442) at java.util.concurrent.FutureTask$Sync.innerRun(FutureTask.java:305) at java.util.concurrent.FutureTask.run(FutureTask.java:137) at android.os.Handler.handleCallback(Handler.java:615) at android.os.Handler.dispatchMessage(Handler.java:92) at android.os.Looper.loop(Looper.java:137) at android.app.ActivityThread.main(ActivityThread.java:4745) at java.lang.reflect.Method.invokeNative(Native Method) at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:786) at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:553) at dalvik.system.NativeStart.main(Native Method) 

Solutions Collecting From Web of "TestUI (Дженкинс) с использованием эспрессо"

Stacktrace означает, что Espresso не может найти окно приложения. Во время тестирования на экране эмуляторов обычно скрывается за блокировкой экрана. Вам нужно использовать некоторый код, чтобы программно отключить ScreenLock. Самый удобный способ разблокировки экрана – использовать Robotium. У него есть метод solo.unlockScreen (). Я поместил его в метод setUp () тестирования жизненного цикла.

Ссылки: https://github.com/RobotiumTech/robotium/blob/master/robotium-solo/src/main/java/com/robotium/solo/Solo.java

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

 public class TestRunner extends android.support.test.runner.AndroidJUnitRunner { private PowerManager.WakeLock mWakeLock; @Override public void callApplicationOnCreate(Application app) { // Unlock the screen KeyguardManager keyguard = (KeyguardManager) app.getSystemService(Context.KEYGUARD_SERVICE); keyguard.newKeyguardLock(getClass().getSimpleName()).disableKeyguard(); // Start a wake lock PowerManager power = (PowerManager) app.getSystemService(Context.POWER_SERVICE); mWakeLock = power.newWakeLock(PowerManager.FULL_WAKE_LOCK | PowerManager.ACQUIRE_CAUSES_WAKEUP | PowerManager.ON_AFTER_RELEASE, getClass().getSimpleName()); mWakeLock.acquire(); super.callApplicationOnCreate(app); } @Override public void onDestroy() { mWakeLock.release(); super.onDestroy(); } } 

Затем AndroidManifest.xml ваших тестов и добавьте необходимые разрешения:

 <uses-permission android:name="android.permission.DISABLE_KEYGUARD"/> <uses-permission android:name="android.permission.WAKE_LOCK"/> 

Не забудьте отредактировать свой build.gradle чтобы использовать новый класс testInstrumentationRunner .

Источник

С моей точки зрения, вам нужно организовать свою работу Jenkins следующим образом: перед запуском тестов Espresso (я полагаю, вы подключилиAndroidTest в действие post-build градиента там или что-то вроде этого), добавьте действие после сборки для удаления Пакет приложения и еще один, чтобы удалить тестовый пакет приложения. Пример: com.example.mypackage.debug и com.example.mypackage.debug.test. Это хороший способ обновить приложение в вашем смартфоне / эмуляторе, чтобы Espresso использовал свою магию.

Также убедитесь, что у вас включена опция «Всегда включено» в Инструментах разработчика (в зависимости от устройства, в разделе «Настройки» есть параметры разработчика или подменю «Инструменты разработчика»).

Если это не работает, это означает, что где-то в вашей работе Jenkins у вас есть какой-то порядок действий и нужно уточнить. Для меня удаление пакетов помогло мне очистить систему от всех вещей, связанных с моим приложением.

Надеюсь, это сработает и для вас.

Если нет, напишите комментарий, и я помогу вам.

Удачи!

Я предлагаю использовать Test-Butler , чтобы отключить анимацию и разблокировать экран во время тестирования.