TDD dalam Software Development

Gerrad Natanael Daloma
6 min readFeb 26, 2022

--

Art by Denise Yu

Dalam membuat sebuah software, tentunya kita ingin sekali melakukan perencanaan, kemudian baru mengeksekusi rencana tersebut dan merapihkan proses eksekusi agar software yang nantinya kita buat merupakan produk yang bukan hanya siap pakai, tetapi juga berkualitas. Konsep di atas sangat berhubungan dengan istilah TDD atau Test Driven Development yang merupakan konsep yang sering sekali didengar oleh para programmer. Artikel kali ini akan membahas mengenai pengertian, tahapan, contoh penggunaan, dan manfaat dari TDD.

Apa itu TDD?

Seperti namanya, TDD adalah istilah untuk menggambarkan bagaimana proses pengembangan sebuah software yang diarahkan dengan penggunaan tes. Hal ini berarti bahwa tes memiliki peranan yang sangat penting dalam melakukan TDD. Oleh karena itu, kita kerapkali mendengar istilah “buat test dulu, baru implementasi” ketika sedang membahas TDD :D.

Tahapan dan Penerapan TDD

TDD terkenal dengan tahapan-tahapan yang membentuk suatu siklus di dalamnya, yaitu membuat test yang wajib gagal terlebih dahulu, menulis kode yang simple agar test berhasil, “membersihkan” kode yang sudah dibuat, kemudian mengulangi langkah pertama. Tahapan-tahapan tadi dijabarkan menjadi 3 tahapan utama, yaitu:

[RED] Membuat Test
Merupakan langkah pertama dalam melakukan TDD. Pada tahap ini, programmer perlu membuat test terlebih dahulu dengan ekspektasinya adalah test tersebut gagal. Tujuan dari membuat test pada langkah pertama ini adalah agar programmer tahu fitur apa saja yang harus diimplementasikan kedepannya. Perlu diketahui juga bahwa dalam membuat test, prinsip yang digunakan adalah FIRST, yaitu:

1. Fast
Setiap unit test harus dieksekusi dalam waktu yang sesingkat mungkin agar tidak menghambat proses deployment product nantinya.

2. Isolated
Unit test yang dibuat harusnya independent terhadap satu sama lain dan bisa dieksekusi dengan urutan apapun dan kapanpun.

3. Repeatable
Semua unit test harus menghasilkan hasil yang selalu sama ketika di eksekusi berulang kali.

4. Self-validating
Self-validating
berarti bahwa setiap Unit Test harus bisa menentukan apakah outputnya expected atau tidak.

5. Thorough
Saat membuat unit test, perlu juga memperhatikan negative-test bukan hanya positive-testnya saja. Negative-test yang dimaksudkan disini adalah test untuk menangani kasus seperti invalid input atau unexpected user behaviour. Sedangkan positive-test adalah test yang menangani kasus valid dengan keluaran yang diharapkan

Contoh penerapan pembuatan test dengan bahasa pemrograman Golang:

first test

Disini saya membuat test untuk suatu fungsi isPalin yang akan menerima input berupa integer dan output berupa boolean berdasarkan apakah input tersebut palindrome atau bukan. Harapannya adalah jika suatu fungsi menerima input berupa bilangan yang palindrome, maka fungsi akan mengembalikan nilai true sedangkan nilai false akan dikembalikan jika bilangan bukan palindrome. Berikut adalah tampilan ketika saya menjalankan perintah go test

test fail

Terlihat bahwa test yang sudah saya buat gagal ketika dieksekusi. Ini merupakan langkah yang memang diharapkan pada tahap pembuatan test. Oleh sebab itu, tag yang sering digunakan untuk menggambarkan tahap pertama ini adalah [RED].

[GREEN] Implementasi Melalui Kode
Merupakan tahapan kedua pada TDD dimana pada tahap ini implementasi berupa kode mulai dibuat berdasarkan test yang sudah dibuat pada tahap sebelumnya. Pembuatan kode dilakukan hingga test yang tadinya gagal (red), berubah menjadi sukses (green).
Contoh penerapan implementasi fungsi isPalin dalam bahasa pemrograman Golang:

fungsi isPalin

