Espresso-Niyetleri

Espresso-Intents, Espresso'nun bir uzantısıdır. Test edilen uygulama tarafından gönderilen amaçların doğrulanmasını ve saplanmasını sağlar. Mockito'ya benzer ancak Android Intent'leri için kullanılır.

Uygulamanız işlevleri diğer uygulamalara veya platforma devrediyorsa diğer uygulamaların ya da platformun doğru şekilde çalışacağını varsayarak kendi uygulamanızın mantığına odaklanmak için Espresso-Intents'i kullanabilirsiniz. Espresso-Intents ile giden amaçlarınızı eşleştirebilir ve doğrulayabilir, hatta gerçek amaç yanıtları yerine sahte yanıtlar sağlayabilirsiniz.

Projenize Espresso-Intents'i dahil etme

Uygulamanızın app/build.gradle dosyasına dependencies içine aşağıdaki satırı ekleyin:

Groovy

androidTestImplementation 'androidx.test.espresso:espresso-intents:3.6.1'

Kotlin

androidTestImplementation('androidx.test.espresso:espresso-intents:3.6.1')

Espresso-Intents yalnızca Espresso 2.1+ ve Android test kitaplıklarının 0.3+ sürümüyle uyumludur. Bu nedenle, aşağıdaki satırları da güncellediğinizden emin olun:

Groovy

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')

Test kuralları yazma

Espresso-Intents testi yazmadan önce IntentsTestRule oluşturun. Bu, ActivityTestRule sınıfının bir uzantısıdır ve işlevsel kullanıcı arayüzü testlerinde Espresso-Intents API'lerinin kullanılmasını kolaylaştırır. IntentsTestRule, @Test ile açıklama eklenmiş her testten önce Espresso-Intents'i başlatır ve her test çalıştırmasından sonra Espresso-Intents'i serbest bırakır.

Aşağıdaki kod snippet'i bir IntentsTestRule örneğidir:

Kotlin

@get:Rule
val intentsTestRule = IntentsTestRule(MyActivity::class.java)

Java

@Rule
public IntentsTestRule<MyActivity> intentsTestRule =
    new IntentsTestRule<>(MyActivity.class);

Eşleşme

Espresso-Intents, Hamcrest Matchers kullanılarak tanımlanan belirli eşleşme ölçütlerine göre giden amaçları yakalama olanağı sunar. Hamcrest ile şunları yapabilirsiniz:

  • Mevcut bir amaç eşleştiriciyi kullanma: Neredeyse her zaman tercih edilmesi gereken en kolay seçenektir.
  • Kendi amaç eşleştiricinizi uygulama: En esnek seçenektir. Daha fazla bilgi için Hamcrest eğitimindeki "Özel eşleştiriciler yazma" başlıklı bölüme bakın.

Espresso-Intents, sırasıyla amaç doğrulama ve saplama için intended() ve intending() yöntemlerini sunar. Her ikisi de bağımsız değişken olarak bir Hamcrest Matcher<Intent> nesnesi alır.

Aşağıdaki kod snippet'i, tarayıcıyı başlatan giden bir intent ile eşleşen mevcut intent eşleştiricileri kullanan intent doğrulamasını gösterir:

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");

Amaçları doğrulama

Espresso-Intents, test edilen uygulamadan etkinlik başlatmaya çalışan tüm amaçları kaydeder. intended() yöntemini kullanarak (Mockito.verify() yöntemine benzer) belirli bir amaçın görüldüğünü onaylayabilirsiniz. Ancak Espresso-Intents, açıkça yapılandırmadığınız sürece amaçlara verilen yanıtları sahte olarak oluşturmaz.

Aşağıdaki kod snippet'i, harici bir "telefon" etkinliğini başlatan giden bir amaca yönelik yanıtları doğrulayan ancak saplamayan bir örnek testtir:

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"));
}

Stubbing

Mockito.when()'ye benzer olan intending() yöntemini kullanarak startActivityForResult() ile başlatılan etkinlikler için bir saplama yanıtı sağlayabilirsiniz. Bu özellik, özellikle harici etkinlikler için kullanışlıdır. Çünkü harici bir etkinliğin kullanıcı arayüzünü değiştiremez veya test edilen etkinliğe döndürülen ActivityResult'yı kontrol edemezsiniz.

Aşağıdaki kod snippet'lerinde, bir kullanıcının test edilen uygulamada "kişi" etkinliğini başlattığında kişinin telefon numarasının görüntülendiğini doğrulayan bir örnek activityResult_DisplaysContactsPhoneNumber() testi uygulanmaktadır:

  1. Belirli bir etkinlik başlatıldığında döndürülecek sonucu oluşturun. Örnek test, "kişiler"e gönderilen tüm niyetleri yakalar ve yanıtlarını ActivityResult ile doldurur. Sonuç kodu olarak RESULT_OK kullanılır.

    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);
  2. Espresso'ya, "contacts" amacının tüm çağrılarına yanıt olarak sahte sonuç nesnesi sağlaması talimatını verin:

    Kotlin

    intending(toPackage("com.android.contacts")).respondWith(result)

    Java

    intending(toPackage("com.android.contacts")).respondWith(result);
  3. Etkinliği başlatmak için kullanılan işlemin beklenen saplama sonucunu ürettiğini doğrulayın. Bu durumda, örnek test, "kişiler etkinliği" başlatıldığında "123-345-6789" telefon numarasının döndürülüp döndürülmediğini ve görüntülenip görüntülenmediğini kontrol eder:

    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)));

activityResult_DisplaysContactsPhoneNumber() testinin tamamı aşağıda verilmiştir:

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)));
}

Ek kaynaklar

Android testlerinde Espresso-Intents'i kullanma hakkında daha fazla bilgi için aşağıdaki kaynaklara bakın.

Örnekler