Daftar Pengujian dan Adaptor

1. Sebelum memulai

Pada codelab sebelumnya, Anda telah mempelajari cara menulis dan menjalankan unit serta uji instrumentasi. Codelab ini memperkenalkan beberapa praktik terbaik saat menulis pengujian, dan cara menambahkan dependensi Gradle tertentu untuk pengujian. Anda juga akan berlatih menulis lebih banyak unit dan uji instrumentasi.

Prasyarat

  • Anda telah membuka project yang sudah ada di Android Studio.
  • Anda telah menulis pengujian unit dan instrumentasi di Android Studio.
  • Anda memiliki pengalaman membuka project di Android Studio.
  • Anda memiliki pengalaman menggunakan file build.gradle di Android Studio.

Yang akan Anda pelajari

  • Dasar-dasar menulis pengujian.
  • Cara menambahkan dependensi Gradle khusus pengujian.
  • Cara menguji daftar berisi uji instrumentasi.

Yang Anda perlukan

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

Mendownload kode awal untuk codelab ini

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

  1. Buka halaman repositori GitHub yang disediakan untuk project.
  2. Pastikan nama cabang cocok dengan nama cabang yang ditentukan dalam codelab. Misalnya, dalam screenshot berikut, nama cabang adalah main (utama).

1e4c0d2c081a8fd2.png

  1. Di halaman GitHub project, klik tombol Code yang akan menampilkan pop-up.

1debcf330fd04c7b.png

  1. Pada pop-up, 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.

d8e9dbdeafe9038a.png

Catatan: Jika Android Studio sudah terbuka, pilih opsi menu File > Open.

8d1fda7396afe8e5.png

  1. Di file browser, 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 8de56cba7583251f.png untuk membangun dan menjalankan aplikasi. Pastikan aplikasi dibangun seperti yang diharapkan.

2. Ringkasan aplikasi awal

Aplikasi Affirmations terdiri dari satu layar yang menampilkan daftar gambar yang dipasangkan dengan kata afirmasi kepada pengguna.

3. Praktik terbaik

Kode pengujian memang sengaja dibuat agar terlihat berbeda dari logika bisnis untuk aplikasi. Itu karena pengujian hanya perlu melakukan pengujian, dan tidak seharusnya berisi logika. Oleh karena itu, pengujian tidak boleh memiliki pernyataan kondisional seperti if atau when, atau pernyataan alur kontrol seperti for atau while. Pengujian juga tidak boleh memanipulasi nilai atau melakukan komputasi nyata.

Terkadang, pengujian Anda mungkin memerlukan beberapa hal ini, tetapi biasanya Anda harus menghindarinya. Karena ini adalah jenis logika yang ingin kita uji di aplikasi, jika kita memiliki kode semacam itu dalam pengujian, kode tersebut bisa gagal sama seperti gagalnya kode aplikasi.

Pengujian unit hanya boleh memanggil bagian kode dari aplikasi yang diperlukan untuk pengujian dan menguji nilai atau status kode yang dihasilkan karena memanggil kode tersebut. Pengujian UI hanya boleh menguji status yang diharapkan dari antarmuka pengguna. Konsep ini mungkin memerlukan waktu untuk dipahami, tetapi tidak masalah. Ada beberapa topik yang membantu menjelaskan konsep ini yang akan kita bahas di codelab mendatang. Sementara itu, saat kita menulis pengujian lainnya, perhatikan dengan cermat pendekatan yang dilakukan untuk menulis pengujian.

4. Membuat direktori pengujian

Pada codelab sebelumnya, Anda telah mempelajari cara membuat direktori androidTest untuk uji instrumentasi. Ulangi proses tersebut untuk project ini untuk direktori androidTest dan direktori test. Prosesnya sama untuk keduanya, satu-satunya perbedaan adalah untuk direktori test, Anda harus memilih test/java dari dropdown New Directory, bukan androidTest/java. Buat paket baru untuk setiap direktori baru bernama com.example.affirmations.

d762ecd8950e97b2.png

5. Membuat class uji instrumentasi

Buat class baru di androidTest -> com.example.affirmations bernama AffirmationsListTests.kt.

Sama dengan aplikasi Dice Roller, Affirmations hanya memiliki satu aktivitas. Untuk menguji UI aktivitas, kita harus menentukan bahwa kita ingin meluncurkannya. Lihat apakah Anda ingat cara melakukannya sendiri.

  1. Tambahkan runner uji untuk class yang baru dibuat.
@RunWith(AndroidJUnit4::class)
  1. Buat aturan skenario aktivitas untuk aktivitas utama.
@get:Rule
val activity = ActivityScenarioRule(MainActivity::class.java)
  1. Aplikasi Affirmations menampilkan daftar gambar dan afirmasi positifnya masing-masing. UI tidak mengizinkan interaksi apa pun dengan item (misalnya, seperti mengklik atau menggeser). Sehingga untuk aplikasi ini, uji instrumentasi hanya menguji data statis. Buat metode pengujian bernama scroll_to_item(). Ingat bahwa pengujian harus dianotasi dengan @Test.

