Software Testing

Kelly William
Basic People
Published in
4 min readApr 4, 2019

Software Testing merupakan salah satu komponen penting dalam pengembangan perangkat lunak. Testing biasanya digunakan untuk mengukur kualitas dari sebuah code, yang disajikan dalam code coverage. Semakin tinggi code coverage, semakin bagus kualitas codenya.

Terdapat 3 jenis Testing dalam pengembangan perangkat lunak:

  • Unit Testing → Test a single unit, method, secara isolasi (individual function testing). Dapat menggunakan aplikasi Mocha, jUnit, Jasmine, dsb.
  • Integration Testing → Test integrasi dari beberapa unit (method, class, component, layer) yang membentuk sebuah sistem (system function testing). Untuk mencoba test ini, biasanya digunakan aplikasi yang sama seperti Unit Testing
  • Functional Testing → Test end-to-end scenario (dari perspektif user) (complete functionality testing). Untuk melakukan test ini, biasanya digunakan aplikasi Selenium

Apa Keuntungan membuat Testing?

  • Dengan adanya Testing, developer diwajibkan untuk menulis better code. Apabila code yang dibuat poorly designed, akan sangat sulit untuk membuat code.
  • Test sebagai backbone. Unit Test membantu perancangan code dan menyimpannya sebagai safety net apabila terdapat perubahan.
  • dsb.

Terdapat beberapa definisi terhadap not real object, yang disebutkan sebagai test double:

  • Dummy object → Object yang hanya digunakan untuk memenuhi parameter list
  • Fake object → membuat test implementation dimana terdapat dependensi terhadap external infrastructure (namun tidak benar-benar berinteraksi dengan external infrastructure)
  • Stubs → memberikan jawaban yang telah direkam untuk panggilan yang dilakukan selama testing, biasanya tidak menanggapi apa pun di luar apa yang diprogram untuk pengujian (isolated testing). Stubs disebut juga sebagai state-based
  • Mock → objects pre-programmed dengan ekspektasi dimana membentuk spesifikasi panggilan yang diharapkan untuk diterima. Mock disebut juga sebagai interaction-based
*SUT = System Under Test

Perbedaan antara Stub dan Mock:

  • Dari sisi kegunaannya, stub digunakan untuk state testing dan mock digunakan untuk behavioral testing
  • Dari sisi principle Test only one thing per test, terdapat beberapa stubs dalam sebuah test, namun hanya terdapat satu mock dalam sebuah test
  • Dari sisi lifecycle:

Stub:

  1. Setup — membuat object yang akan ditest
  2. Exercise — test fungsionalitas
  3. Verify state — menggunakan assert untuk mengecek object’s state
  4. Teardown — membersihkan resources

Mock:

  1. Setup — membuat object yang akan di test
  2. Setup Expectations — membuat ekspektasi mock yang akan digunakan sebagai object
  3. Exercise — test fungsionalitas
  4. Verify Expectations — verifikasi bahwa method telah dipanggil secara benar dalam mock
  5. Verify state — menggunakan assert untuk mengecek object’s state
  6. Teardown — membersihkan resources

Penerapan / Pengalaman terkait Software Testing:

Contoh UnitTest (menggunakan expect) dari fungsi Komentar
Contoh fungsi Komentar
Contoh UnitTest (menggunakan assert)

Apa yang membedakan assert dengan expect?

Dalam penggunaan assert, apabila test tidak berjalan, maka fungsi akan dimatikan (juga tidak berjalan). Assert hanya mengungkapkan satu kegagalan per test (diambil test yang paling pertama error) sehingga bisa diperbaiki terlebiih dahulu.

Dalam penggunaan expect, apabila test tidak berjalan, maka fungsi akan tetap bisa berjalan. Expect mengungkapkan lebih banyak kegagalan dalam satu kali proses, dan memungkinkan lebih banyak perbaikan dalam satu siklus.

Contoh implementasi component dari ProfilInstansi
Tests pada component ProfilInstansi

Terdapat 5 tests yang dilakukan pada component ProfilInstansi, yaitu mengecek apakah component berhasil render tanpa crash, component render correctly, nama button ditulis dengan benar, terdapat props dengan namaInstansi, dan namaInstansi dapat terbaca.

Pertama, untuk mengecek apakah render berhasil tanpa crash, kita dapat membuat sebuah div baru, kemudian merender ProfilInstansi dengan div tersebut.

Untuk test-test berikutnya, kami menggunakan modal berupa shallow dan mount dari enzyme. Enzyme merupakan external library yang kami gunakan untuk melakukan mock tests. Enzyme sendiri terbagi menjadi dua tipe, yaitu shallow dan mount. Kita dapat menggunakan shallow apabila kita ingin mengetes suatu komponen sebagai satu unit dan memastikan bahwa test yang dibuat tidak assert ke behaviour child componentsnya. *snapshot adalah salah satu pengaturan yang digunakan untuk memastikan bahwa implementasi tidak berubah secara drastis.

Kemudian, kita dapat menggunakan mount apabila kita ingin mengetes memasukkan suatu parameter kedalam component ProfilInstansi (contoh: test keempat kita membuat sebuah props dimana terdapat namaInstansi, kemudian dilakukan pengecekan apakah namaInstansi terdapat pada props tersebut dan test kelima melakukan pengecekan apakah props dari nama Instansi sama dengan props yang dibuat di test)

Apa Keunggulan menggunakan Shallow daripada Mount?

  • Penggunaan mount memakan waktu yang sangat lama (lambat)
  • Penggunaan mount mungkin berhasil hari ini, namun apabila terdapat perubahan component yang mendasarinya — BUM FAILED!
  • Penggunaan shallow digunakan hanya untuk test yang ingin di test dan berada pada scope yang diinginkan (tidak berpengaruh pada component lainnya)

Shallow just records calls to React.createElement but never _creates_ any element. That’s why it does not render ANYTHING else.

Sekian dari saya mengenai Test Stub & Mock, terima kasih telah membaca!

--

--