Menulis pengujian unit

1. Sebelum memulai

Pada codelab sebelumnya, Anda telah mempelajari cara membuat project dengan Android Studio, memodifikasi XML untuk membuat UI yang disesuaikan untuk aplikasi Anda, dan mengubah logika bisnis untuk menambahkan fungsi. Codelab ini berfokus pada alasan pentingnya pengujian dan memperluas pengujian unit. Anda berkesempatan melihat tampilannya dan cara menulisnya.

Prasyarat

  • Anda telah membuat project di Android Studio.
  • Anda memiliki pengalaman menulis kode di Android Studio.

Yang akan Anda pelajari

  • Alasan pentingnya pengujian.
  • Tampilan pengujian unit.
  • Cara menulis dan menjalankan pengujian unit.

Yang akan Anda butuhkan

  • Komputer yang dilengkapi Android Studio.
  • Project yang Anda buat di codelab sebelumnya di jalur ini.

2. Pengantar

Setelah Anda menulis beberapa kode Android, sekarang adalah waktu yang tepat untuk menindaklanjuti beberapa kode pengujian. Pertama, Anda membahas beberapa filosofi dalam pengujian, lalu mempelajari lebih dalam pengujian yang dihasilkan secara otomatis dalam project Android, dan terakhir menulis pengujian Anda sendiri untuk aplikasi Dice Roller. Pelajaran ini mencakup banyak materi, tetapi jangan merasa pesimis. Luangkan waktu Anda untuk memahami materi ini karena mempelajari pengujian memerlukan waktu yang tidak sebentar dan juga harus banyak latihan. Jangan berkecil hati jika Anda tidak dapat memahaminya dalam waktu singkat.

Mengapa pengujian itu penting?

Pada awalnya mungkin Anda merasa tidak memerlukan pengujian di aplikasi. Jika aplikasi Anda berukuran kecil dan memiliki fungsi terbatas, Anda dapat mengujinya secara manual dan memastikan semua fungsi berjalan dengan benar. Namun, seiring perkembangan aplikasi Anda, diperlukan lebih banyak upaya untuk melakukan pengujian manual daripada menulis pengujian otomatis. Selain itu, setelah Anda mulai mengerjakan aplikasi tingkat profesional, pengujian menjadi sangat penting jika jumlah pengguna aplikasi Anda sangat banyak. Anda harus memperhitungkan berbagai jenis perangkat yang menjalankan berbagai versi Android. Pada akhirnya, Anda akan mencapai suatu titik ketika pengujian otomatis dapat menjelaskan sebagian besar skenario penggunaan secara signifikan lebih cepat daripada pengujian manual. Saat menjalankan pengujian sebelum merilis kode baru, Anda dapat membuat perubahan pada kode yang sudah ada sehingga dapat menghindari rilis aplikasi dengan perilaku yang tidak diharapkan. Ingatlah bahwa pengujian otomatis adalah pengujian yang dijalankan melalui software, bukan pengujian manual, yang dilakukan oleh orang yang secara langsung berinteraksi dengan perangkat. Pengujian otomatis dan pengujian manual berperan penting dalam memastikan pengguna produk Anda mendapatkan pengalaman yang menyenangkan. Namun, pengujian otomatis bisa lebih akurat dan dapat mengoptimalkan produktivitas tim Anda karena tidak mengharuskan seseorang untuk menjalankannya dan dapat dijalankan lebih cepat daripada pengujian manual.

Melihat lebih dekat pengujian unit

Dalam codelab ini, Anda akan berfokus pada pengujian unit. Nantinya, Anda akan membahas uji instrumentasi. Sebagai permulaan, Anda harus melihat pengujian yang dihasilkan saat membuat aplikasi Android melalui Android Studio. Anda juga akan mendapatkan beberapa pengalaman langsung saat menjalankan pengujian dan mendapatkan pengetahuan tentang penulisan kode pengujian.

Pada jalur sebelumnya, Anda telah mengetahui lokasi file sumber untuk pengujian. Pengujian unit selalu berada di direktori test:

f02b380da4e8f661.png

  1. Buka file app/build.gradle dan lihat dependensinya. Anda melihat beberapa dependensi yang ditandai sebagai testImplementation dan androidTestImplementation, yang masing-masing sesuai dengan pengujian unit dan instrumentasi. Perhatikan bahwa:

app/build.gradle

testImplementation 'junit:junit:4.12'

Library JUnit yang mendorong pengujian unit dan memungkinkan Anda menandai kode sebagai pengujian sehingga dapat dikompilasi dan dijalankan sedemikian rupa agar dapat menguji kode aplikasi.

  1. Dalam direktori test, buka file ExampleUnitTest.kt.

Anda akan melihat contoh pengujian unit yang terlihat seperti ini:

ExampleUnitTest.kt

class ExampleUnitTest {
   @Test
   fun addition_isCorrect() {
       assertEquals(4, 2 + 2)
   }
}

