Espresso-Niyetleri

Espresso-Intents, test edilen uygulama tarafından gönderilen intentlerin doğrulanmasını ve saptırılmasını sağlayan bir Espresso uzantısıdır. Mockito'ya benzer, ancak Android Intent'leri içindir.

Uygulamanız işlevler için başka uygulamalara veya platforma yetki verirse diğer uygulamaların veya platformun düzgün ç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ştirip doğrulayabilir ve hatta gerçek amaç yanıtları yerine kaba yanıtlar sağlayabilirsiniz.

Projenize Espresso-Intent'leri dahil edin

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

Modern

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

Kotlin

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

Espresso-Intents yalnızca Espresso 2.1+ ve Android test kitaplıklarının 0.3 ve üstü sürümleriyle uyumludur. Bu nedenle bu satırları da güncellediğinizden emin olun:

Modern

androidTestImplementation 'androidx.test:runner:1.4.0'
androidTestImplementation 'androidx.test:rules:1.4.0'
androidTestImplementation 'androidx.test.espresso:espresso-core:3.4.0'

Kotlin

androidTestImplementation('androidx.test:runner:1.4.0')
androidTestImplementation('androidx.test:rules:1.4.0')
androidTestImplementation('androidx.test.espresso:espresso-core:3.4.0')

Test kurallarını yaz

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ımını kolaylaştırır. IntentsTestRule, her testten önce @Test ek açıklamasıyla Espresso-Intents'i başlatır ve her test çalıştırmasından sonra Espresso-Intents'i yayınlar.

Aşağıdaki kod snippet'i, 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 Eşleştiriciler kullanılarak tanımlanan belirli eşleşme ölçütlerine göre giden niyetlere müdahale etme olanağı sağlar. Hamcrest aşağıdakileri yapmanıza olanak tanır:

  • Mevcut bir intent eşleyiciyi kullanma: Neredeyse her zaman tercih edilmesi gereken en kolay seçenektir.
  • Kendi amaç eşleştiricinizi uygulama: En esnek seçenektir. Hamcrest eğitimindeki "Özel eşleyiciler yazma" başlıklı bölümde daha fazla ayrıntı bulabilirsiniz.

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

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

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ğrulayın

Espresso-Intents, test edilen uygulamadan etkinlik başlatmaya çalışan tüm amaçları kaydeder. Mockito.verify() benzeri intended() yöntemini kullanarak belirli bir amacın görüldüğünü doğrulayabilirsiniz. Ancak Espresso-Intents, bunu yapacak şekilde açıkça yapılandırmadığınız sürece niyetlere verilen yanıtları saptırmaz.

Aşağıdaki kod snippet'i, harici bir "telefon" etkinliği başlatan giden bir intent olan yanıtları doğrulayan ancak saptırmayan örnek bir 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"));
}

Saplama

Mockito.when() ile benzer olan intending() yöntemini kullanarak startActivityForResult() ile başlatılan etkinliklere kod yanıtı sağlayabilirsiniz. Bu, harici bir etkinliğin kullanıcı arayüzünü değiştiremeyeceğiniz veya test edilen etkinliğe döndürülen ActivityResult öğesini kontrol edemediğiniz için özellikle harici etkinlikler için kullanışlıdır.

Aşağıdaki kod snippet'lerinde, kullanıcı test edilen uygulamada "kişi" etkinliği başlattığında iletişim için kullanılacak telefon numarasının gösterildiğini doğrulayan bir örnek activityResult_DisplaysContactsPhoneNumber() testi kullanılmaktadır:

  1. Sonucu belirli bir etkinlik başlatıldığında döndürülecek şekilde oluşturun. Örnek test, "kişiler"e gönderilen tüm Intent'leri engeller ve sonuç kodunu kullanarak yanıtlarını geçerli bir ActivityResult ile saptırır RESULT_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);
    
  2. Espresso'ya, "contacts" amacının tüm çağrılarına yanıt olarak sap sonuç nesnesini 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 başvurun.

Sana Özel