2015-04-28 8 views
18

Utilizzo l'Espresso per eseguire test dell'interfaccia utente sulla mia app. Ho un frammento con una mappa e visualizzo alcuni elementi su di esso che ricevo tramite una chiamata al mio back-end.Utilizzo dell'espresso per il test dell'unità Google Maps

Quando clicco su un marcatore, sto facendo alcune cose UI

C'è un modo che io possa fare unit testing sulla mia mappa con caffè espresso?

+0

Per 'Google Maps Espresso test', si prega di controllare [qui] (https://code.google.com/p/android-test-kit/wiki/EspressoSamples#Matching_data_using_onData_and_a_custom_ViewMatcher) – bjiang

+0

Potrebbe per favore darmi un rapido esempio di un clic su un indicatore? – user2230304

+0

Certo, guarda [qui] (https://github.com/jbj88817/GoogleMap-InfoWindow-android) e [qui] (https://github.com/jbj88817/GoogleMapExample-android) al mio github – bjiang

risposta

44

Risposta breve: Con l'espresso non è davvero possibile. Una soluzione potrebbe essere quella di utilizzare UIAutomator: https://developer.android.com/tools/testing-support-library/index.html#UIAutomator https://developer.android.com/training/testing/ui-testing/uiautomator-testing.html

Quindi è necessario:

1) aggiungere le dipendenze Gradle:

dependencies { 
androidTestCompile 'com.android.support.test:runner:0.2' 
androidTestCompile 'com.android.support.test:rules:0.2' 
androidTestCompile 'com.android.support.test.uiautomator:uiautomator-v18:2.1.1' } 

2) Assicurati di aggiungere almeno titolo al marcatori anche se non lo stai usando.

3) il test, il codice è smth come questo:

UiDevice device = UiDevice.getInstance(getInstrumentation()); 
UiObject marker = device.findObject(new UiSelector().descriptionContains("marker title")); 
marker.click(); 

Spiegazione:

GoogleMap genera interfaccia utente e rende anche più accessibili i contenuti cioè mappa può essere visto come un albero di accessibilità informazioni sul nodo.

Questo albero è un albero di visualizzazione virtuale, non rappresenta l'albero di visualizzazione reale. Ci arriveremo più tardi

Per impostazione predefinita, il contenuto Descrizione della mappa è "Google Map" e quello dei marker è "{markerTitle}. {MarkerSnippet}".

Allora la domanda è così perché non utilizzare l'espresso:

onView(withContentDescription("marker title. ")).perform(click()); ?

Perché non lo troverà, però:

onView(withContentDescription("Google Map")).perform(click()); 

funzionano bene.

Quindi, come mai UIAutomator funziona e l'Espresso no?

Perché utilizzano alberi di visualizzazione diversi.

UIAutomator utilizza l'albero delle informazioni sul nodo di accessibilità fornite da AccessibilityService, mentre Espresso utilizza la gerarchia di viste e quindi elabora tutti i figli di qualsiasi ViewGroup. Le informazioni sul nodo di accessibilità e la gerarchia della vista possono o meno mappare uno a uno. In questo caso

OnView (withContentDescription ("Google Map"))

non trova un ViewGroup ma un TextureView, che non è noto per avere figli in modo Espresso non può sapere ciò che è disegnato in là .

Voilà! :)

+8

Grazie, la risposta è molto chiara. Sono molto sorpreso di qualcosa di essenziale come il test delle mappe non è nativamente possibile con Espresso. – user2230304

+1

Funziona bene !, anche se non funziona quando eseguo tutti i test con ./gradlew connectedAndroidTest, deve essere eseguito come un singolo test –

+0

credo che il problema non sarebbe con questo approccio piuttosto il modo in cui si esegue tutto i test. Se mi fornisci un problema con maggiori dettagli, sarei felice di aiutarti :) – djodjo