2015-06-02 20 views
24

MODIFICA: è stata aggiornata la descrizione e il messaggio di errore e sono state aggiunte alcune immagini. Ho ancora questo problema.Il test dell'espresso ha esito negativo con NoActivityResumedException spesso

Ho uno strano errore che si verifica più volte durante l'esecuzione di test del caffè espresso. Dopo un paio di test positivo esegue i test inizia in mancanza con le seguenti eccezioni:

06-23 13:04:48.438 info TestRunner failed: WhenNavigatingToReportsThenCorrectViewShouldBeShown(com.myapp.ui.views.MainActivityTest) 
06-23 13:04:48.439 info TestRunner ----- begin exception ----- 
06-23 13:04:48.441 info TestRunner android.support.test.espresso.NoActivityResumedException: No activities in stage RESUMED. Did you forget to launch the activity. (test.getActivity() or similar)? 
06-23 13:04:48.441 info TestRunner at dalvik.system.VMStack.getThreadStackTrace(Native Method) 
06-23 13:04:48.441 info TestRunner at java.lang.Thread.getStackTrace(Thread.java:580) 
06-23 13:04:48.441 info TestRunner at android.support.test.espresso.base.DefaultFailureHandler.getUserFriendlyError(DefaultFailureHandler.java:82) 
06-23 13:04:48.441 info TestRunner at android.support.test.espresso.base.DefaultFailureHandler.handle(DefaultFailureHandler.java:53) 
06-23 13:04:48.441 info TestRunner at android.support.test.espresso.ViewInteraction.runSynchronouslyOnUiThread(ViewInteraction.java:184) 
06-23 13:04:48.441 info TestRunner at android.support.test.espresso.ViewInteraction.doPerform(ViewInteraction.java:115) 
06-23 13:04:48.441 info TestRunner at android.support.test.espresso.ViewInteraction.perform(ViewInteraction.java:87) 
06-23 13:04:48.441 info TestRunner at com.myapp.ui.views.MainActivityTest.WhenNavigatingToReportsThenCorrectViewShouldBeShown(MainActivityTest.java:96) 
06-23 13:04:48.441 info TestRunner at java.lang.reflect.Method.invoke(Native Method) 
06-23 13:04:48.441 info TestRunner at java.lang.reflect.Method.invoke(Method.java:372) 
06-23 13:04:48.441 info TestRunner at org.junit.runners.model.FrameworkMethod$1.runReflectiveCall(FrameworkMethod.java:45) 
06-23 13:04:48.441 info TestRunner at org.junit.internal.runners.model.ReflectiveCallable.run(ReflectiveCallable.java:15) 
06-23 13:04:48.441 info TestRunner at org.junit.runners.model.FrameworkMethod.invokeExplosively(FrameworkMethod.java:42) 
06-23 13:04:48.441 info TestRunner at org.junit.internal.runners.statements.InvokeMethod.evaluate(InvokeMethod.java:20) 
06-23 13:04:48.441 info TestRunner at org.junit.internal.runners.statements.RunBefores.evaluate(RunBefores.java:28) 
06-23 13:04:48.441 info TestRunner at android.support.test.internal.statement.UiThreadStatement.evaluate(UiThreadStatement.java:55) 
06-23 13:04:48.441 info TestRunner at android.support.test.rule.ActivityTestRule$ActivityStatement.evaluate(ActivityTestRule.java:257) 
06-23 13:04:48.441 info TestRunner at org.junit.rules.RunRules.evaluate(RunRules.java:18) 
06-23 13:04:48.441 info TestRunner at org.junit.runners.ParentRunner.runLeaf(ParentRunner.java:263) 
06-23 13:04:48.441 info TestRunner at org.junit.runners.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRunner.java:68) 
06-23 13:04:48.441 info TestRunner at org.junit.runners.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRunner.java:47) 
06-23 13:04:48.441 info TestRunner at org.junit.runners.ParentRunner$3.run(ParentRunner.java:231) 
06-23 13:04:48.441 info TestRunner at org.junit.runners.ParentRunner$1.schedule(ParentRunner.java:60) 
06-23 13:04:48.441 info TestRunner at org.junit.runners.ParentRunner.runChildren(ParentRunner.java:229) 
06-23 13:04:48.441 info TestRunner at org.junit.runners.ParentRunner.access$000(ParentRunner.java:50) 
06-23 13:04:48.441 info TestRunner at org.junit.runners.ParentRunner$2.evaluate(ParentRunner.java:222) 
06-23 13:04:48.441 info TestRunner at org.junit.runners.ParentRunner.run(ParentRunner.java:300) 
06-23 13:04:48.441 info TestRunner at org.junit.runners.Suite.runChild(Suite.java:128) 
06-23 13:04:48.441 info TestRunner at org.junit.runners.Suite.runChild(Suite.java:24) 
06-23 13:04:48.441 info TestRunner at org.junit.runners.ParentRunner$3.run(ParentRunner.java:231) 
06-23 13:04:48.441 info TestRunner at org.junit.runners.ParentRunner$1.schedule(ParentRunner.java:60) 
06-23 13:04:48.441 info TestRunner at org.junit.runners.ParentRunner.runChildren(ParentRunner.java:229) 
06-23 13:04:48.441 info TestRunner at org.junit.runners.ParentRunner.access$000(ParentRunner.java:50) 
06-23 13:04:48.441 info TestRunner at org.junit.runners.ParentRunner$2.evaluate(ParentRunner.java:222) 
06-23 13:04:48.441 info TestRunner at org.junit.runners.ParentRunner.run(ParentRunner.java:300) 
06-23 13:04:48.441 info TestRunner at org.junit.runner.JUnitCore.run(JUnitCore.java:157) 
06-23 13:04:48.441 info TestRunner at org.junit.runner.JUnitCore.run(JUnitCore.java:136) 
06-23 13:04:48.441 info TestRunner at android.support.test.internal.runner.TestExecutor.execute(TestExecutor.java:54) 
06-23 13:04:48.441 info TestRunner at android.support.test.runner.AndroidJUnitRunner.onStart(AndroidJUnitRunner.java:228) 
06-23 13:04:48.441 info TestRunner at android.app.Instrumentation$InstrumentationThread.run(Instrumentation.java:1837) 
06-23 13:04:48.441 info TestRunner ----- end exception ----- 
06-23 13:04:48.443 info TestRunner finished: WhenNavigatingToReportsThenCorrectViewShouldBeShown(com.myapp.ui.views.MainActivityTest) 

