Menguji Navigasi

1. Sebelum memulai

Pada codelab sebelumnya, Anda telah mempelajari navigasi antar-aktivitas. Dalam codelab ini, Anda akan mempelajari beberapa pendekatan yang berbeda untuk menguji navigasi menggunakan uji instrumentasi.

Prasyarat

  • Anda telah membuat direktori pengujian di Android Studio.
  • Anda telah menulis pengujian unit dan instrumentasi di Android Studio.

Yang akan Anda pelajari

  • Cara menggunakan uji instrumentasi untuk menguji navigasi fisik antara aktivitas atau fragmen.

Yang Anda perlukan

  • Komputer yang dilengkapi Android Studio.
  • Kode solusi untuk aplikasi Words.

Mendownload kode awal untuk codelab ini

Dalam codelab ini, Anda akan menambahkan uji instrumentasi ke kode solusi untuk aplikasi Words.

Untuk mendapatkan kode codelab ini dan membukanya di Android Studio, lakukan hal berikut.

Mendapatkan kode

  1. Klik URL yang diberikan. Tindakan ini akan membuka halaman GitHub project di browser.
  2. Di halaman GitHub project, klik tombol Code yang akan menampilkan dialog.

5b0a76c50478a73f.png

  1. Di dialog, klik tombol Download ZIP untuk menyimpan project di komputer. Tunggu download selesai.
  2. Temukan file di komputer Anda (mungkin di folder Downloads).
  3. Klik dua kali pada file ZIP untuk mengekstraknya. Tindakan ini akan membuat folder baru yang berisi file project.

Membuka project di Android Studio

  1. Mulai Android Studio.
  2. Di jendela Welcome to Android Studio, klik Open an existing Android Studio project.

36cc44fcf0f89a1d.png

Catatan: Jika Android Studio sudah terbuka, pilih opsi menu File > New > Import Project.

21f3eec988dcfbe9.png

  1. Di dialog Import Project, buka lokasi folder project yang telah diekstrak (kemungkinan ada di folder Downloads).
  2. Klik dua kali pada folder project tersebut.
  3. Tunggu Android Studio membuka project.
  4. Klik tombol Run 11c34fc5e516fb1c.png untuk membangun dan menjalankan aplikasi. Pastikan aplikasi dibangun seperti yang diharapkan.
  5. Cari file project di jendela alat Project untuk melihat cara aplikasi disiapkan.

2. Ringkasan aplikasi awal

Aplikasi Words terdiri dari layar utama yang menampilkan daftar, dengan setiap item daftar berupa huruf alfabet. Mengklik huruf akan membuka layar yang menampilkan daftar kata yang dimulai dengan huruf tersebut.

3. Praktik terbaik

Di Kotlin, konvensi umum untuk penamaan fungsi adalah menggunakan "camel case" dengan huruf pertama nama fungsi adalah huruf kecil dan huruf pertama dari kata berikutnya adalah huruf besar (misalnya, myCamelCaseFunction()). Metode pengujian yang telah kita tulis sejauh ini telah menggunakan huruf kecil semuanya dan garis bawah di antara kata-kata (misalnya, my_test_function()). Alasannya: kita ingin nama fungsi ditulis panjang sehingga secara eksplisit menyatakan apa yang sedang diuji. Dengan demikian, jika pengujian gagal, nama itu sendiri akan mengindikasikan dengan jelas apa yang gagal. Di Kotlin, kita bahkan dapat menggunakan spasi dalam nama metode jika menggabungkan nama metode dalam tanda aksen rendah, seperti ini: ``fungsi pengujian dengan spasi(). Perhatikan bahwa tanda aksen rendah berbeda dengan tanda kutip tunggal. Tanda aksen rendah ini dapat ditemukan di tombol dengan tanda gelombang (~). Hal ini mempermudah orang untuk membaca nama fungsi dan mengidentifikasinya jika terjadi kegagalan.

Namun, pendekatan ini mengharuskan adanya beberapa penyiapan. Harap diperhatikan bahwa bagian ini bersifat opsional. Anda sebaiknya membacanya, tetapi tidak perlu mengikuti langkah apa pun hingga sampai ke bagian Membuat direktori uji instrumentasi.

  1. Perhatikan bahwa spasi di nama fungsi hanya berfungsi jika Anda menargetkan API 30 di Android. Jika tidak, Anda mungkin akan mendapatkan error seperti berikut:

4333fe8605801dba.png

Untuk mengubah API, buka app/build.gradle dan ubah minSdkVersion dan/atau targetSdkVersion:

a6207c31c66ca185.png

Dalam hal ini, targetSdkVersion disetel ke 30 yang diperlukan. Namun, minSdkVersion adalah 19 sehingga kita harus mengubahnya menjadi 30 agar spasi bisa digunakan di dalam nama fungsi. Hal ini mungkin tidak selalu bersifat praktis sehingga fitur ini bagus jika ada, tetapi tidak diwajibkan.

  1. Meskipun menargetkan API 30, Anda akan melihat bahwa metode tersebut diberi garis bawah warna merah dan pesan "Identifier not allowed in Android Projects".

d1330d69cc2472b1.png

Pengujian ini akan tetap dilaksanakan dan berjalan sampai selesai, tetapi untuk menghapus garis bawah, buka setelan/preferensi Android Studio dan buka Editor -> Inspections -> Kotlin Android -> Illegal Android Identifier -> Tests.

acc4a31499bdb25.png

Hapus centang kotak Tests lalu klik Apply atau OK.

aeb57d303996a3de.png

Sekarang, metode Anda tidak lagi digarisbawahi dengan warna merah selama Anda mengapit nama metode dengan tanda aksen rendah.

a54f3eff47697024.png

4. Membuat direktori pengujian

