Menulis Uji Instrumentasi

1. Sebelum memulai

Dalam codelab sebelumnya, Anda mempelajari cara membuat dan menjalankan pengujian unit. Codelab ini berfokus pada uji instrumentasi. Anda akan mendapatkan kesempatan melihat tampilannya dan cara menulisnya.

Prasyarat

  • Anda telah membuat project di Android Studio.
  • Anda memiliki pengalaman menulis kode di Android Studio.
  • Anda memiliki pengalaman membuka project di Android Studio.
  • Anda sudah menulis pengujian unit sederhana di Android Studio.

Yang akan Anda pelajari

  • Tampilan uji instrumentasi.
  • Cara menjalankan uji instrumentasi.
  • Cara menulis uji instrumentasi.

Yang Anda perlukan

  • Komputer yang dilengkapi Android Studio.
  • Kode solusi untuk aplikasi Tip Time.

Mendownload kode awal untuk codelab ini

Dalam codelab ini, Anda akan menambahkan uji instrumentasi ke aplikasi Tip Time dari kode solusi sebelumnya.

  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 Tip Time berisi satu layar yang menunjukkan input teks kepada pengguna untuk memasukkan jumlah tagihan, tombol pilihan untuk memilih persentase tip, dan tombol untuk menghitung tip.

3. Membuat direktori uji instrumentasi

Kode awal untuk codelab ini dapat digunakan sepenuhnya, tetapi tidak memiliki pengujian dan direktori pengujian. Sebelum menulis pengujian apa pun, kita perlu menambahkan direktori untuk uji instrumentasi. Setelah mendownload kode awal, lakukan langkah-langkah berikut untuk menambahkan class untuk uji instrumentasi Anda.

  1. Cara termudah untuk melakukannya adalah terlebih dahulu beralih dari tampilan Android ke tampilan Project. Pada panel project di kiri atas, klik menu drop-down yang bertuliskan Android lalu pilih Project.

20055afdc5d38e69.png

  1. Tampilan project Anda sekarang akan terlihat seperti ini:

7e933e8dd546458e.png

  1. Klik menu drop-down pertama, lalu lihat perincian ke app -> src.

65dd6a80920623ef.png

  1. Klik kanan src lalu pilih New -> Directory.

73b014c84f89b0f0.png

  1. Anda akan melihat jendela ini muncul:

921d8a0df6310383.png

  1. Pilih androidTest/java.

c4b99c44611ae609.png

  1. Sekarang Anda akan melihat direktori androidTest di struktur project.

5f6643d80a7ef0f8.png

  1. Klik kanan direktori java lalu pilih New -> Package.

8f8a590b7bdc01b3.png

  1. Anda akan melihat jendela yang muncul:

4d154746de968ccf.png

  1. Pada jendela, ketik teks berikut lalu tekan Return:
com.example.tiptime
  1. Jendela project Anda akan terlihat seperti ini:

7bb036a4bc3be441.png

  1. Terakhir, klik kanan com.example.tiptime lalu pilih New -> Kotlin Class/File.

26ff162c120e18d1.png

  1. Pada jendela yang muncul, ketik CalculatorTests, pilih Class dari menu dropdown, lalu tekan Return.

4. Menulis Uji Instrumentasi Pertama

Sekarang saatnya menulis uji instrumentasi. Langkah-langkah berikut akan menguji fungsi untuk mendapatkan 20% tip.

  1. Buka file yang baru Anda buat, yang seharusnya terlihat seperti ini:
package com.example.tiptime

class CalculatorTests {
}
  1. Uji instrumentasi memerlukan InstrumentationTestRunner, yang memungkinkan pengujian berjalan pada perangkat atau emulator. Ada beberapa runner instrumentasi lainnya, tetapi untuk pengujian ini, kita akan menggunakan runner pengujian AndroidJUnit4. Untuk menentukan runner pengujian, kita perlu memberikan anotasi class dengan string berikut:
@RunWith(AndroidJUnit4::class)
class CalculatorTests {
}

Untuk berjaga-jaga, berikut ini adalah impor yang Anda perlukan:

import androidx.test.ext.junit.runners.AndroidJUnit4
import org.junit.runner.RunWith

