Implementasi TDD pada software development process

Kevin Prakasa
PPL SeLaw
Published in
5 min readFeb 25, 2019

Test Driven Development adalah software development cycle yang bermula dari kumpulan kebutuhan yang dikonversikan dalam bentuk test-test, dan tujuan kita adalah untuk melolos ujikan test-test tersebut.

Test Driven Development(TDD) merupakan salah satu software development cycle yang bersifat iteratif dan cukup hyped di kalangan developer masa kini. TDD sangat populer karena keunggulannya jika dibandingkan dengan conventional testing, karena apa ?

  1. TDD merupakan development cycle yang memiliki konsep untuk membuat test terlebih dahulu baru membuat code untuk meloloskan test tersebut. Tidak halnya seperti conventional testing yang memiliki konsep “coding dulu, testnya belakangan”, yang seringkali menimbulkan berbagai kebingungan di akhirnya.

TDD is all about “Is the code correct?”

Bagaimana proses TDD diimplementasikan?

From https://www.guru99.com/test-driven-development.html
  1. Add a Test

Requirements -> Unit Tests

Proses TDD dimulai dari adanya requirements. Dari requirements itulah kita ubah menjadi kumpulan unit test. Misalkan requirements nya adalah “Dapat membuat kasus dengan maksimal 1000 karakter”, maka dari itu kita bisa membuat test seperti “test dapat membuat kasus”, “test membuat kasus kurang dari 1000 karakter”, “test membuat kasus dengan lebih dari 1000 karakter”. Nah dapat dilihat dari satu requirement saja bisa dipecah menjadi beberapa unit test.

2. Execute the Tests

Setelah dibuat kumpulan unit testnya, maka kita coba untuk mengeksekusi test yang telah kita buat. Dan seharusnya hasilnya adalah fail karena kita memang belom membuat penerapan apa-apa dari test yang ada tersebut. Maka selanjutnya target kita adalah lolos dari test tersebut dengan me-refactor kode tersebut.

3. Refactoring

Proses refactoring bertujuan untuk melolos ujikan kode kita terhadap test yang ada. Refactoring dilakukan dengan membuat implementasi dari setiap kode yang ada agar dapat lolos uji dari test yang telah kita buat. Refactoring juga bisa dilakukan secara berulang untuk mendapatkan solusi kode yang paling efektif dan efisien, namun tak lupa dengan tujuan awal kita yaitu melolos ujikan test yang ada. Sehingga setiap kali kita melakukan refactoring kode kita, maka hasil refactor nya juga harus ditest lagi. Apabila masih gagal test, maka lakukan refactor kembali sampai berhasil lolos test.

Setelah kita sudah mencapai pada proses ke tiga yaitu refactoring, proses TDD kembali ke proses pertama lagi yaitu add a test seiring dengan bertambahnya requirements yang ada, karena kita ketahui di setiap software development cycle, requirements bisa saja bertambah.

Implementasi TDD pada Django Projects

Pertama-tama kita definisikan terlebih dahulu apa requirements yang ingin kita buat unit testnya . Dalam kasus ini saya ambil adalah di website saya “Terdapat model klien yang bisa registrasi dirinya kedalam database— dengan ketentuan email dan nomor telepon nya harus unik”.

Maka dari itu kita bisa membuat beberapa unit test seperti “Klien bisa registrasi dirinya”, “Klien tidak bisa registrasi dengan email yang tidak unik”, “Klien tidak bisa registrasi dengan no. telepon yang tidak unik”. Tidak unik yang dimaksud disini adalah email atau no. teleponnya telah tedaftar sebelumnya.

Kita bisa membuat unit test tersebut dengan membuat kodenya dengan menggunakan class TestCase bawaan dari Django. Unit test terletak pada “<nama_folder_app>/tests.py” .Seperti screenshot dibawah ini

Isi Client/tests.py
  • Diatas terdapat fungsi setUp yang berguna untuk setup data yang selalu dieksekusi sekali di awal sebelum fungsi test_* yang lainnya dieksekusi
  • Fungsi test_*, merupakan implementasi dari setiap unit test yang kita susun. Seperti contohnya fungsi test_model_client_email_unique, berarti kita mengetest apabila klien didaftarkan dengan email yang tidak unik. Maka akan me-raise suatu error yang menandakan penyimpanan klien tersebut gagal, karena terdapat constraint yang dilanggar

Kita dapat menjalankan semua tests yang ada pada setiap folder app di django dengan melakukan command

python manage.py test

Command diatas akan mencari setiap tests yang ada pada setiap app dan mengeksekusinya.

Berhubung saya belum mengimplementasikan kodenya untuk melolos ujikan test tersebut, maka ketika test dijalankan pasti akan menghasilkan failed pada setiap test yang ada.

Maka itu kita harus membuat implementasi kodingannya agar bisa lolos unit test yang telah dibuat. Dalam kasus ini, karena requirement yang ada hanya mencakup scope di model klien, maka yang cukup dibuat adalah model klien nya saja. Model klien dapat dibuat pada file Client/models.py dengan isi sebagai berikut

Isi Client/models.

Dapat dilihat di gambar diatas, kita telah mengimplementasikan model yang cocok untuk klien yang ada di requiremnents. Dan dengan ini kita telah melakukan refactor code kita agar code yang kita buat dapat lolos uji unit test yang kita buat.

Maka mari kita coba jalankan python manage.py test kembali dan lihat hasilnya

wow ternyata berhasil lolos unit test!

BOOM! Ternyata dengan refactor kode sekali saja kita bisa lolos dari unit test yang kita buat tadi. (namun ini jarang terjadi apabila implementasinya sudah susah ya…). Oleh karena kita sudah lolos unit test, proses development requirement yang diatas dapat dilanjutkan dengan refactor kodenya agar lebih baik atau berhenti dan lanjut kepada requirement yang lainnya.

Lalu, code coverage itu apa dong bro?

Jadi tujuan dari unit test yang sudah kita buat adalah untuk menjamin kebenaran fungsionalitas dari setiap kode kita kan. Nah code coverage sendiri memiliki arti seperti seberapa besar unit test yang sudah kita buat meng-cover semua kode yang telah kita buat.

Ada orang bilang code coverage MINIMAL 100%. Lalu timbul pertanyaan, kenapa minimal kok 100% ?

Jawabannya adalah karena sejatinya unit test yang kita buat tak selalu menjamin semua kemungkinan-kemungkinan yang ada dari suatu requirement telah terpenuhi. Maka dari itu penyusunan unit test ini juga merupakan concern yang harus dipikirkan matang-matang agar unit test dapat mewakili setiap kemungkinan yang bisa terjadi di suatu requirements.

Contoh hasil code coverage

Kesimpulan

Jadi Test Driven Development adalah software development cycle yang fokus kepada bagaimana cara kita implementasi kode agar bisa lolos test yang telah kita buat. Dengan hal ini TDD memberikan manfaat untuk kita sebagai developer seperti :

  1. Kode yang kita buat memiliki jaminan yaitu test yang kita buat
  2. Kemudahan untuk mendebug suatu bug yang ada
  3. TDD membentuk pola pikir modular pada kode yang kita buat

Sekian penjelasan mengenai TDD dari saya. Silahkan tinggalkan komentar di kolom komen bawah ini, agar dapat memotivasi saya kedepannya. Happy Coding, Happy Life! Thanks !

--

--

Kevin Prakasa
PPL SeLaw

Studying CS at University of Indonesia | Front-End Developer at my own company