Mengenal Unit Testing
Seberapa percaya dirikah Anda dengan kode Anda? Apakah Anda yakin kode yang Anda deploy tidak akan menyebabkan bug di production environment sistem Anda?
Jika pertanyaan di atas membuat Anda ragu ataupun cemas, mungkin Anda butuh melakukan unit testing terhadap kode Anda.
Apa Itu Unit Testing
Unit testing adalah pengujian terhadap unit-unit yang membentuk keseluruhan kode perangkat lunak Anda. Pengujian dilakukan untuk memverifikasi bahwa masing-masing unit berjalan sesuai ekspektasi dengan berbagai keadaan. Sederhananya memastikan untuk setiap input, output yang dikeluarkan sesuai dengan ekspektasi.
tambah(a,b)
Definisi bentuk unit sendiri tidak ditetapkan secara baku. Bisa jadi se-spesifik sebuah fungsi, atau bisa jadi seumum interface atau class dalam pemrograman berorientasi objek. Mudahnya, unit dapat dipandang sebagai komponen terkecil yang dapat diuji secara terisolasi dalam program kita.
Pengujian tersebut tidak dilakukan oleh manusia selayaknya pada manual testing, melainkan dilakukan secara terotomasi oleh program test suite dengan berpedoman pada spesifikasi yang ditulis pemrogram. Jadi, ketika kita menerapkan unit testing, kita tidak hanya perlu menulis kode perangkat lunak kita, tapi juga spesifikasi unit testing-nya.
Kenapa Kita Melakukan Unit Testing?
Unit testing dilakukan untuk memastikan unit-unit independen kode kita berjalan sesuai spesifikasi, dan mendeteksi bug potensial yang terjadi pada kode kita sebelum kode tersebut masuk dan dijalankan di production. Selain itu, unit testing juga bisa memastikan refaktorisasi, penambahan fitur, ataupun modifikasi detail implementasi fitur-fitur yang sudah berjalan sesuai spesifikasi tidak akan menimbulkan bug.
Test-driven Development (TDD)
Unit testing adalah salah satu elemen yang memungkinkan kita melakukan TDD atau test-driven development. TDD adalah metode pengembangan perangkat lunak yang berangkat dari penerjemahan requirement menjadi test cases, yang kemudian baru diterjemahkan ke dalam kode. Metode ini memastikan kode yang kita tulis, selain dilindungi unit test, juga sesuai dengan cakupan yang ditetapkan dalam requirement.
Dalam praktiknya dengan unit test, TDD dilakukan dengan cara mendahulukan penulisan kode spesifikasi unit test terlebih dahulu. Spesifikasi tersebut ditulis tepat berdasarkan spesifikasi produk yang dituangkan dalam requirement. Ketika dijalankan, maka semua test yang ditulis pasti akan gagal. Dari situ barulah pemrogram bekerja menulis program agar test cases yang sudah ditulis berhasil lolos (passed) semua.
Metode ini diklaim memiliki banyak keuntungan. Pertama, kode yang dihasilkan akan memiliki coverage (proporsi kode yang 'dilindungi' unit test) yang tinggi, bahkan mungkin mencapai 100%. Kemudian, menurut sebuah studi, pemrogram yang menulis lebih banyak unit test cenderung lebih produktif [1], dan implementasi TDD berarti menulis lebih banyak unit test.
Unit Testing sebagai Dokumentasi
Menulis unit test berarti menulis spesifikasi unit-unit dalam program kita: apa saja yang bisa dilakukan unit-unit tersebut, dan apa saja yang tidak bisa dilakukannya. Spesifikasi unit test tersebut secara otomatis menjadi dokumentasi tentang programnya sendiri.
Misalnya, dengan contoh unit fungsi tambah(a,b)
, kita bisa mendefinisikan test cases berikut:
- Fungsi tersebut menambahkan dua nilai bertipe number dengan benar
- Fungsi tersebut akan mengeluarkan
TypeError
jika salah satu parameternya tidak bertipe number - Fungsi tersebut menerima parameter bilangan negatif maupun positif
Dengan membaca test cases tersebut saja pemrogram lain tidak perlu membaca implementasi di dalam fungsi tersebut untuk mengetahui apa yang dilakukan olehnya.
Meskipun mungkin di awal terasa berat untuk mengadopsi unit testing, pada akhirnya unit testing akan membawa dampak-dampak yang jauh lebih menguntungkan dibandingkan merugikan. Bagi saya, unit testing juga bisa menjadi awalan yang baik untuk mulai eksplorasi ke metode-metode pengujian perangkat lunak yang cakupannya lebih besar, seperti integration testing dan end-to-end testing. Jika Anda belum memulainya, marilah dimulai dari sekarang!