Meskipun telah menambahkan beberapa kode ke aplikasi Dice Roller, Anda mungkin tidak menulis pengujian apa pun. Dengan demikian, hanya ada beberapa kode generik yang dibuat secara otomatis oleh Android Studio. Pengujian arbitrer ini berfungsi sebagai placeholder untuk pengujian yang lebih relevan dan diharapkan dapat ditulis oleh developer. Saat ini, blok kode ini hanya menguji logika 2 + 2 = 4. Tentu saja hal itu selalu benar. Ketahui lebih lanjut apa yang terjadi:

  • Fungsi pengujian harus dianotasi terlebih dahulu dengan anotasi @ Test yang diimpor dari library org.junit.test. Anda dapat menganggap anotasi sebagai tag metadata untuk bagian kode yang dapat mengubah cara kode dikompilasi. Dalam hal ini, anotasi @Test memungkinkan compiler mengetahui bahwa metode berikut adalah sebuah pengujian yang memungkinkannya berjalan sedemikian rupa.

Setelah anotasi, Anda akan memiliki deklarasi fungsi addition_isCorrect(). Dalam fungsi tersebut, fungsi assertEquals() menyatakan bahwa nilai yang diharapkan harus sama dengan nilai sebenarnya yang diperoleh melalui logika bisnis. Metode pernyataan adalah sasaran akhir dari pengujian unit. Pada akhirnya, Anda ingin menyatakan bahwa hasil yang diperoleh dari kode Anda berada dalam status tertentu. Jika status hasil sesuai dengan status yang diharapkan, pengujian akan lulus. Jika status hasil tidak sesuai dengan status yang diharapkan, pengujian akan gagal. Dalam hal ini, kode membandingkan dua nilai sehingga metode assertEquals() menggunakan dua parameter—nilai yang diharapkan dan nilai sebenarnya. Sesuai dengan namanya, nilai yang diharapkan adalah hasil yang Anda harapkan untuk hasil tertentu, yang dalam kasus ini adalah 4. Nilai sebenarnya mewakili hasil potongan kode yang sebenarnya. Umumnya, cara ini akan menguji potongan kode dari aplikasi itu sendiri. Dalam hal ini, kode tersebut hanya kode tidak tentu, misalnya, 2 + 2. Tanpa melakukan banyak hal lainnya, jalankan pengujian ini untuk melihat apa yang terjadi.

Ada banyak cara untuk menjalankan pengujian di Android Studio yang akan Anda pelajari nanti. Sekarang, Anda tidak perlu melakukan apa pun.

  1. Di samping deklarasi metode addition_isCorrect, klik panah, lalu pilih Run ‘ExampleUnitTest.addition_isCorrect'.

78c943e851a33644.png

Inilah yang disebut sebagai pengujian positif. Dengan kata lain, pernyataan tersebut merupakan penegasan. 2 + 2 sama dengan 4. Atau, kita dapat menulis pengujian negatif yang membuat pernyataan bersifat negatif. Misalnya: 2 + 2 tidak sama dengan 5.

Di panel Run, Anda akan melihat sesuatu seperti screenshot ini:

190df0c8ff787233.png

Ada berbagai indikasi yang menunjukkan bahwa pengujian berhasil, yaitu tanda centang warna hijau dan jumlah pengujian yang lulus.

aa7d361d8e4826ef.png

  1. Ubah pengujian untuk melihat seperti apa kegagalannya. Ubah 2 + 2 menjadi 2 + 3, lalu jalankan kembali pengujian. Perlu diingat bahwa Anda hanya bereksperimen dengan kode yang telah dibuat guna mendapatkan pengalaman terkait cara kerja pengujian. Perubahan ini tidak terlalu relevan dengan fungsi Dice Roller.

ExampleUnitTest.kt

class ExampleUnitTest {
   @Test
   fun addition_isCorrect() {
       assertEquals(4, 2 + 3)
   }
}

Setelah menjalankan sisanya, Anda akan melihat sesuatu seperti screenshot ini:

751ac8089cf4c47c.png

Teks merah menunjukkan kegagalan pengujian. Di menu hasil pengujian, mengklik item di pesan error akan menampilkan pesan error yang menunjukkan penyebab pengujian gagal.

163708373e651ecc.png

Dalam kasus ini, pesan menunjukkan bahwa pernyataan gagal karena mengharapkan hasil 4, tetapi nilai sebenarnya adalah 5. Hal ini wajar karena Anda mengubah nilai sebenarnya menjadi 2 + 3, tetapi nilai yang diharapkan adalah 4. Anda juga dapat melihat baris tempat pengujian gagal. Dalam hal ini, baris 15 yang dilambangkan sebagai ExampleUnitTest.kt:15.

  1. Demi alasan ketelitian, ubah nilai yang diharapkan dari 4 menjadi 5, lalu jalankan kembali pengujian. Seharusnya pengujian sekarang berhasil karena nilai yang diharapkan cocok dengan hasil kode sebenarnya yang dipermasalahkan.

3. Menulis pengujian unit Anda yang pertama

Setelah mendapatkan kemudahan dengan pengujian unit, Anda dapat menulis pengujian unit sendiri yang lebih relevan dengan aplikasi Dice Roller.