Sekarang semuanya telah siap untuk mulai menulis logika pengujian.

  1. Aplikasi Tip Time berisi satu aktivitas, yaitu MainActivity. Untuk berinteraksi dengan aktivitas tersebut, kasus pengujian Anda harus meluncurkannya terlebih dahulu. Tambahkan kode berikut di dalam class CalculatorTests.
@get:Rule()
val activity = ActivityScenarioRule(MainActivity::class.java)

ActivityScenarioRule berasal dari library AndroidX Test. Aturan ini memberi tahu perangkat agar meluncurkan aktivitas yang ditentukan oleh developer. Anda perlu memberinya anotasi dengan @get:Rule, yang menentukan bahwa aturan berikutnya, dalam hal ini meluncurkan aktivitas, harus dilakukan sebelum setiap pengujian di class. Aturan pengujian adalah alat yang penting untuk pengujian, dan pada akhirnya Anda akan mempelajari cara menulisnya sendiri.

  1. Berikutnya, Anda perlu menulis logika pengujian itu sendiri. Buat fungsi, beri nama calculate_20_percent_tip(), lalu beri anotasi @Test.
@Test
fun calculate_20_percent_tip() {
}

Espresso

Kursus ini utamanya menggunakan Espresso untuk uji instrumentasi. Espresso adalah library yang siap digunakan dengan project Android saat dibuat dengan Android Studio, dan memungkinkan Anda berinteraksi dengan komponen UI melalui kode.

Pada tahap ini, Anda mungkin telah melihat bahwa Android Studio memiliki banyak fitur pelengkapan otomatis. Salah satu aspek yang menantang dalam menggunakan Espresso adalah metode tidak otomatis melengkapi jika library belum diimpor. Hal ini dapat menyulitkan navigasi metode yang tersedia di Espresso tanpa meneliti dokumentasi. Dalam pelajaran ini, kami akan menyediakan metode yang diperlukan untuk menyelesaikan pengujian.

Pertama, Anda harus menulis kode untuk memasukkan jumlah tagihan di tampilan teks input Cost of Service. Membuka app -> src -> main -> res -> layout -> activity_main.xml akan menunjukkan bahwa ID TextInputEditText adalah cost_of_service_edit_text. Salin nama ID, yang akan kita perlukan nanti untuk pengujian.

a113fb63b50f7674.png

Mengimplementasikan fungsi Pengujian

Sekarang, dalam fungsi calculate_20_percent_tip() di class pengujian, Anda dapat menulis logika pengujian.

  1. Langkah pertama adalah menemukan komponen UI untuk berinteraksi, dalam hal ini TextInputEditText, menggunakan fungsi onView(). Fungsi onView() mengambil parameter objek ViewMatcher. Pada dasarnya, ViewMatcher merupakan komponen UI yang memenuhi kriteria tertentu, yang dalam hal ini berupa komponen yang memiliki ID R.id.cost_of_service_edit_text.

Fungsi withId() menampilkan ViewMatcher, yaitu komponen UI dengan ID yang diteruskan ke sana. onView() menampilkan ViewInteraction, yang merupakan objek tempat kita dapat berinteraksi seolah-olah kitalah yang mengontrol perangkatnya. Untuk memasukkan teks, panggil perform() di ViewInteraction. Kemudian, perform() akan mengambil objek ViewAction. Ada sejumlah metode yang menampilkan ViewAction, tetapi untuk saat ini kita akan menggunakan metode typeText(). Di activity_main.xml, kita dapat melihat bahwa opsi tip default adalah 20%, sehingga untuk sementara, Anda tidak perlu menentukan opsi tip mana yang dipilih.

onView(withId(R.id.cost_of_service_edit_text))
    .perform(typeText("50.00"))

Setelah itu, seluruh petunjuk akan terlihat seperti berikut:

onView(withId(R.id.cost_of_service_edit_text))
    .perform(typeText("50.00"))
    .perform(ViewActions.closeSoftKeyboard())
  1. Teks kini telah dimasukkan dan pengujian perlu mengklik tombol Calculate. Kode untuk pengujian ini mengikuti format yang serupa dengan yang kita gunakan untuk memasukkan teks. Komponen UI-nya berbeda, sehingga nama ID yang diteruskan ke fungsi withId() berbeda. Namun, satu-satunya perbedaan dalam pendekatan ini adalah bahwa ViewAction berbeda; fungsi click() digunakan, bukan typeText().