Pengujian ini akan men-scroll ke item tertentu yang ada dalam daftar. Kita belum membahas pendekatan ini karena memerlukan metode dengan referensi yang belum dimiliki project kita. Sebelum melanjutkan ke pengujian, kita perlu menambahkan beberapa dependensi pengujian.

6. Menambahkan dependensi uji instrumentasi

Anda seharusnya sudah terbiasa menambahkan dependensi Gradle untuk digunakan di kode aplikasi. Gradle juga memungkinkan kita menambahkan dependensi khusus untuk pengujian unit dan uji instrumentasi. Buka file build.gradle tingkat aplikasi yang terdapat di app -> build.gradle. Di bagian dependensi, terdapat tiga jenis implementasi untuk dependensi: implementation, testImplementation, dan androidTestImplementation.

implementation adalah untuk dependensi yang akan digunakan dalam aplikasi itu sendiri, testImplementation untuk dependensi yang digunakan dalam pengujian unit, dan androidTestImplementation untuk dependensi yang digunakan dalam uji instrumentasi.

  1. Tambahkan dependensi untuk memungkinkan interaksi dengan RecyclerView di uji instrumentasi . Tambahkan library berikut sebagai androidTestImplementation:
androidx.test.espresso:espresso-contrib:3.4.0

Dependensinya akan terlihat seperti ini:

dependencies {
    ...
    androidTestImplementation
'androidx.test.espresso:espresso-contrib:3.4.0'
}
  1. Sekarang sinkronkan project.

7. Menguji RecyclerView

  1. Setelah project disinkronkan, kembali ke file AffirmationsListTests.kt. Berikan ViewInteraction untuk melakukan tindakan pada onView(). Metode onView() memerlukan ViewMatcher untuk diteruskan. Gunakan withId() untuk memastikan bahwa ID RecyclerView yang digunakan untuk afirmasi diteruskan. Sekarang panggil perform() di ViewInteraction. Di sinilah dependensi yang baru ditambahkan berperan. RecyclerViewActions.scrollToPosition<RecyclerView.Viewholder>(9) ViewAction sekarang dapat diteruskan.
onView(withId(R.id.recycler_view)).perform(
   RecyclerViewActions
       .scrollToPosition<RecyclerView.ViewHolder>(9)
)

Anda tidak harus memahami sintaksis baris ini, tetapi sebaiknya dipelajari. Nama RecyclerViewActions memiliki fungsi yang sesuai dengan namanya: class yang memungkinkan pengujian Anda mengambil tindakan terhadap RecyclerView. scrollToPosition() adalah metode statis dari class RecyclerViewActions yang akan men-scroll ke posisi tertentu. Metode ini menampilkan fungsi yang disebut Generic. Generic ada di luar cakupan codelab ini, tetapi dalam hal ini, Anda dapat menganggapnya sebagai metode scrollToPosition() yang menampilkan item apa pun di RecyclerView, yang dapat berupa apa saja.

Di aplikasi kami, item di RecyclerView adalah ViewHolder, sehingga kita menambahkan sepasang tanda kurung siku setelah panggilan metode dan di dalamnya, kita menentukan RecyclerView.ViewHolder. Terakhir, teruskan posisi terakhir di daftar (9).

  1. Setelah tindakan men-scroll ke posisi RecyclerView yang diinginkan aktif, buat pernyataan untuk memastikan bahwa UI menampilkan informasi yang diharapkan. Pastikan setelah men-scroll ke item terakhir, teks yang terkait dengan afirmasi terakhir ditampilkan. Mulai dengan ViewInteraction, tetapi kali ini teruskan ViewMatcher baru (dalam hal ini, withText()). Pada metode tersebut, teruskan resource string yang berisi teks afirmasi terakhir. Metode withText() mengidentifikasi komponen UI berdasarkan teks yang ditampilkannya. Untuk komponen ini, yang perlu dilakukan hanya memeriksa apakah komponen tersebut menampilkan teks yang diinginkan. Ini dilakukan dengan memanggil check() di ViewInteraction. check() memerlukan ViewAssertion, sehingga Anda dapat menggunakan metode matches(). Terakhir, buat pernyataan bahwa komponen UI ditampilkan dengan meneruskan metode isDisplayed().
onView(withText(R.string.affirmation10))
    .check(matches(isDisplayed()))

Melakukan hard code pada posisi yang menjadi tujuan scroll dapat diatasi menggunakan RecyclerViewActions. Jika tidak yakin dengan panjang daftar, Anda dapat menggunakan tindakan scrollTo. Fungsi scrollTo memerlukan Matcher<View!>! untuk menemukan item tertentu. Item ini dapat berupa berbagai hal, tetapi untuk memenuhi tujuan pengujian ini, gunakan withText. Menerapkan ini ke pengujian yang baru saja Anda tulis, kodenya akan terlihat seperti ini:

