Espresso-Niyetleri

Espresso-Intents, Espresso'nun bir uzantısıdır. Espresso, doğrulama ve tarafından gönderilen amaçların saptırılması olup olmadığını kontrol edin. Bu tıpkı Mockito'ya aittir, ancak Android Intent'ler içindir.

Uygulamanız, işlevler için başka uygulamalara veya platforma yetki veriyorsa aşağıdakileri kullanabilirsiniz: Kendi uygulamanızın mantığına odaklanırken diğer uygulamaların da aynı şekilde Aksi takdirde platform düzgün çalışacaktır. Espresso-Intent'ler sayesinde, ve yanıtınızı doğrulamanın yanı sıra yanıt vermektir.

Projenize Espresso-Intent'leri dahil edin

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

Eski

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 0.3+ Android test kitaplıkları, dolayısıyla şu satırları da güncellediğinizden emin olun:

Eski

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 ayarlayın. Bu bir ActivityTestRule sınıfının bir uzantısıdır ve kullanımını kolaylaştırır. İşlevsel kullanıcı arayüzü testlerinde Espresso-Intents API'ler. IntentsTestRule ilk kullanıma hazırlanır Her testten önce @Test ve sürümler ile açıklama eklenen Espresso-Intent'ler Her test çalıştırmasından sonra Espresso-Intent'ler.

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, giden isteklerinize bağlı olarak Hamcrest Eşleştiriciler kullanılarak tanımlanan belirli eşleşme ölçütleri. Hamcrest şunları yapmanıza olanak tanır:

  • Mevcut bir amaç eşleştiriciyi kullanın: Neredeyse her zaman olması gereken en kolay seçenektir tercih edilir.
  • Kendi amaç eşleştiricinizi uygulayın: En esnek seçenektir. Daha fazla ayrıntıyı aşağıda bulabilirsiniz: "Özel eşleştiriciler yazma" başlıklı bölümde şunun içinde yer alır: Hamcrest eğitimi.

Espresso-Intents, intended() ve amaç doğrulama için intending() saptırma gibi teknikler yer alır. Her ikisi de Hamcrest Matcher<Intent> nesnesini bağımsız değişkeninin önüne geçer.

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

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, başlangıçtan itibaren faaliyet başlatmaya çalışan olup olmadığını kontrol edin. Şuna benzer bir intended() yöntemi kullanılır: Mockito.verify() ile belirli bir amacın görüldüğünü doğrulayabilirsiniz. Ancak, Espresso-Intents, açıkça yapılandırmadığınız sürece niyetlere yanıtları reddetmez anlamaktır.

Aşağıdaki kod snippet'i, doğrulama yapan ancak hata vermeyen bir örnek testtir harici bir "telefon" başlatan giden intent, yanıt verme etkinlik:

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

Stublaj

Mockito.when() işlevine benzer intending() yöntemini kullanarak şunları yapabilirsiniz: ile başlayan aktiviteler için saplama yanıtı startActivityForResult(). Bu özellikle harici etkinlikler için yararlıdır Çünkü harici bir etkinliğin kullanıcı arayüzünü manipüle edemez veya test edilen etkinliğe döndürülen ActivityResult değerini kontrol eder.

Aşağıdaki kod snippet'leri bir örnek uygulamaktadır. activityResult_DisplaysContactsPhoneNumber() testi. Bu test, Kullanıcı bir "kişiyi" başlatır iletişim bilgileri, telefon numarası numara gösterilir:

  1. Belirli bir etkinlik başlatıldığında döndürülecek sonucu oluşturun. İlgili içeriği oluşturmak için kullanılan örnek test, "kişilere" gönderilen tüm Intent'leri yakalar ve görsellerini geçerli bir ActivityResult içeren yanıtlar (sonuç kodunu kullanarak) 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'dan herkese yanıt olarak saplama sonuç nesnesini sağlamasını söyle "kişilerin" çağrıları amaç:

    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 sonucu verdiğini doğrulama saplama sonucu. Bu durumda, örnek testte telefon numarasının "123-345-6789" döndürülür ve "kişi etkinliği"ni seçtiğinizde başlatıldı:

    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 şu adrese bakın: inceleyebilirsiniz.

Örnekler