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
:
- Buka file
app/build.gradle
dan lihat dependensinya. Anda melihat beberapa dependensi yang ditandai sebagaitestImplementation
danandroidTestImplementation
, 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.
- Dalam direktori
test
, buka fileExampleUnitTest.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 libraryorg.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.
- Di samping deklarasi metode
addition_isCorrect
, klik panah, lalu pilih Run ‘ExampleUnitTest.addition_isCorrect'.
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:
Ada berbagai indikasi yang menunjukkan bahwa pengujian berhasil, yaitu tanda centang warna hijau dan jumlah pengujian yang lulus.
- Ubah pengujian untuk melihat seperti apa kegagalannya. Ubah
2 + 2
menjadi2 + 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:
Teks merah menunjukkan kegagalan pengujian. Di menu hasil pengujian, mengklik item di pesan error akan menampilkan pesan error yang menunjukkan penyebab pengujian gagal.
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
.
- Demi alasan ketelitian, ubah nilai yang diharapkan dari
4
menjadi5
, 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.
- Dalam file
ExampleUnitTest.kt
, hapus metode pengujian yang dihasilkan dan pernyataan impor. File Anda sekarang akan terlihat seperti ini:
- Buat fungsi
generates_number()
:
ExampleUnitTest.kt
fun generates_number() {
}
- 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 menekanControl+Enter
(atauOptions+Return
di Mac).
Jika mengklik baris kode, Anda akan melihat perintah untuk mengimpor:
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:
- Buat instance objek
Dice
.
ExampleUnitTest.kt
@Test
fun generates_number() {
val dice = Dice(6)
}
- 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()
}
- 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 dari7
. Untuk melakukannya, gunakan metodeassertTrue()
. Perhatikan bahwa saat Anda mencoba memanggil metodeassertTrue()
, 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.
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
:
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:
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:
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)
}
- Klik tanda panah di samping fungsi, lalu pilih Run ‘ExampleUnitTest.generates_number()'.
Jika kode Anda terlihat seperti cuplikan kode sebelumnya, pengujian Anda akan lulus.
- 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.