2014-10-01 3 views
14

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

Дженкинс:

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{[email protected], [email protected], 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{[email protected], [email protected], 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) 
+0

Какое устройство это трассировка стека? – yogurtearl

+0

вот что говорит дженкинс. – Alfaplus

+0

Эта трассировка стека из Espresso работает либо на эмуляторе Android, либо на устройстве Android. Вы используете эмуляторы на вашем сервере Jenkins? – yogurtearl

ответ

10

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

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

+2

Наверх ответа scytale - вы также можете представить простой пример реализации, которую вы предлагаете. – g00dy

1

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

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 класс.

Source

+0

В этом решении используются некоторые устаревшие методы и константы. Не могли бы вы предоставить какую-то альтернативу? – MeLine

0

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

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

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

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

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

Удачи вам!

0

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

+0

Test-Butler можно использовать только для эмуляторов, поэтому неплохо, если вы используете эмулятор для запуска тестов. Если вы тестируете на реальных устройствах, я бы предложил «UiAutomator». – carvaq