Seperti yang telah Anda ketahui, fungsi utama aplikasi Dice Roller didasarkan pada generator angka acak. Sayangnya, generator angka acak sangat sulit diuji karena Anda tidak dapat memastikan hasil angka yang dibuat secara acak. Sasaran pengujian ini adalah untuk memastikan bahwa saat Anda melempar dadu, atau memanggil metode roll di class dice, Anda akan mendapatkan kembali angka yang sesuai. Pengujian yang Anda tulis hanya menguji bahwa output generator angka acak adalah angka dalam rentang yang Anda tetapkan ke generator.

  1. Dalam file ExampleUnitTest.kt, hapus metode pengujian yang dihasilkan dan pernyataan impor. File Anda sekarang akan terlihat seperti ini:

c06e8b402f293b5e.png

  1. Buat fungsi generates_number():

ExampleUnitTest.kt

fun generates_number() {
}
  1. Anotasi metode generates_number() dengan anotasi @Test. Perhatikan bahwa saat Anda mencoba memanggil @Test, teks akan berwarna merah. Hal ini dikarenakan deklarasi anotasi ini tidak dapat ditemukan sehingga Anda perlu mengimpornya. Anda dapat melakukannya secara otomatis saat menekan Control+Enter (atau Options+Return di Mac).

Jika mengklik baris kode, Anda akan melihat perintah untuk mengimpor:

bbe5791b9565588c.png

Atau, Anda juga dapat menyalin dan menempelkan file import org.junit.Test setelah nama paket, tetapi sebelum deklarasi class. Kode sekarang harus terlihat seperti ini:

9a94c2bdf84adb61.png

  1. Buat instance objek Dice.

ExampleUnitTest.kt

@Test
fun generates_number() {
   val dice = Dice(6)
}
  1. Selanjutnya, panggil metode roll() pada instance ini dan simpan nilai yang ditampilkan.

ExampleUnitTest.kt

@Test
fun generates_number() {
   val dice = Dice(6)
   val rollResult = dice.roll()
}
  1. Terakhir, buat pernyataan yang sebenarnya. Dengan kata lain, Anda harus menyatakan bahwa metode tersebut menampilkan nilai yang ada dalam jumlah sisi yang Anda lempar. Jadi, dalam hal ini, nilai harus lebih besar dari 0 dan kurang dari 7. Untuk melakukannya, gunakan metode assertTrue(). Perhatikan bahwa saat Anda mencoba memanggil metode assertTrue(), teks akan terlebih dahulu berwarna merah. Ini karena deklarasi metode ini tidak dapat ditemukan sehingga Anda harus mengimpornya, mirip dengan yang Anda alami dengan anotasi.

10eea07fc21bf998.png

Anda dapat mengimpornya secara otomatis seperti yang telah dibahas sebelumnya. Namun, perhatikan bahwa kali ini Anda memiliki beberapa opsi untuk dipilih. Dalam hal ini, opsi yang dipilih harus menjadi opsi dari paket org.junit.Assert:

5dbfba2ba0e37ac9.png

Atau, Anda dapat menempelkan kode ini setelah pernyataan impor untuk anotasi pengujian:

ExampleUnitTest.kt

import org.junit.Assert.assertTrue

Sekarang kode Anda akan terlihat seperti ini:

347f792f455ae6b5.png

Jika kursor ditempatkan di antara tanda kurung dan menekan Control+P (atau Command+P di Mac), Anda akan melihat tooltip yang menunjukkan parameter yang digunakan metode:

865cf0ac47738e08.png

Metode assertTrue() menggunakan dua parameter: String dan Boolean. Jika pernyataan tersebut gagal, string adalah pesan yang ditampilkan di konsol. Boolean adalah pernyataan kondisional. Tetapkan pesan ke:

ExampleUnitTest.kt

"The value of rollResult was not between 1 and 6"

Seperti yang disebutkan sebelumnya, pengujian angka acak merupakan sebuah tantangan karena nilai angka tidak dapat diprediksi akibat sifat keacakannya. Anda hanya dapat memastikan nilai berada dalam rentang tertentu. Tetapkan parameter kondisi ke:

ExampleUnitTest.kt

rollResult in 1..6

Kodenya akan terlihat seperti ini:

ExampleUnitTest.kt

@Test
fun generates_number() {
   val dice = Dice(6)
   val rollResult = dice.roll()
   assertTrue("The value of rollResult was not between 1 and 6", rollResult in 1..6)
}
  1. Klik tanda panah di samping fungsi, lalu pilih Run ‘ExampleUnitTest.generates_number()'.

Jika kode Anda terlihat seperti cuplikan kode sebelumnya, pengujian Anda akan lulus.

  1. Opsional: Sebagai latihan tambahan, ubah dadu menjadi 4 atau 5 sisi tanpa mengubah pernyataan untuk melihat pengujian gagal.

4. Selamat

Anda telah mempelajari:

  • Pentingnya pengujian.
  • Tampilan pengujian unit.
  • Cara menjalankan pengujian unit.
  • Beberapa sintaksis pengujian umum.
  • Cara menulis pengujian unit.

Mempelajari lebih lanjut