Espresso-Intents to rozszerzenie Espresso, które umożliwia krótkie zamierzenia zamiarów wysyłane przez aplikacji w trakcie testowania. Jak Mockito, ale w przypadku intencji Androida.
Jeśli Twoja aplikacja przekazuje funkcje innym aplikacjom lub platformie, możesz użyć Espresso-intencje, które pozwalają skupić się na logice Twojej aplikacji, zakładając, że inne aplikacje lub platforma działa poprawnie. Dzięki Espresso-Intents i weryfikować intencje wychodzące, a nawet podać krótkie odpowiedzi zamiast odpowiedzi na rzeczywiste intencje.
Uwzględnij w projekcie intencje Espresso
W pliku app/build.gradle
aplikacji dodaj ten wiersz
dependencies
:
Odlotowe
androidTestImplementation 'androidx.test.espresso:espresso-intents:3.6.1'
Kotlin
androidTestImplementation('androidx.test.espresso:espresso-intents:3.6.1')
Espresso-Intents jest zgodne tylko z Espresso 2.1 i nowszym oraz 0.3+ Biblioteki testowe dla Androida, więc pamiętaj o zaktualizowaniu tych wierszy również:
Odlotowe
androidTestImplementation 'androidx.test:runner:1.6.1' androidTestImplementation 'androidx.test:rules:1.6.1' androidTestImplementation 'androidx.test.espresso:espresso-core:3.6.1'
Kotlin
androidTestImplementation('androidx.test:runner:1.6.1') androidTestImplementation('androidx.test:rules:1.6.1') androidTestImplementation('androidx.test.espresso:espresso-core:3.6.1')
Pisz reguły testowe
Zanim napiszesz test Espresso-Intents, skonfiguruj IntentsTestRule
. To jest
rozszerzenie klasy ActivityTestRule
i ułatwia korzystanie
Interfejsy API Espresso Intents w funkcjonalnych testach interfejsu użytkownika. Inicjowanie obiektu IntentsTestRule
Intencje Espresso przed każdym testem z adnotacjami @Test
i wersjami
Intencje Espresso po każdym teście.
Oto przykładowy fragment kodu (IntentsTestRule
):
Kotlin
@get:Rule val intentsTestRule = IntentsTestRule(MyActivity::class.java)
Java
@Rule public IntentsTestRule<MyActivity> intentsTestRule = new IntentsTestRule<>(MyActivity.class);
Dopasowanie
Espresso-Intents umożliwia przechwytywanie intencji wychodzących na podstawie określonych kryteriów, zdefiniowanych za pomocą funkcji Hamcrest Matchers. Hamcrest umożliwia:
- Użyj istniejącego dopasowywania intencji: najprostsza opcja, która powinna prawie zawsze być dostępna. być preferowane.
- Wdróż dopasowywanie intencji: najbardziej elastyczna opcja. Więcej informacji: dostępne w sekcji „Pisanie dopasowań niestandardowych”. w ciągu Samouczek dotyczący Hamcrest.
Espresso-Intents oferuje intended()
oraz metody intending()
do walidacji intencji
lub skrócenie czasu. Obie biorą obiekt Hamcrest Matcher<Intent>
jako
.
Ten fragment kodu pokazuje weryfikację intencji z dotychczasową intencją dopasowania pasujące do intencji wychodzącej uruchamiającej przeglądarkę:
Kotlin
assertThat(intent).hasAction(Intent.ACTION_VIEW) assertThat(intent).categories().containsExactly(Intent.CATEGORY_BROWSABLE) assertThat(intent).hasData(Uri.parse("www.google.com")) assertThat(intent).extras().containsKey("key1") assertThat(intent).extras().string("key1").isEqualTo("value1") assertThat(intent).extras().containsKey("key2") assertThat(intent).extras().string("key2").isEqualTo("value2")
Java
assertThat(intent).hasAction(Intent.ACTION_VIEW); assertThat(intent).categories().containsExactly(Intent.CATEGORY_BROWSABLE); assertThat(intent).hasData(Uri.parse("www.google.com")); assertThat(intent).extras().containsKey("key1"); assertThat(intent).extras().string("key1").isEqualTo("value1"); assertThat(intent).extras().containsKey("key2"); assertThat(intent).extras().string("key2").isEqualTo("value2");
Zweryfikuj intencje
Espresso-Intents rejestruje wszystkie intencje, które próbują uruchomić
aplikacji w trakcie testowania. Użycie metody intended()
, która jest podobna do
Mockito.verify()
, możesz twierdzić, że dana intencja została zauważona. Pamiętaj jednak:
Espresso-Intents nie wyklucza odpowiedzi na intencje, chyba że specjalnie skonfigurujesz
w tym celu.
Poniższy fragment kodu to przykładowy test, który weryfikuje, ale nie stosuje częściowej konfiguracji w odpowiedzi na wiadomości, intencję wychodzącą generującą uruchamiający zewnętrzny „telefon” aktywność:
Kotlin
@Test fun validateIntentSentToPackage() { // User action that results in an external "phone" activity being launched. user.clickOnView(system.getView(R.id.callButton)) // Using a canned RecordedIntentMatcher to validate that an intent resolving // to the "phone" activity has been sent. intended(toPackage("com.android.phone")) }
Java
@Test public void validateIntentSentToPackage() { // User action that results in an external "phone" activity being launched. user.clickOnView(system.getView(R.id.callButton)); // Using a canned RecordedIntentMatcher to validate that an intent resolving // to the "phone" activity has been sent. intended(toPackage("com.android.phone")); }
Stukanie
Przy użyciu metody intending()
, podobnej do metody Mockito.when()
, można
a w przypadku działań uruchomionych z użyciem tego fragmentu
startActivityForResult()
Jest to szczególnie przydatne w przypadku czynności wykonywanych na zewnątrz
ponieważ nie można manipulować interfejsem użytkownika w ramach działań zewnętrznych ani
kontrolować pole ActivityResult
zwrócone do testowanej aktywności.
Poniższe fragmenty kodu zawierają przykład
activityResult_DisplaysContactsPhoneNumber()
, który sprawdza, czy
użytkownik uruchamia „kontakt” aktywność w testowanej aplikacji, kontaktowy numer telefonu
wyświetlany jest numer:
Utwórz wynik, który będzie zwracany po uruchomieniu określonego działania. przykładowy test przechwytuje wszystkie intencje wysłane do „kontaktów” i kończy odpowiedzi z prawidłowym elementem
ActivityResult
, przy użyciu kodu wynikuRESULT_OK
Kotlin
val resultData = Intent() val phoneNumber = "123-345-6789" resultData.putExtra("phone", phoneNumber) val result = Instrumentation.ActivityResult(Activity.RESULT_OK, resultData)
Java
Intent resultData = new Intent(); String phoneNumber = "123-345-6789"; resultData.putExtra("phone", phoneNumber); ActivityResult result = new ActivityResult(Activity.RESULT_OK, resultData);
Poproś Espresso o podanie obiektu z wycinkiem w odpowiedzi na wszystkie wywołania „kontaktów” intencja:
Kotlin
intending(toPackage("com.android.contacts")).respondWith(result)
Java
intending(toPackage("com.android.contacts")).respondWith(result);
Sprawdź, czy działanie użyte do uruchomienia działania generuje oczekiwaną z kropką. W takim przypadku przykładowy test sprawdza, czy numer telefonu „123-345-6789” jest zwracany i wyświetlane, gdy „aktywność kontaktów” uruchomiono:
Kotlin
onView(withId(R.id.pickButton)).perform(click()) onView(withId(R.id.phoneNumber)).check(matches(withText(phoneNumber)))
Java
onView(withId(R.id.pickButton)).perform(click()); onView(withId(R.id.phoneNumber)).check(matches(withText(phoneNumber)));
Oto pełny test funkcji activityResult_DisplaysContactsPhoneNumber()
:
Kotlin
@Test fun activityResult_DisplaysContactsPhoneNumber() { // Build the result to return when the activity is launched. val resultData = Intent() val phoneNumber = "123-345-6789" resultData.putExtra("phone", phoneNumber) val result = Instrumentation.ActivityResult(Activity.RESULT_OK, resultData) // Set up result stubbing when an intent sent to "contacts" is seen. intending(toPackage("com.android.contacts")).respondWith(result) // User action that results in "contacts" activity being launched. // Launching activity expects phoneNumber to be returned and displayed. onView(withId(R.id.pickButton)).perform(click()) // Assert that the data we set up above is shown. onView(withId(R.id.phoneNumber)).check(matches(withText(phoneNumber))) }
Java
@Test public void activityResult_DisplaysContactsPhoneNumber() { // Build the result to return when the activity is launched. Intent resultData = new Intent(); String phoneNumber = "123-345-6789"; resultData.putExtra("phone", phoneNumber); ActivityResult result = new ActivityResult(Activity.RESULT_OK, resultData); // Set up result stubbing when an intent sent to "contacts" is seen. intending(toPackage("com.android.contacts")).respondWith(result); // User action that results in "contacts" activity being launched. // Launching activity expects phoneNumber to be returned and displayed. onView(withId(R.id.pickButton)).perform(click()); // Assert that the data we set up above is shown. onView(withId(R.id.phoneNumber)).check(matches(withText(phoneNumber))); }
Dodatkowe materiały
Jeśli chcesz dowiedzieć się więcej o używaniu Espresso-Intents w testach Androida, skontaktuj się z zespołem pomocy. poniższe zasoby.
Próbki
- IntentsPrimarySample:
Podstawowe wykorzystanie usług
intended()
iintending()
. - IntentsAdvancedSample: Symuluje użytkownika, który pobiera bitmapę za pomocą aparatu.