ho una semplice applicazione con la navigazione di pagine appena contenenti testo, a questo punto, e il test deve passare a ogni pagina e identificare questo testo .

@RunWith(AndroidJUnit4.class) 
@LargeTest 
public class MainActivityTest { 

@Rule 
public ActivityTestRule<MainActivity> mActivityRule = new ActivityTestRule(MainActivity.class); 
private MainActivity mainActivity; 

@Before 
public void setActivity() { 
    mainActivity = mActivityRule.getActivity(); 
} 

@Test 
public void WhenNavigatingToReportsThenCorrectViewShouldBeShown() { 
    onView(allOf(withId(R.id.icon), hasSibling(withText(R.string.reports)))).perform(click()); 

    onView(withText("This is the Reports Activity.")).check(matches(isDisplayed())); 
    Spoon.screenshot(mainActivity, "main_view"); 
} 
} 

Questo errore si verifica solo sul dispositivo reale. Sul dispositivo emulato i test funzionano correttamente. Vedi le immagini qui sotto.

Tutti i test vengono eseguiti dallo script gradle, iniziando con la rimozione della precedente app e test api, prima di installarlo di nuovo. Per garantire un ambiente pulito. Il registro indica che la disinstallazione è stata eseguita correttamente. Quindi distribuire la nuova app e iniziare a eseguire i test. Adesso falliscono.

Se i test non sono riusciti, non è fino a quando non rimuovo manualmente l'app e il test api dal dispositivo che posso ottenere di nuovo test di successo. Ma solo per un po 'finché non si verificherà lo stesso errore.

Perché ottengo NoActivityResumedException, non riesco a trovare un buon esempio di cosa sia e quando si verifica.

Device overview with only physical device failing Failing tests

+1

Ho visto altri post in cui suggeriscono il passaggio di animazioni (nelle impostazioni degli sviluppatori). – Pnemonic

+0

hai trovato una soluzione? – piotrek1543

+0

Non è una soluzione chiara. Ma ho notato che spesso succede quando un popup della finestra di sistema. Anche quando l'attività si aspetta un risultato. Ho trovato un paio di risposte che potrebbero funzionare per alcuni problemi: ad esempio http://stackoverflow.com/questions/21703304/android-espresso-and-account-picker – peuhse

risposta

51

Ho avuto lo stesso problema. Questo accade quando lo schermo del dispositivo è spento. Accendere lo schermo dovrebbe risolvere il problema.

+0

http://stackoverflow.com/questions/19870771/android-espresso-wake-up-device-before-test-how-to-use-a-custom-manifest-for-t – enl8enmentnow

+0

che sarebbe di mi ha preso per sempre per capire - grazie prima ho iniziato a cancellare tutto e ricominciare da capo. – Nefariis

+0

L'opzione in Impostazioni sviluppatore per mantenere attivo lo schermo durante la ricarica aiuta davvero :-) –

6

È possibile riattivare il dispositivo prima di ogni test utilizzando Uiautomator.

@Before 
public void init(){ 
    UiDevice uiDevice = UiDevice.getInstance(InstrumentationRegistry.getInstrumentation()); 
    Point[] coordinates = new Point[4]; 
    coordinates[0] = new Point(248, 1520); 
    coordinates[1] = new Point(248, 929); 
    coordinates[2] = new Point(796, 1520); 
    coordinates[3] = new Point(796, 929); 
    try { 
     if (!uiDevice.isScreenOn()) { 
      uiDevice.wakeUp(); 
      uiDevice.swipe(coordinates, 10); 
     } 
    } catch (RemoteException e) { 
     e.printStackTrace(); 
    } 
} 
+1

Qual è lo scopo delle coordinate? –

+0

touche lo schermo in modo che non si spenga –

Problemi correlati