2010-01-18 6 views
16

Ich arbeite gerade an einer automatisierten Testsuite für unsere Android-App und stehe in Schwierigkeiten, bis die Aktivitäten vollständig geladen sind. Ich kann getActivity aufrufen, aber nur weil es die Aktivität anzeigt, die ich in meinem Test sehen möchte, scheint das nicht immer zu bedeuten, dass die Komponenten der Aktivität bereit sind (voll geladen). Das Durchsehen der Activity-API hat nichts ergeben, und andere Methoden scheinen zu invasiv und haben den ursprünglichen Zustand des Tests beeinträchtigt. Weiß jemand, ob es eine Möglichkeit gibt, die App oder die VM zu fragen, wenn die aktuelle Aktivität geladen ist?Wie können Sie feststellen, wann eine Android-Aktivität geladen wurde?

Antwort

0

Möglicherweise gibt es einen eleganteren Weg, aber haben Sie versucht, am Ende Ihrer OnCreate() - Methode einen Booleschen Wert zu setzen?

+2

Nach onCreate gibt es onStart und onResume ... –

+0

Das ist eleganter als meine aktuelle "touch alles touchable/lese alles lesbar" -Methode, aber bedeutet onCreate wirklich, dass es wirklich erstellt wurde? Betrachtet man den Prozessablauf für Aktivitäten, scheint onResume sogar besser zu sein. Ich werde beides versuchen und sehen, ob ich noch Probleme habe. Danke für die schnelle Inspiration! Ich werde euch alle die Ergebnisse wissen lassen. Bis dahin, wenn jemand anders einen Weg findet, den ActivityManager (oder irgendetwas anderes) dafür abzufragen, lass es mich wissen. – Derrick

+0

Verwenden Sie OnCreate nicht sicher –

1

Wenn Sie eine setUp() Methode, wie dies in Ihrem Testfall erstellen ActivityInstrumentationTestCase2<MyActivity>

@Override 
protected void setUp() throws Exception { 
    super.setUp(); 

    final MyActivity activity = getActivity(); 

    tv1 = (EditNumber)activity.findViewById(resId1); 
    tv2 = (EditNumber)activity.findViewById(resId2); 
} 

Ihre Aktivität erstreckt werden voll funktionsfähig und das Layout geladen, durch die Tatsache, in diesem Fall gezeigt, dass Sie die Ansichten zugreifen können und sein Inhalt

@SmallTest 
public void testSimpleCreate() { 
    final MyActivity activity = getActivity(); 
    assertNotNull(activity); 

    assertNotNull(tv1); 
    assertEquals("mystr1", tv1.getText().toString()); 
    assertNotNull(tv1); 
    assertEquals("mystr2", tv2.getText().toString()); 
} 
+0

Dieser Vorschlag ist der Kern meines Problems. Ich kann die Anwendung derzeit nach der aktuellen Aktivität abfragen, aber selbst nachdem die aktuelle Aktivität mit der übereinstimmt, auf die ich warte, schlägt der Aufruf von findViewById häufig fehl (scheinbar, weil die Aktivität zwar ganz oben im Aktivitätsstapel liegt, aber nicht alle Views sind geladen.) Unsere unmittelbare Lösung war es, den Testcode in den Schlaf zu setzen, aber das ist auch fragil, da unser Schlaf von Zeit zu Zeit nicht müde genug ist. – Derrick

+0

Obwohl ich in dem Logcat-Protokoll sehe, dass der ActivityManager eingibt, um zu sagen, dass die angegebene Aktivität jetzt "angezeigt" wird. Ich weiß nicht, ob das bedeutet, dass die Aktivität jetzt vollständig geladen und bereit ist, missbraucht zu werden oder nicht, und ich weiß auch nicht, wie ich diese Informationen programmatisch bekommen soll. Vielen Dank für Ihre Hilfe. Bitte lassen Sie mich wissen, wenn ich etwas aus dem Beispiel von dtmilano verpasse (es wäre nicht das erste Mal!) – Derrick

+0

Nach 'setContentView()' sollte alles in Ihrer Ansichtshierarchie zugänglich sein. Ich würde sagen, die einzige Ausnahme sind Ansichten, die asynchron geladen werden, wie z. B. einzelne Zeilen einer 'ListView', die an eine Datenquelle gebunden sind. –

3

Wie ich in a comment, Ihre Ansicht Hierarchie erwähnt soll in onCreate() nach Ihrem Anruf zu setContentView() früh arbeiten. Ich hatte nie Probleme wie das mit irgendeiner Aktivität oder Testklasse.

Ich bin nicht sicher, dass dies für diesen speziellen Fall keine Hilfe ist, aber im Allgemeinen können Sie feststellen, wann die UI-Ereigniswarteschlange leer ist Anruf getInstrumentation().waitForIdleSync(). Dies wird blockiert, bis keine UI-Ereignisse mehr verarbeitet werden.

+0

Ich denke, unser Problem war mit Toast-Elementen, die einen Schraubenschlüssel in das Timing werfen. Ihr zweiter Vorschlag ist etwas, auf das ich näher eingehen möchte, aber es sieht so aus, als müssten wir uns von der InstrumentationTestCase-Klasse erweitern. Gibt es einen anderen Weg, um Nutzen aus der Instrumentierung zu ziehen, ohne dass Sie davon profitieren? – Derrick

+0

Wo wurden deine Toasts genannt? Welche Klasse erweitern Sie im Moment? –

+0

Unsere Toasts werden meistens aus Aktivitäten durch anonyme innere Klassen aufgerufen, die eine abstrakte asynchrone Aufgabenklasse für einfache Fehler-/Erfolgsnachrichten implementieren.Unsere Testklassen erstrecken sich von einer Elternklasse, die von Junit und Hamcrest ohne Erweiterung importiert, und ich denke, wir hatten gehofft, es auf diese Weise loszulassen. Ich sehe jedoch keine andere Möglichkeit, eine Verbindung zur Instrumentierungsfunktion herzustellen. Wenn es da ist, lass es mich wissen. Andernfalls, wenn es eine andere Möglichkeit gibt, Toast zu verwenden, die verhindert, dass dieses Problem verursacht wird, wäre das auch gut. Danke:) – Derrick