Sebagai contoh, disini untuk mengecek apakah suatu angka palindrome atau tidak, pertama-tama angka tersebut diubah tipenya menjadi sebuah string, kemudian string tadi dicarikan inversenya dengan cara menampung tiap karakternya dalam array dengan isinya bertipe rune (sama seperti tipe data int32). Setelah itu baru dilakukan iterasi terhadap isi dari array tadi dari indeks paling besar ke indeks paling kecilnya. Kemudian, setiap karakter dimasukan ke dalam array rev_rune dan diubah menjadi string setelah proses iterasi berakhir. Lalu, setiap karakter pada string reverse tadi dicocokan dengan my_str melalui proses iterasi kedua. Apabila didapati ketidaksamaan pada proses pencocokan, maka fungsi akan mengembalikan nilai false, tetapi jika sampai karakter terakhir tidak ditemukan perbedaan karakter, maka fungsi akan mengembalikan nilai true. Berikut ini adalah tampilan ketika saya menjalan perintah go test :

test pass

Setelah test dieksekusi, terlihat bahwa hasilnya adalah PASS yang berarti kini apa yang kita implementasikan sudah sesuai dengan test yang sudah kita buat. Oleh sebab itu, tag yang sering digunakan dalam tahapan ini adalah [GREEN] yang menggambarkan kriteria test sudah dipenuhi melalui implementasi kode.

[REFACTOR] Pembersihan Kode

Tahapan terakhir dalam TDD, dimana pada tahap ini kode implementasi yang sudah dibuat akan “dibersihkan”. Selain itu programmer juga bisa meningkatkan efektivitas dan efisiensi dari algoritma yang digunakan pada tahap ini.
Berikut merupakan contoh pembersihan kode dengan menggunakan bahasa pemrograman Golang berdasarkan fungsi yang sudah dibuat sebelumnya:

refactor code

Karena kode sebelumnya kurang efisien, dimana integer harus diubah ke dalam string terlebih dahulu kemudian dilakukan reverse, dan kemudian baru dicocokan, maka disini saya melakukan refactor terhadap kode tersebut dimana tidak perlu lagi mengubah integer ke dalam string, melainkan hanya perlu memanfaatkan penggunaan modulo dan pembagian dengan angka 10. Sehingga sebenarnya proses yang dilakukan sama saja seperti membalikan bilangan input dari kanan ke kiri. Karena disini saya melakukan pembenahan terhadap kode yang sudah saya buat sebelumnya, oleh sebab itu tahapan ini sering disebut dengan REFACTOR.

Manfaat TDD

Setelah melihat definisi dan tahapan dalam TDD beserta dengan contoh kodenya dalam bahasa pemrograman golang, selanjutnya adalah pembahasan mengenai manfaat TDD. Apa saja manfaatnya?

  • Memudahkan proses debugging — Karena dasar implementasi dari fitur yang dibuat adalah berdasarkan test yang sudah dibuat pada tahap awal, maka error akan terdeteksi dengan lebih mudah sehingga proses debugging pun juga menjadi lebih singkat
  • Sebagai Dokumentasi Kode — TDD berperan juga sebagai “manual book” terhadap suatu fungsi yang dibuat, sehingga memudahkan para programmer untuk membaca kode-kode implementasi yang sudah dibuat
  • Refactoring menjadi lebih lancar — Kode menjadi lebih managable dengan bantuan TDD, sehingga proses refactoring kode pun menjadi lebih mudah dan lancar

Functional Test dan Integration Test

Setelah membuat semua unit test yang diperlukan, tentunya kita perlu melanjutkan ke tahap selanjutnya yaitu Functional Test dan Integration Test. Functional Test adalah proses melakukan test terhadap software yang sudah dibuat berdasarkan requirement yang diberikan. Test ini akan dilakukan ketika product sudah dibuat dan dideploy. Sedangkan Integration Test adalah proses test terhadap masing-masing product yang telah dibuat. Test ini dilakukan sebelum Functional Test.

Demikianlah artikel kali ini yang telah membahas mengenai pengertian, tahapan, contoh, dan manfaat dari TDD. Semoga tulisan ini bisa bermanfaat bagi teman-teman yang baru memulai membiasakan diri dalam penggunaan TDD.

References:

--

--