2015-01-26 21 views
11

Lo scenario è quando l'utente fa clic sul pulsante "Download", i dati (una musica/un'immagine ecc.) Iniziano a essere scaricati da Internet. Al termine del download, il pulsante cambia il testo dell'etichetta in "Apri". L'utente quindi fa clic su quel pulsante "Apri". Quello che ho fatto sofar è:Come utilizzare Espresso Idling Resource

onView(allOf(withId(R.id.button),withText("Download"))).check(matches(isClickable())).perform(click()); 
try { 
    Thread.sleep(delayedTime); 
} catch (InterruptedException e) { 
    e.printStackTrace(); 
} 
onView(allOf(withId(R.id.button),withText("Open"))).check(matches(isClickable())).perform(click()); 

A volte il test passa, a volte non lo fa. Il motivo a volte fallisce è "No views in hierarchy found matching: (with id: something:id/button and with text: is "Open"). E so che usare Thread.sleep in Espresso è anche una cattiva pratica. Ho letto su Espresso's Idling Resource, ma per me non ha senso e non so come posso applicarlo in questo caso particolare.

+0

Per ThreadPools, provare a utilizzare questo: http://luongbui.com/thread-pool-idlingresource-for-espresso/ Ho messo un esempio completo per mostrare come utilizzare anche il mio IdlingResource, basta registrarlo e annullarlo in il codice di prova Intendiamoci, avete bisogno della stessa istanza del ThreadPool che state usando nel codice di produzione. Il modello di fabbrica o Dagger è altamente consigliato. – luong

risposta

28

Le risorse attualmente inattive sono i punti più difficili dell'Espresso.

È necessario implementarlo se nel test è necessario attendere/sincronizzare con un'attività di background asincrona. Per impostazione predefinita, Espresso attende che le operazioni dell'interfaccia utente nella coda dei messaggi correnti vengano elaborate e che AsyncTasks predefiniti (sincronizzati con il pool di thread AsyncTask predefinito) vengano completati prima di passare alla successiva operazione di test. Si prega di esaminare questo per AsyncTasks. Tuttavia, se si avvia un altro thread, ad esempio la comunicazione con alcuni servizi Web, è necessario utilizzare IdlingResource.

Qualsiasi thread.sleep che potrebbe essere necessario è un segnale che potrebbe essere necessario una risorsa inattiva.

Ora su come scrivere una risorsa inattiva. Lo si può facilmente fare sviluppando il codice perché ora come stanno facendo questo punto di valutazione.

E si suppone che sia qualcosa di simile:

public class DownloadIdlingResource extends BaseIdlingResource { ....} 

Si suppone di definire quando questa risorsa non è attivo o non .....

Il test, che voleva dire che Espresso ha bisogno di aspettare questa risorsa inattiva, che dovrebbe definire durante l'inizializzazione della classe di test questa risorsa inattiva (setUp(), ecc.) o attivarla quando necessario. Significa che hai qualcosa da aspettare ma non è ancora attivato. Ad esempio, la risorsa di download inattivo potrebbe avere un listener per impostare la risorsa inattiva su non idle (setIdle(false)) quando il download viene avviato e ripristinato inattivo al termine (setIdle(true)). L'Espresso sta proseguendo con tutti gli altri membri del personale se tutte le risorse inutilizzate sono inattive (nulla da attendere per essere completato). I dettagli di implementazione della risorsa inattiva dipendono fortemente dalle implementazioni dell'applicazione.

Che cosa potrebbe essere detto a proposito del minimo delle risorse in generale:

1) isIdleNow() implementare la logica quando la risorsa è inattivo

2) registerIdleTransitionCallback saranno chiamati dal Espresso quando la risorsa è registrato e vi darà a ResourceCallback.

3) Quando la risorsa passa da occupato a inattivo, in pratica si ottiene la richiamata dall'attività in background al termine dell'operazione (i dati della mappa sono stati scaricati o il download è stato annullato) è necessario .

4) In getName() è necessario restituire il nome della risorsa utilizzata per la registrazione.

Fare attenzione a non avere deadlock come risorse inattive. C'è un timeout per le risorse inattive. Il test potrebbe essere interrotto dal messaggio che spiega cosa è male con la risorsa inattiva.

Mi dispiace non essere in grado di scrivere esempi più specifici ma in realtà dipende dall'implementazione dell'applicazione.