2014-10-01 4 views
14

Die app gibt die espresso-tests lokal weiter, ich meine damit direkt die geräte und genymotion-emulatoren. Wenn ich Jenkins verwende, um das Bild einer App zu erstellen. Die Espressotest sind nicht erfolgreich Ich bekomme diesen Fehler.testUI (Jenkins) mit 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

Von welchem ​​Gerät wird dieser Stapel zurückverfolgt? – yogurtearl

+0

das ist was jenkins sagt. – Alfaplus

+0

Diese Stack-Trace ist von Espresso läuft entweder auf einem Android-Emulator oder Android-Gerät. Betreiben Sie Emulatoren auf Ihrem Jenkins-Server? – yogurtearl

Antwort

10

Stacktrace bedeutet, dass Espresso nicht Anwendungsfenster finden. Während des Tests auf Emulatoren Bildschirm normalerweise hinter Screen Lock versteckt. Sie müssen Code verwenden, um ScreenLock programmgesteuert zu deaktivieren. Der bequemste Weg, um den Bildschirm zu entsperren, ist die Verwendung von Robotium. Es hat die solo.unlockScreen() -Methode. Ich habe es in die setUp() - Methode zum Testen des Lebenszyklus eingefügt.

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

+2

Zusätzlich zu der Antwort von scytale können Sie auch ein einfaches Beispiel für die von Ihnen vorgeschlagene Implementierung angeben. – g00dy

1

Die Lösung ist eine benutzerdefinierte Testläufer erstellen um den Bildschirm zu entsperren und eine Wake Sperre zu starten, bis die Tests durchgeführt werden.

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

Dann AndroidManifest.xml Ihrer Tests und fügen Sie die notwendigen Berechtigungen:

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

nicht Ihre build.gradle bearbeiten Vergessen Sie die neue testInstrumentationRunner Klasse zu verwenden.

Source

+0

Diese Lösung verwendet veraltete Methoden und Konstanten. Könnten Sie eine Alternative anbieten? – MeLine

0

Aus meiner Sicht müssen Sie Ihren Jenkins Job in der folgenden Art und Weise organisieren: vor Espresso Tests laufen (ich nehme an, Sie connectedAndroidTest in einer gradle Post-Build-Aktion gibt oder etwas davon haben) Fügen Sie eine Post-Build-Aktion hinzu, um das App-Paket zu deinstallieren, und eine weitere, um das App-Testpaket zu deinstallieren. Beispiel: com.example.mypackage.debug und com.example.mypackage.debug.test. Dies ist eine gute Möglichkeit, die App auf Ihrem Smartphone/Emulator zu aktualisieren, damit Espresso seine Magie nutzen kann.

Vergewissern Sie sich auch, dass die Option Immer aktiviert in den Entwicklertools aktiviert ist (je nach Gerät, unter Einstellungen haben Sie Entwickleroptionen oder Untermenü Developer Tools).

Wenn nichts davon funktioniert, bedeutet das, dass Sie irgendwo in Ihrem Jenkins-Job ein Problem mit der Reihenfolge der Aktionen haben und geklärt werden müssen. Für mich hat die Deinstallation der Pakete mir geholfen, das System von all den Dingen zu reinigen, die mit meiner App zu tun haben.

Hoffentlich wird es auch für Sie arbeiten.

Wenn nicht, bitte schreiben Kommentar und ich werde Ihnen helfen.

Viel Glück!

0

Ich empfehle mit Test-Butler, Animation zu deaktivieren und Bildschirm während des Testens zu entsperren.

+0

Test-Butler kann nur für Emulatoren verwendet werden, daher ist es eine gute Idee, wenn Sie einen Emulator verwenden, um Ihre Tests durchzuführen. Wenn Sie auf echten Geräten testen, würde ich "UiAutomator" vorschlagen. – carvaq