2014-10-01 16 views
14

L'app sta passando i test del caffè espresso localmente, intendo dire direttamente ai dispositivi e agli emulatori di genomotion. Quando uso Jenkins per costruire l'immagine di un'applicazione. Il test del caffè espresso non ha esito positivo. Ricevo questo errore.testUI (Jenkins) usando l'espresso

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{[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

Da quale dispositivo è questa traccia di stack? – yogurtearl

+0

è quello che dice Jenkins. – Alfaplus

+0

Questa traccia dello stack proviene da Espresso che funziona su un emulatore Android o su un dispositivo Android. Stai eseguendo emulatori sul tuo server Jenkins? – yogurtearl

risposta

10

Stacktrace significa che Espresso finestra di applicazione non riesce a trovare. Durante il test sullo schermo degli emulatori solitamente nascosto dietro Screen Lock. È necessario utilizzare un codice per disattivare ScreenLock a livello di codice. Il modo più comodo per sbloccare lo schermo è usare Robotium. Ha il metodo solo.unlockScreen(). L'ho inserito nel metodo setUp() per testare il ciclo di vita.

vicini: https://github.com/RobotiumTech/robotium/blob/master/robotium-solo/src/main/java/com/robotium/solo/Solo.java

+2

Oltre alla risposta di scytale, puoi anche fornire un semplice esempio dell'implementazione che stai suggerendo. – g00dy

1

La soluzione è quella di creare un corridore test personalizzato per sbloccare lo schermo e avviare un blocco scia fino a quando i test sono fatti.

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(); 
    } 
} 

Poi AndroidManifest.xml dei vostri test e aggiungere le autorizzazioni necessarie:

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

Non dimenticare di modificare il vostro build.gradle per utilizzare la nuova classe di testInstrumentationRunner.

Source

+0

Questa soluzione utilizza alcuni metodi e costanti deprecati. Potresti fornire qualche alternativa? – MeLine

0

Dal mio punto di vista, è necessario organizzare il vostro lavoro Jenkins nel seguente modo: prima di eseguire i test Espresso (suppongo avete connectedAndroidTest in un Gradle un'azione di post-generazione lì o qualcosa di simile) , aggiungi un'azione post-build per disinstallare il pacchetto dell'app e un altro per disinstallare il pacchetto di test dell'app. Esempio: com.example.mypackage.debug e com.example.mypackage.debug.test. Questo è un buon modo per aggiornare l'app sul tuo smartphone/emulatore, in modo che Espresso usi la sua magia.

Accertarsi inoltre di avere l'opzione Sempre attiva in Strumenti per sviluppatori attivata (a seconda del dispositivo, in Impostazioni sono disponibili opzioni di sviluppo o sottomenu Strumenti di sviluppo).

Se nessuno di questi lavori, significa che da qualche parte nel tuo lavoro Jenkins hai qualche problema di ordine di azione e devono essere chiariti. Per me la disinstallazione dei pacchetti mi ha aiutato a pulire il sistema di tutte le cose relative alla mia app.

Speriamo che funzionerà anche per te.

In caso contrario, si prega di scrivere un commento e io ti aiuterò.

Buona fortuna!

0

Suggerisco di utilizzare Test-Butler, per disabilitare l'animazione e sbloccare lo schermo durante il test.

+0

Test-Butler può essere utilizzato solo per gli emulatori, quindi è una buona idea se si sta utilizzando un emulatore per eseguire i test. Se stai provando su dispositivi reali, suggerirei 'UiAutomator'. – carvaq