onView(withId(R.id.calculate_button))
    .perform(click())
  1. Terakhir, Anda harus membuat pernyataan bahwa tip yang benar akan ditampilkan. Perkiraan jumlah tipnya adalah $10,00. Untuk pengujian ini, pastikan TextView yang memiliki ID tip_result berisi nilai tip yang diharapkan dalam bentuk string.
onView(withId(R.id.tip_result))
    .check(matches(withText(containsString("$10.00"))))

Pilih impor berikut saat diminta:

import androidx.test.espresso.assertion.ViewAssertions.matches
import org.hamcrest.Matchers.containsString

Di sini, Anda menggunakan interaksi lain bernama check(), yang memerlukan ViewAssertion. Anda dapat menganggap ViewAssertion sebagai pernyataan Espresso khusus yang digunakan untuk komponen UI. Pernyataannya adalah konten TextView cocok dengan teks yang berisi string "$10.00".

Sebelum menjalankan pengujian, pastikan impor dan kode Anda sudah benar, dan seharusnya terlihat seperti ini (tidak masalah jika urutan impornya berbeda):

package com.example.tiptime

import androidx.test.espresso.Espresso.onView
import androidx.test.espresso.action.ViewActions.click
import androidx.test.espresso.action.ViewActions.typeText
import androidx.test.espresso.assertion.ViewAssertions.matches
import androidx.test.espresso.matcher.ViewMatchers.withId
import androidx.test.espresso.matcher.ViewMatchers.withText
import androidx.test.ext.junit.rules.ActivityScenarioRule
import androidx.test.ext.junit.runners.AndroidJUnit4
import org.hamcrest.Matchers.containsString
import org.junit.Rule
import org.junit.Test
import org.junit.runner.RunWith

@RunWith(AndroidJUnit4::class)
class CalculatorTests {

   @get:Rule()
   val activity = ActivityScenarioRule(MainActivity::class.java)

   @Test
   fun calculate_20_percent_tip() {
       onView(withId(R.id.cost_of_service_edit_text))
           .perform(typeText("50.00"))

       onView(withId(R.id.calculate_button)).perform(click())

       onView(withId(R.id.tip_result))
           .check(matches(withText(containsString("$10.00"))))
   }
}

Jika menggunakan emulator, pastikan Anda dapat melihat emulator dan jendela Android Studio secara bersamaan. Jalankan pengujian dengan cara yang sama seperti saat Anda menjalankan pengujian unit (dengan mengklik kanan tombol panah merah/hijau sebelah kiri fungsi, lalu memilih opsi pertama) lalu lihat apa yang terjadi.

36684dfa8a17a2c9.gif

Anda dapat melihat eksekusi uji seolah ada yang berinteraksi dengan aplikasi tersebut.

5. Memperluas Test Suite

Selamat! Anda berhasil menjalankan uji instrumentasi.

Jika ingin mengikuti tantangan, Anda dapat memperluas test suite dengan menambahkan fungsi yang menguji persentase tip lainnya. Gunakan format yang sama seperti fungsi yang kami tuliskan di atas, satu-satunya perubahan yang perlu Anda buat adalah menulis kode untuk memilih opsi persentase yang berbeda, serta mengubah nilai yang diteruskan ke dalam containsString() untuk menghitung ekspektasi hasil yang berbeda. Jangan lupa ada juga opsi untuk membulatkannya. Anda dapat mengalihkan tombol pembulatan dengan menemukan komponen menurut ID-nya, seperti yang kami tunjukkan untuk onView(withId()), lalu mengklik komponennya.

6. Kode Solusi

7. Ringkasan

  • Android Studio menghasilkan class pengujian yang diperlukan saat project dibuat. Namun, jika menemukan project yang belum memilikinya, Anda dapat membuatnya secara manual.
  • Aturan pengujian berjalan sebelum setiap pengujian dalam kelas pengujian.
  • Espresso adalah komponen dasar dari uji instrumentasi. Class ini memungkinkan interaksi dengan komponen UI menggunakan kode.

Pelajaran yang panjang ini akhirnya selesai. Selamat sudah belajar sampai tuntas!

Pelajari Lebih Lanjut