2011-11-03 8 views
15

Sto cercando di aggiungere finalmente i test dell'interfaccia utente alla mia applicazione Android, per aumentare la copertura (tutti i miei altri livelli sono stati testati correttamente, quindi tutti i miei bug ora provengono dall'interfaccia utente ...) Ho iniziato a usare ActivityInstrumentationTestCase2 come la mia classe base per i test delle unità di emulazione, e le cose semplici sono facili da controllare e funzionano bene.Test Android: come controllare una finestra di dialogo viene visualizzata sullo schermo? (utilizzando ActivityInstrumentationTestCase2)

Ma ora, sto provando a controllare che una finestra di dialogo appaia come previsto, e non so come farlo.

La mia prova:

public void testOpensAboutDialogWhenAboutButtonClicked() { 
    final MyActivity activity = getActivity(); 
    final Instrumentation instrumentation = getInstrumentation(); 

    final Button aboutButton = (Button) activity.findViewById(R.id.about); 
    TouchUtils.clickView(this, aboutButton); 

    // how to test for the AboutDialog? 
} 

Ora la mia finestra non dispone di un ID, quindi non può ottenere un puntatore ad esso utilizzando findViewById. E 'stato creato utilizzando le classi di build disponibili:

final AlertDialog about = new AlertDialog.Builder(parent) 
      .setTitle(parent.getString(R.string.about_title)) 
      .setCancelable(true) 
      .setIcon(R.drawable.skull) 
      .... 

Tutte le idee, o puntatori a tutorial?

EDIT: Per rispondere Jens commento, io sono non utilizzando le finestre di dialogo gestiti, solo la creazione del AlertDialog e mostrando con .Show()

+0

Si stanno utilizzando finestre di dialogo gestite? – Jens

+0

@Jens, in realtà non lo sono, non sapevo nemmeno di loro ... Ho appena letto su di loro, e questo potrebbe aiutare a risolvere il mio problema in effetti ... (Questo mi insegnerà a saltare le esercitazioni ...) Ci proverò stasera. Se lo fa, per favore scrivi una risposta in modo che io possa darti la taglia;) – Guillaume

+0

Posso darti una risposta adeguata tra i due. – Jens

risposta

19

Dal momento che si sta già utilizzando ActivityInstrumentationTestCase2 si dovrebbe iniziare a utilizzare Robotium - che semplificherà il test molto.

Per il vostro caso è facile come questo (se si conosce il titolo previsto o qualcos'altro vagamente unico sulla tua finestra):

public void testSomeRandomSentence() { 
    Solo solo = new Solo(getInstrumentation(), getActivity()); 
    getInstrumentation().waitForIdleSync(); 
    // Now do whatever you need to do to trigger your dialog. 

    // Let's assume a properly lame dialog title. 
    assertTrue("Could not find the dialog!", solo.searchText("My Dialog Title")); 
} 
+0

Interessante. Lo guarderò. – Guillaume

+0

Va bene, questo sembra promettente, sicuramente la strada da percorrere per me. Congratulazioni, hai vinto la taglia! – Guillaume

+1

Quindi questo non funzionava per me quando si utilizza Robotium. Penso che il problema fosse che stavo usando una finestra di dialogo vecchio stile (al contrario di un 'DialogFragment') e in qualche modo questo non era connesso alla gerarchia della vista nello stesso modo in modo che' solo.searchText (..) 'non potesse trovare esso. Ho risolto questo problema usando un 'DialogFragment' e usando Robotiums' solo.waitForFragmentByTag (...) 'metodo - che ora funziona benissimo :) – Dori

1

dopo l'assegnazione id per Toast a setup() per

toast = (Toast)activity.findViewById(..........); 

creare testcase() {

ViewAsserts.assertOnScreen(toasts.getRootView(), toast.getRootView()); 
//pass if toast is visible on screen 

}

+0

Grazie per la risposta, ma non è un Toast, è un AlertDialog, e l'intero punto della mia domanda era che non ha un id, quindi non posso usare findViewById, e non riesco a ottenere un riferimento a il dialogo – Guillaume

0

aggiungere un getter al dialogo come:

public AlertDialog get_aboutbox() 
{ 
    return this.about; 
} 

quindi la soluzione per il test:

public void testOpensAboutDialogWhenAboutButtonClicked() { 
    final MyActivity activity = getActivity(); 

    assertNotNull("aboutbox is null",activity.get_aboutbox()); 
    final Instrumentation instrumentation = getInstrumentation(); 

    final Button aboutButton = (Button) activity.findViewById(R.id.about); 
    TouchUtils.clickView(this, aboutButton); 

    assertTrue("About Button didn't displayed the Dlg", 
       activity.get_aboutbox().isShowing()); 
} 
Problemi correlati