Kerangka Kerja Pengujian Espresso - Lihat Pencocokan
Framework Espresso menyediakan banyak view matcher. Tujuan matcher adalah mencocokkan tampilan menggunakan atribut tampilan yang berbeda seperti Id, Teks, dan ketersediaan tampilan anak. Setiap pencocokan mencocokkan atribut tertentu dari tampilan dan berlaku untuk jenis tampilan tertentu. Misalnya, pencocokan withId cocok dengan properti Id tampilan dan berlaku untuk semua tampilan, sedangkan pencocokan withText cocok dengan properti Teks tampilan dan hanya berlaku untuk TextView .
Dalam bab ini, mari kita pelajari berbagai matcher yang disediakan oleh framework pengujian espresso serta mempelajari library Hamcrest tempat dibuatnya espresso matcher.
Perpustakaan Hamcrest
Pustaka Hamcrest adalah pustaka penting dalam cakupan framework pengujian espresso. Hamcrest sendiri merupakan kerangka kerja untuk menulis objek matcher. Framework Espresso secara ekstensif menggunakan pustaka Hamcrest dan memperluasnya kapan pun diperlukan untuk menyediakan matcher yang sederhana dan dapat diperpanjang.
Hamcrest menyediakan fungsi sederhana assertThat dan kumpulan pencocokan untuk menegaskan objek apa pun. assertThat memiliki tiga argumen dan seperti yang ditunjukkan di bawah ini -
String (deskripsi tes, opsional)
Objek (aktual)
Matcher (diharapkan)
Mari kita tulis contoh sederhana untuk menguji apakah objek list memiliki nilai yang diharapkan.
import static org.hamcrest.Matchers.hasItem;
import static org.hamcrest.MatcherAssert.assertThat;
@Test
public void list_hasValue() {
ArrayList<String> list = new ArrayList<String>();
list.add("John");
assertThat("Is list has John?", list, hasItem("John"));
}
Di sini, hasItem mengembalikan sebuah matcher, yang memeriksa apakah daftar sebenarnya memiliki nilai yang ditentukan sebagai salah satu item.
Hamcrest memiliki banyak pencocokkan bawaan dan juga opsi untuk membuat pencocokkan baru. Beberapa matcher bawaan penting yang berguna dalam framework pengujian espresso adalah sebagai berikut -
apa saja - selalu cocok
Pencocokan berbasis logis
allOf - menerima sejumlah matcher dan match hanya jika semua matcher berhasil.
anyOf - menerima sejumlah matcher dan match jika ada satu matcher yang berhasil.
not - menerima satu pencocok dan pertandingan hanya jika pencocok gagal dan sebaliknya.
Pencocokan berbasis teks
equalToIgnoringCase - digunakan untuk menguji apakah input aktual sama dengan kasus pengabaian string yang diharapkan.
equalToIgnoringWhiteSpace - digunakan untuk menguji apakah input aktual sama dengan kasus pengabaian string yang ditentukan dan spasi.
containsString - digunakan untuk menguji apakah input sebenarnya berisi string tertentu.
endsWith - digunakan untuk menguji apakah input sebenarnya dimulai dengan string yang ditentukan.
startsWith - digunakan untuk menguji apakah sebenarnya input diakhiri dengan string tertentu.
Pencocok berbasis angka
closeTo - digunakan untuk menguji apakah input aktual mendekati angka yang diharapkan.
greaterThan - digunakan untuk menguji apakah input sebenarnya lebih besar dari angka yang diharapkan.
greaterThanOrEqualTo - digunakan untuk menguji apakah input sebenarnya lebih besar dari atau sama dengan angka yang diharapkan.
lessThan - digunakan untuk menguji apakah input sebenarnya kurang dari angka yang diharapkan.
lessThanOrEqualTo - digunakan untuk menguji apakah input sebenarnya kurang dari atau sama dengan angka yang diharapkan.
Pencocokan berbasis objek
equalTo - digunakan untuk menguji apakah input sebenarnya sama dengan objek yang diharapkan
hasToString - digunakan untuk menguji apakah input sebenarnya memiliki metode toString.
instanceOf - digunakan untuk menguji apakah input sebenarnya adalah turunan dari kelas yang diharapkan.
isCompatibleType - digunakan untuk menguji apakah input aktual kompatibel dengan tipe yang diharapkan.
notNullValue - digunakan untuk menguji apakah input sebenarnya bukan nol.
sameInstance - digunakan untuk menguji apakah input aktual dan yang diharapkan adalah instance yang sama.
hasProperty - digunakan untuk menguji apakah input aktual memiliki properti yang diharapkan
adalah - Gula atau jalan pintas untuk equalTo
Matchers
Espresso menyediakan metode onView () untuk mencocokkan dan menemukan tampilan. Ia menerima view matchers dan mengembalikan objek ViewInteraction untuk berinteraksi dengan view yang cocok. Daftar view matcher yang sering digunakan dijelaskan di bawah ini -
withId ()
withId () menerima argumen bertipe int dan argumen tersebut merujuk id tampilan. Ini mengembalikan matcher, yang cocok dengan tampilan menggunakan id tampilan. Kode sampelnya adalah sebagai berikut,
onView(withId(R.id.testView))
withText ()
withText () menerima argumen bertipe string dan argumen tersebut merujuk pada nilai properti teks tampilan. Ini mengembalikan matcher, yang mencocokkan tampilan menggunakan nilai teks tampilan. Ini hanya berlaku untuk TextView . Kode sampelnya adalah sebagai berikut,
onView(withText("Hello World!"))
withContentDescription ()
withContentDescription () menerima argumen tipe string dan argumen merujuk nilai properti deskripsi konten tampilan. Ini mengembalikan matcher, yang cocok dengan tampilan menggunakan deskripsi tampilan. Kode sampelnya adalah sebagai berikut,
onView(withContentDescription("blah"))
Kita juga bisa mengirimkan id sumber daya dari nilai teks alih-alih teks itu sendiri.
onView(withContentDescription(R.id.res_id_blah))
hasContentDescription ()
hasContentDescription () tidak memiliki argumen. Ini mengembalikan matcher, yang cocok dengan tampilan yang memiliki deskripsi konten. Kode sampelnya adalah sebagai berikut,
onView(allOf(withId(R.id.my_view_id), hasContentDescription()))
withTagKey ()
withTagKey () menerima argumen tipe string dan argumen merujuk kunci tag tampilan. Ini mengembalikan matcher, yang cocok dengan tampilan menggunakan kunci tag-nya. Kode sampelnya adalah sebagai berikut,
onView(withTagKey("blah"))
Kita juga bisa mengirimkan id sumber daya dari nama tag alih-alih nama tag itu sendiri.
onView(withTagKey(R.id.res_id_blah))
withTagValue ()
withTagValue () menerima argumen berjenis Matcher <Object> dan argumen tersebut merujuk pada nilai tag tampilan. Ini mengembalikan matcher, yang cocok dengan tampilan menggunakan nilai tag-nya. Kode sampelnya adalah sebagai berikut,
onView(withTagValue(is((Object) "blah")))
Berikut, adalah adalah Hamcrest matcher.
withClassName ()
withClassName () menerima argumen berjenis Matcher <String> dan argumen tersebut merujuk pada nilai nama kelas tampilan. Ini mengembalikan matcher, yang cocok dengan tampilan menggunakan nama kelasnya. Kode sampelnya adalah sebagai berikut,
onView(withClassName(endsWith("EditText")))
Di sini, endingWith adalah matcher Hamcrest dan kembali Matcher <String>
withHint ()
withHint () menerima argumen tipe Matcher <String> dan argumen tersebut merujuk nilai petunjuk tampilan. Ini mengembalikan matcher, yang cocok dengan tampilan menggunakan petunjuk tampilan. Kode sampelnya adalah sebagai berikut,
onView(withClassName(endsWith("Enter name")))
withInputType ()
withInputType () menerima argumen tipe int dan argumen merujuk tipe input tampilan. Ini mengembalikan matcher, yang cocok dengan tampilan menggunakan tipe inputnya. Kode sampelnya adalah sebagai berikut,
onView(withInputType(TYPE_CLASS_DATETIME))
Di sini, TYPE_CLASS_DATETIME merujuk pada tampilan edit tanggal dan waktu pendukung.
withResourceName ()
withResourceName () menerima argumen bertipe Matcher <String> dan argumen tersebut merujuk pada nilai nama kelas tampilan. Ini mengembalikan matcher, yang cocok dengan tampilan menggunakan nama sumber daya tampilan. Kode sampelnya adalah sebagai berikut,
onView(withResourceName(endsWith("res_name")))
Ini menerima argumen string juga. Kode sampelnya adalah sebagai berikut,
onView(withResourceName("my_res_name"))
denganAlpha ()
withAlpha () menerima argumen tipe float dan argumen merujuk nilai alpha dari tampilan. Ini mengembalikan matcher, yang mencocokkan tampilan menggunakan nilai alfa tampilan. Kode sampelnya adalah sebagai berikut,
onView(withAlpha(0.8))
withEffectiveVisibility ()
withEffectiveVisibility () menerima argumen tipe ViewMatchers.Visibility dan argumen merujuk visibilitas efektif tampilan. Ini mengembalikan matcher, yang cocok dengan tampilan menggunakan visibilitas tampilan. Kode sampelnya adalah sebagai berikut,
onView(withEffectiveVisibility(withEffectiveVisibility.INVISIBLE))
withSpinnerText ()
withSpinnerText () menerima argumen tipe Matcher <String> dan argumen tersebut merujuk pada nilai tampilan yang dipilih saat ini dari Spinner. Ini mengembalikan sebuah matcher, yang cocok dengan spinner berdasarkan nilai toString item yang dipilihnya. Kode sampelnya adalah sebagai berikut,
onView(withSpinnerText(endsWith("USA")))
Ini menerima argumen string atau id sumber daya string juga. Kode sampelnya adalah sebagai berikut,
onView(withResourceName("USA"))
onView(withResourceName(R.string.res_usa))
denganSubstring ()
withSubString () mirip dengan withText () kecuali membantu menguji substring dari nilai teks tampilan.
onView(withSubString("Hello"))
hasLinks ()
hasLinks () tidak memiliki argumen dan mengembalikan matcher, yang cocok dengan tampilan yang memiliki tautan. Ini hanya berlaku untuk TextView. Kode sampelnya adalah sebagai berikut,
onView(allOf(withSubString("Hello"), hasLinks()))
Di sini, allOf adalah matcher Hamcrest. allOf mengembalikan matcher, yang cocok dengan semua matcher yang diteruskan dan di sini, digunakan untuk mencocokkan tampilan serta memeriksa apakah tampilan memiliki tautan dalam nilai teksnya.
hasTextColor ()
hasTextColor () menerima satu argumen bertipe int dan argumen tersebut merujuk pada id sumber daya warna. Ini mengembalikan matcher, yang cocok dengan TextView berdasarkan warnanya. Ini hanya berlaku untuk TextView . Kode sampelnya adalah sebagai berikut,
onView(allOf(withSubString("Hello"), hasTextColor(R.color.Red)))
hasEllipsizedText ()
hasEllipsizedText () tidak memiliki argumen. Ini mengembalikan matcher, yang cocok dengan TextView yang memiliki teks panjang dan berbentuk elipsis (pertama .. sepuluh .. terakhir) atau terpotong (pertama…). Kode sampelnya adalah sebagai berikut,
onView(allOf(withId(R.id.my_text_view_id), hasEllipsizedText()))
hasMultilineText ()
hasMultilineText () tidak memiliki argumen. Ini mengembalikan matcher, yang cocok dengan TextView yang memiliki teks multi baris. Kode sampelnya adalah sebagai berikut,
onView(allOf(withId(R.id.my_test_view_id), hasMultilineText()))
hasBackground ()
hasBackground () menerima satu argumen berjenis int dan argumen tersebut merujuk id sumber daya dari sumber daya latar belakang. Ini mengembalikan matcher, yang cocok dengan tampilan berdasarkan sumber daya latar belakangnya. Kode sampelnya adalah sebagai berikut,
onView(allOf(withId("image"), hasBackground(R.drawable.your_drawable)))
hasErrorText ()
hasErrorText () menerima argumen tipe Matcher <String> dan argumen tersebut merujuk pada nilai string kesalahan tampilan (EditText). Ini mengembalikan matcher, yang cocok dengan tampilan menggunakan string kesalahan tampilan. Ini hanya berlaku untuk EditText . Kode sampelnya adalah sebagai berikut,
onView(allOf(withId(R.id.editText_name), hasErrorText(is("name is required"))))
Ini menerima argumen string juga. Kode sampelnya adalah sebagai berikut,
onView(allOf(withId(R.id.editText_name), hasErrorText("name is required")))
hasImeAction ()
hasImeAction () menerima argumen bertipe Matcher <Integer> dan argumen tersebut merujuk pada metode masukan yang didukung tampilan (EditText). Ini mengembalikan matcher, yang cocok dengan tampilan menggunakan metode masukan yang didukung dari tampilan. Ini hanya berlaku untuk EditText . Kode sampelnya adalah sebagai berikut,
onView(allOf(withId(R.id.editText_name),
hasImeAction(is(EditorInfo.IME_ACTION_GO))))
Di sini, EditorInfo.IME_ACTION_GO adalah salah satu opsi metode masukan. hasImeAction () menerima argumen integer juga. Kode sampelnya adalah sebagai berikut,
onView(allOf(withId(R.id.editText_name),
hasImeAction(EditorInfo.IME_ACTION_GO)))
upportInputMethods ()
supportInputMethods () tidak memiliki argumen. Ini mengembalikan matcher, yang cocok dengan tampilan jika mendukung metode masukan. Kode sampelnya adalah sebagai berikut,
onView(allOf(withId(R.id.editText_name), supportsInputMethods()))
isRoot ()
isRoot () tidak memiliki argumen. Ini mengembalikan matcher, yang cocok dengan tampilan root. Kode sampelnya adalah sebagai berikut,
onView(allOf(withId(R.id.my_root_id), isRoot()))
isDisplayed ()
isDisplayed () tidak memiliki argumen. Ini mengembalikan matcher, yang cocok dengan tampilan yang sedang ditampilkan. Kode sampelnya adalah sebagai berikut,
onView(allOf(withId(R.id.my_view_id), isDisplayed()))
isDisplayingAtLeast ()
isDisplayingAtLeast () menerima satu argumen bertipe int. Ini mengembalikan matcher, yang cocok dengan tampilan yang saat ini ditampilkan setidaknya persentase yang ditentukan. Kode sampelnya adalah sebagai berikut,
onView(allOf(withId(R.id.my_view_id), isDisplayingAtLeast(75)))
isCompletelyDisplayed ()
isCompletelyDisplayed () tidak memiliki argumen. Ini mengembalikan matcher, yang cocok dengan tampilan yang saat ini ditampilkan sepenuhnya di layar. Kode sampelnya adalah sebagai berikut,
onView(allOf(withId(R.id.my_view_id), isCompletelyDisplayed()))
diaktifkan()
isEnabled () tidak memiliki argumen. Ini mengembalikan matcher, yang cocok dengan tampilan yang diaktifkan. Kode sampelnya adalah sebagai berikut,
onView(allOf(withId(R.id.my_view_id), isEnabled()))
isFocusable ()
isFocusable () tidak memiliki argumen. Ini mengembalikan matcher, yang cocok dengan tampilan yang memiliki opsi fokus. Kode sampelnya adalah sebagai berikut,
onView(allOf(withId(R.id.my_view_id), isFocusable()))
hasFocus ()
hasFocus () tidak memiliki argumen. Ini mengembalikan matcher, yang cocok dengan tampilan yang saat ini difokuskan. Kode sampelnya adalah sebagai berikut,
onView(allOf(withId(R.id.my_view_id), hasFocus()))
isClickable ()
isClickable () tidak memiliki argumen. Ini mengembalikan matcher, yang cocok dengan tampilan yaitu opsi klik. Kode sampelnya adalah sebagai berikut,
onView(allOf(withId(R.id.my_view_id), isClickable()))
dipilih()
isSelected () tidak memiliki argumen. Ini mengembalikan matcher, yang cocok dengan tampilan yang saat ini dipilih. Kode sampelnya adalah sebagai berikut,
onView(allOf(withId(R.id.my_view_id), isSelected()))
isChecked ()
isChecked () tidak memiliki argumen. Ia mengembalikan sebuah matcher, yang cocok dengan tampilan yang berjenis CompoundButton (atau subtipe darinya) dan dalam keadaan dicentang. Kode sampelnya adalah sebagai berikut,
onView(allOf(withId(R.id.my_view_id), isChecked()))
isNotChecked ()
isNotChecked () berlawanan dengan isChecked. Kode sampelnya adalah sebagai * berikut,
onView(allOf(withId(R.id.my_view_id), isNotChecked()))
isJavascriptEnabled ()
isJavascriptEnabled () tidak memiliki argumen. Ini mengembalikan matcher, yang cocok dengan WebView yang mengevaluasi JavaScript. Kode sampelnya adalah sebagai berikut,
onView(allOf(withId(R.id.my_webview_id), isJavascriptEnabled()))
withParent ()
withParent () menerima satu argumen bertipe Matcher <View>. Argumennya mengacu pada pandangan. Ini mengembalikan matcher, yang cocok dengan tampilan yang tampilan tertentu adalah tampilan induk. Kode sampelnya adalah sebagai berikut,
onView(allOf(withId(R.id.childView), withParent(withId(R.id.parentView))))
hasSibling ()
hasSibling () menerima satu argumen bertipe Matcher> View <. Argumennya mengacu pada pandangan. Ini mengembalikan matcher, yang cocok dengan tampilan bahwa tampilan yang diteruskan adalah salah satu tampilan saudaranya. Kode sampelnya adalah sebagai berikut,
onView(hasSibling(withId(R.id.siblingView)))
bersama anak()
withChild () menerima satu argumen berjenis Matcher <View>. Argumennya mengacu pada pandangan. Ini mengembalikan sebuah matcher, yang cocok dengan tampilan bahwa tampilan yang diteruskan adalah tampilan anak. Kode sampelnya adalah sebagai berikut,
onView(allOf(withId(R.id.parentView), withChild(withId(R.id.childView))))
hasChildCount ()
hasChildCount () menerima satu argumen bertipe int. Argumen mengacu pada jumlah anak dari suatu tampilan. Ini mengembalikan matcher, yang cocok dengan tampilan yang memiliki jumlah tampilan turunan yang sama persis seperti yang ditentukan dalam argumen. Kode sampelnya adalah sebagai berikut,
onView(hasChildCount(4))
hasMinimumChildCount ()
hasMinimumChildCount () menerima satu argumen tipe int. Argumen mengacu pada jumlah anak dari suatu tampilan. Ini mengembalikan matcher, yang cocok dengan tampilan yang memiliki setidaknya jumlah tampilan anak seperti yang ditentukan dalam argumen. Kode sampelnya adalah sebagai berikut,
onView(hasMinimumChildCount(4))
hasDescendant ()
hasDescendant () menerima satu argumen berjenis Matcher <View>. Argumennya mengacu pada pandangan. Ini mengembalikan matcher, yang cocok dengan tampilan bahwa tampilan yang diteruskan adalah salah satu tampilan turunan dalam hierarki tampilan. Kode sampelnya adalah sebagai berikut,
onView(hasDescendant(withId(R.id.descendantView)))
isDescendantOfA ()
isDescendantOfA () menerima satu argumen tipe Matcher <View>. Argumennya mengacu pada pandangan. Ini mengembalikan matcher, yang cocok dengan tampilan bahwa tampilan yang diteruskan adalah salah satu tampilan leluhur dalam hierarki tampilan. Kode sampelnya adalah sebagai berikut,
onView(allOf(withId(R.id.myView), isDescendantOfA(withId(R.id.parentView))))