Buat direktori uji instrumentasi untuk aplikasi Words.

5. Membuat class uji instrumentasi

Buat class baru bernama NavigationTests.kt.

9d9ee307b4773b7.png

6. Menulis pengujian navigasi

  1. Tentukan runner pengujian.
@RunWith(AndroidJUnit4::class)
  1. Kemudian, luncurkan aktivitas utama.
@get:Rule
val activity = ActivityScenarioRule(MainActivity::class.java)
  1. Sekarang buat metode yang disebut navigate_to_word().
@Test
fun navigate_to_word() {
}
  1. Dalam metode navigate_to_word(), kita harus menentukan item daftar yang akan dipilih. Item yang dipilih bersifat tidak tentu dan dapat dilakukan dengan beberapa cara. Kita dapat memilih item berdasarkan posisinya di adaptor atau berdasarkan teks (misalnya, huruf) yang ada di dalamnya. Perlu diingat bahwa jika memilih untuk berinteraksi dengan RecyclerView secara langsung, Anda memerlukan dependensi berikut:
dependencies {
    ...
    androidTestImplementation
‘com.android.support.test.espresso:espresso-contrib:3.0.2'
}

Di sisi lain, jika memutuskan untuk memilih item berdasarkan teks, Anda dapat menggunakan metode withText() yang telah digunakan dalam codelab sebelumnya. Penting untuk diperhatikan bahwa pengujian akan gagal jika Anda menggunakan pendekatan ini dan teks tidak muncul di layar. Kita akan membahasnya nanti.

  1. Coba kedua cara tersebut. Ingat bahwa tujuan kita adalah mengklik komponen UI setelah ditemukan.

Kedua pendekatan tersebut ditampilkan di sini dengan tujuan mengklik item untuk huruf 'C' sebagai contoh.

onView(withText("C")).perform(click())
onView(withId(R.id.recycler_view))
   .perform(RecyclerViewActions
       .actionOnItemAtPosition<RecyclerView.ViewHolder>(2, click()))

Luangkan waktu untuk mempelajari kedua pendekatan ini secara mendalam. Jika Anda menjalankan pendekatan dan mengamati emulator atau perangkat, Anda akan melihat bahwa keduanya berfungsi. Penggunaan RecyclerViewActions memerlukan lebih banyak kode, tetapi memiliki keuntungan tersendiri, yaitu kemampuan untuk mengklik item apa pun tanpa perlu upaya tambahan. Coba pendekatan pertama, tetapi ubah huruf "C" menjadi "Z" dan jalankan pengujian lagi. Anda akan melihat bahwa pengujian gagal dengan error berikut: androidx.test.espresso.NoMatchingViewException: No views in hierarchy found matching: with text: is "Z".

3c518d4b00624af3.png

Itu karena "Z" berada di bagian terakhir daftar dan berada di luar cakupan layar saat kita meluncurkan aplikasi sehingga harus di-scroll. Pendekatan RecyclerViewAction menangani hal ini secara inheren. Coba teruskan 25 sebagai nilai posisi dan lihat emulator atau perangkat Anda.

  1. Jika menjalankan contoh di atas, Anda akan melihat bahwa kita telah berhasil meluncurkan aktivitas berikutnya, tetapi ingin mengonfirmasi hal itu dengan pernyataan. Jika menjalankan aplikasi itu sendiri dan mengklik item daftar yang diberikan, Anda akan melihat bahwa judul di panel aplikasi bertuliskan "Words That Start With __" dengan spasi kosong adalah huruf yang Anda klik. Kita dapat menggunakannya untuk memeriksa bahwa navigasi berfungsi dengan benar. Kita hanya perlu menegaskan bahwa string yang benar, yang diikuti dengan huruf yang kita klik, ditampilkan. Anda telah membuat pernyataan serupa dalam codelab sebelumnya. Jadi, lihat apakah Anda dapat melakukannya sendiri sekarang.
onView(withText("Words That Start With C")).check(matches(isDisplayed()))

7. Pelajaran konseptual dan praktik terbaik

Ada dua istilah sangat penting yang digunakan dalam pengujian: "positif palsu", dan "negatif palsu".

"Positif palsu (PP)" adalah jika pengujian memberikan hasil lulus, meskipun ada sesuatu yang salah, dan pengujian tersebut akan tetap dianggap gagal. Demikian pula, "negatif palsu (NP)" adalah jika pengujian memberikan hasil gagal meskipun ada yang benar, dan pengujian tersebut akan tetap dianggap lulus.

Dalam pengujian yang kita tulis di atas, kita melakukan hard code pada string yang kita cari. Dari perspektif kode, akan lebih mudah untuk membuat string dari resource string, seperti yang dilakukan dalam aplikasi. Cara kerjanya akan sedikit berbeda dari yang biasanya dalam kode aplikasi biasa, tetapi masih memungkinkan. Namun, membangun string dengan cara ini berpotensi gagal karena membangun string secara teknis merupakan logika bisnis. Jika pembuatan string dalam pengujian gagal dengan cara yang sama seperti yang terjadi dalam kode aplikasi, string tersebut dapat menghasilkan positif palsu. Hal ini karena kedua kode tersebut salah dalam membangun string yang sama, sehingga teks yang salah dari pengujian tersebut cocok dengan teks yang salah yang ditampilkan di aplikasi. Oleh karena itu, lebih baik meng-hardcode string ke nilai yang kita harapkan.

8. Kode solusi

9. Selamat

Dalam codelab ini, kita telah:

  • Mempelajari cara membuat nama fungsi yang panjang untuk pengujian.
  • Mempelajari cara menguji navigasi fisik dengan Aktivitas atau Fragmen.
  • Mempelajari "positif palsu (PP)" dan "negatif palsu (NP)".