onView(withId(R.id.recycler_view)).perform(
   RecyclerViewActions
       .scrollTo<RecyclerView.ViewHolder>(
           withText(R.string.affirmation10)
       )
)

onView(withText(R.string.affirmation10))
    .check(matches(isDisplayed())
)

Sekarang semuanya sudah siap untuk menjalankan pengujian. Anda akan melihat perangkat atau emulator men-scroll ke bagian bawah daftar, lalu pengujian berhasil. Jika Anda ingin memastikan bahwa hasil pengujiannya akurat, ganti ID string dengan R.string.affirmation1. Setelah di-scroll, resource string ini tidak akan ditampilkan dan pengujian akan gagal.

Ada sejumlah metode yang tersedia di class RecyclerViewActions, dan sebaiknya Anda melihat metode yang tersedia.

8. Membuat class pengujian lokal

Buat class baru di test -> com.example.affirmations bernama AffirmationsAdapterTests.kt.

9. Menambahkan dependensi pengujian lokal

  1. Sebelumnya dalam codelab ini, kita membahas tiga jenis implementasi dependensi dan Anda menambahkan dependensi untuk uji instrumentasi. Sekarang, tambahkan dependensi untuk pengujian lokal. Buka app -> build.gradle, lalu tambahkan dependensi berikut sebagai dependensi pengujian unit:
org.mockito:mockito-core:3.12.4

Dependensi akan terlihat seperti ini:

dependencies {
    ...
    testImplementation 'org.mockito:mockito-core:3.12.4'
}
  1. Sekarang sinkronkan project.

10. Menguji adaptor

Aplikasi khusus ini tidak cocok untuk pengujian unit karena tidak ada banyak logika untuk diuji. Namun, kita dapat memperoleh lebih banyak pengalaman saat menguji berbagai komponen sebagai persiapan untuk pengujian di masa mendatang.

  1. Tempatkan baris berikut di class pengujian unit:
private val context = mock(Context::class.java)

Metode mock() berasal dari library yang baru saja kita implementasikan dalam project. Tiruan adalah bagian integral dari pengujian unit, tetapi tidak termasuk codelab ini. Kita akan membahas tiruan lebih mendetail dalam codelab terpisah. Di Android, Context adalah konteks status aplikasi saat ini, tetapi ingat bahwa pengujian unit berjalan di JVM, bukan di perangkat yang sebenarnya, sehingga tidak ada Context. Metode tiruan memungkinkan kita membuat instance Context "tiruan". Konteks ini tidak memiliki fungsi sebenarnya, tetapi dapat digunakan untuk menguji metode yang memerlukan konteks.

  1. Buat fungsi yang disebut adapter_size() dan anotasikan sebagai pengujian. Tujuan pengujian ini adalah untuk memastikan bahwa ukuran adaptor adalah ukuran daftar yang diteruskan ke adaptor. Untuk melakukannya, buat instance ItemAdapter dan teruskan daftar yang ditampilkan oleh metode loadAffirmations() di class Datasource. Atau, buat daftar baru dan uji. Untuk pengujian unit, praktik terbaiknya adalah membuat data sendiri yang unik untuk pengujian, jadi kita akan membuat daftar kustom untuk pengujian ini.
val data = listOf(
   Affirmation(R.string.affirmation1, R.drawable.image1),
   Affirmation(R.string.affirmation2, R.drawable.image2)
)
  1. Sekarang buat instance ItemAdapter, dengan meneruskan variabel context dan data yang dibuat pada langkah sebelumnya.
val adapter = ItemAdapter(context, data)

Adaptor tampilan recycler memiliki metode yang menampilkan ukuran adaptor bernama getItemCount(). Untuk aplikasi ini, metodenya akan terlihat seperti ini:

/**
* Return the size of your dataset (invoked by the layout manager)
*/
override fun getItemCount() = dataset.size
  1. Ini adalah metode yang harus diuji. Pastikan nilai yang ditampilkan dari metode ini cocok dengan ukuran daftar yang Anda buat di langkah 2. Gunakan metode assertEquals() dan bandingkan nilai ukuran daftar dan ukuran adaptor.
assertEquals("ItemAdapter is not the correct size", data.size, adapter.itemCount)

Anda sudah memahami metode assertEquals(), tetapi sebaiknya periksa baris ini secara menyeluruh. Parameter pertama adalah string yang ditampilkan dalam hasil pengujian jika pengujian gagal. Parameter kedua adalah nilai yang diharapkan. Parameter ketiga adalah nilai sebenarnya. Class pengujian Anda akan terlihat seperti ini:

f81a27f5c1cf055e.png

  1. Sekarang jalankan pengujian.

11. Kode solusi

12. Selamat

Dalam codelab ini, Anda telah:

  • Mempelajari cara menambahkan dependensi khusus pengujian.
  • Mempelajari cara berinteraksi dengan RecyclerView melalui uji instrumentasi.
  • Membahas beberapa praktik terbaik dasar untuk pengujian.