Welcome Guest [Log In] [Register]
Add Reply
Empat Alasan Untuk Melakukan Unit Test
Topic Started: Sep 9 2012, 10:25 PM (240 Views)
jockihendry
Member Avatar
32-bit
[ *  *  * ]
Berhubung sudah ada yang nge-post di forum ini, gw ikutan juga. Topiknya adalah mengapa kita perlu melakukan unit test?

Kebanyakan developer mulai membangun sebuah sistem mulai dari back-end, misalnya mulai dari DAO dan Service Layer. Setelah back-end selesai, biasanya developer baru beralih ke front-end (presentation layer, seperti PHP, JSP, dan HTML). Pertanyaannya adalah pada saat back-end selesai dibangun, bagaimana developer bisa yakin back-end nya sudah benar dan bisa jalan? Padahal, kita tahu bahwa untuk menguji sebuah program baik web maupun desktop harus ada tampilan dulu (presentation layer) yang bisa di-klik/di-ketik, bukankah begitu? Tidak! Kita bisa menguji dengan unit test, misalnya dengan JUnit atau PHPUnit.

Sebagai contoh, untuk menguji method login di class UserService, developer bisa membuat unit test berikut:
Code:
 

public class UserServiceTest {

// ...
// kode lainnya tidak ditunjukkan
// ...

@Test
public void testLogin() {
Pegawai userPegawai = new Pegawai();
userPegawai.setEmail("pegawai@yahoo.com");
userPegawai.setNama("nama pegawai");
userPegawai.setPassword("password");
userPegawai.setPeran(PeranPegawai.KASIR);
userPegawai = (Pegawai) userService.saveUser(userPegawai);
assertEquals(1, super.countRowsInTable("user"));

assertEquals(userPegawai, userService.login("pegawai@yahoo.com.com", "password"));
assertEquals(null, userService.login("pegawai@hotmail.com", "sembarangan"));
assertEquals(null, userService.login("sembarangan", "password"));
}

}


Pada kode program di atas, developer menyimpan sebuah objek User dengan memanggil service saveUser().

Lalu dengan assertEquals(1, super.countRowsInTable("user")), developer memastikan bahwa pada database harus ada 1 record. Bila tidak ada record baru, maka method tidak akan lulus ujian.

Setelah itu, developer menguji service login(). Ia memberikan tiga assert: pertama, untuk kasus username dan password benar; kedua, untuk kasus username benar dan password salah; dan ketiga, untuk kasus username salah dan password benar.

Contoh tampilan hasil pengujian unit test untuk seluruh service di class User di Eclipse STS:

Posted Image

Jadi, mengapa kita perlu melakukan unit test?


  • Untuk meningkatkan kepercayaan diri atas kode program yang kita buat. Jika kode program telah lulus unit test, maka kita bisa yakin kode program kita sudah benar walaupun saat itu presentation layer (tampilan) belum dibuat.
  • Selama pengembangan sistem, kita pasti akan sering mengubah kode program yang ada. Unit test akan memperingatkan kita bila perubahan yang kita lakukan secara tidak terduga membuat method di class lain menjadi tidak berfungsi.
  • Unit test memperjelas bagaimana cara memakai class kita. Seorang developer mungkin saja membuat class yang tidak pernah dipakai oleh dirinya sendiri sehingga ia tidak pernah merasakan 'kualitas' class-nya sebelum dipakai pengguna. Sebagai contoh, seorang developer back-end akan jarang sekali pernah membuat front-end. Pada saat developer tersebut membuat unit test case, ia merasakan bagaimana memakai class buatannya sendiri yang akan memberi masukan bagi dirinya secara otomatis.
  • Pada kebanyakan pengembangan extreme programming, program dikembangkan berdasarkan test case. Developer mulai dengan membuat unit test dimana hasilnya adalah fail semua (karena kode program yang di-test belum dibuat). Lalu, seiring waktu ,developer membuat satu per satu dari test case yang fail menjadi sukses dengan meng-implementasi-kan kode program.


INFO: Sebenarnya yang saya tunjukkan disini disebut integration test, dan kode program di atas tidak hanya memakai JUnit tetapi AbstractTransactionalJUnit4SpringContextTests dari Spring yang secara otomatis akan mengosongkan database sebelum dan setelah mulai menguji (atau teknis-nya: rollback transaction)
Attached to this post:
Attachments: gambar1.png (12.81 KB)
Edited by jockihendry, Sep 9 2012, 10:34 PM.
Offline Profile Quote Post Goto Top
 
zhang
Member Avatar
Hotchick Hunter
[ * ]
wow!!
kalau wa sendiri bikin program selalu presentation Layer yang pertama, trus baru Logic dan database xD

btw, unit test ini tujuannya sama kayak COMTESTER yang pernah dibuat kemaren ya?
penjelasan umumnya, untuk mengetahui hasil dari function/method yang kita hasilkan, berfungsi atau tidak :)

Offline Profile Quote Post Goto Top
 
dreamteather
Member Avatar
16-bit
[ *  * ]
Posted Image
maksud dari angka dibelakang apa bro??? testing yang anda lakukan menunjukkan apa aja?
maklum newbie..perlu petunjuk.. :P :P
Edited by dreamteather, Sep 10 2012, 12:44 PM.
Offline Profile Quote Post Goto Top
 
jockihendry
Member Avatar
32-bit
[ *  *  * ]
zhang
Sep 10 2012, 05:17 AM
wow!!
kalau wa sendiri bikin program selalu presentation Layer yang pertama, trus baru Logic dan database xD

btw, unit test ini tujuannya sama kayak COMTESTER yang pernah dibuat kemaren ya?
penjelasan umumnya, untuk mengetahui hasil dari function/method yang kita hasilkan, berfungsi atau tidak :)


Haha.. tergantung situasi dan kondisi, pada beberapa kasus, bisa jadi itu memang pilihan terbaik. Seandainya kalau kita punya banyak resources (punya banyak programmer), lebih baik lagi kalau front-end dan back-end dikerjakan secara serempak sehingga proyek lebih cepat selesai.

Beda dengan COMTESTER.. Kalo COMTESTER itu sebuah tools yang harus dijalankan secara manual. Sementara unit test disini adalah sebuah pengujian yang dilakukan secara otomatis. Analoginya: Bayangkan jika kamu punya robot-robot yang setiap kali kamu melakukan kesalahan, dia akan memberitahu kamu. Berbeda dengan syntax error yang highlight hanya merah2, unit test memastikan sebuah class benar-benar bekerja seperti yang kita harapkan. Misalnya, jika kamu mengharapkan method A bisa INSERT 1 record ke database, maka unit test akan memberitahu kamu jika method tersebut ternyata ga bisa insert :)

dreamteather
Sep 10 2012, 12:43 PM
Posted Image
maksud dari angka dibelakang apa bro??? testing yang anda lakukan menunjukkan apa aja?
maklum newbie..perlu petunjuk.. :P :P


Angka di belakang itu adalah berapa lama waktu yang diperlukan untuk mengerjakan testing method tersebut. Misalnya, untuk menguji method getUser(), saya membuat fungsi testGestUser() yang selesai dikerjakan dalam waktu 0,079 detik (s). Warna hijau dan tanda centang menunjukkan bahwa test sukses sesuai harapan. Warna merah memberitahukan bahwa test gagal karena syntax error. Warna kelam menunjukkan bahwa walaupun ga ada syntax error, secara logika ada yang salah (assert fail).

Testing yang saya melakukan, misalnya di testGetUser(), saya menyimpan sebuah User, kemudian saya memanggil getUser(), dan saya membandingkan apakah User yang saya get persis sama seperti yang akan saya simpan.

Begitu juga, misalnya di testDeleteUser(), saya menyimpan sebuah User. lalu saya memanggil deleteUser(), lalu saya memeriksa (dengan assert) untuk memastikan di database sudah kosong.

Dan sebagainya... :)
Offline Profile Quote Post Goto Top
 
zhang
Member Avatar
Hotchick Hunter
[ * ]
jockihendry
Sep 9 2012, 10:25 PM
Contoh tampilan hasil pengujian unit test untuk seluruh service di class User di Eclipse STS:

Posted Image
wah Jock, ada yg diatas 6,303 s itu hasil testnya,

kok bisa paling lama sendiri ya?
apakah terlalu berat atau data yg di load terlalu besar?
Offline Profile Quote Post Goto Top
 
jockihendry
Member Avatar
32-bit
[ *  *  * ]
Wow.. Ga tau tuh.. Gw blom memeriksa isinya seperti apa...

Hahaha...Biarpun gw blom bikin tampilan, ternyata sudah ketahuan ada satu method yang bakal lama kalau dipanggil.. Semua berkat unit tes dan ketelitian orang yang melihat hasil unit test-nya :)
Offline Profile Quote Post Goto Top
 
zhang
Member Avatar
Hotchick Hunter
[ * ]
jockihendry
Sep 10 2012, 07:09 PM
Wow.. Ga tau tuh.. Gw blom memeriksa isinya seperti apa...

Hahaha...Biarpun gw blom bikin tampilan, ternyata sudah ketahuan ada satu method yang bakal lama kalau dipanggil.. Semua berkat unit tes dan ketelitian orang yang melihat hasil unit test-nya :)
nah satu pertanyaan dariku...

kecepatan yang diberikan oleh UNIT TEST ini, secara standar/umum atau tidak??

maksudnya, apakah dipengaruhi juga dengan spek komputer kita??



btw, itu di atas bisa tembus 6 second, pdhal method lain hanya nol koma seper sekian detik,
pasti ada problem tuh di codingnya, hehehehe..

soalnya rentang waktu antara method itu dan method lain bedanya beratus" kali lipat
Offline Profile Quote Post Goto Top
 
jockihendry
Member Avatar
32-bit
[ *  *  * ]
zhang
Sep 10 2012, 10:21 PM
jockihendry
Sep 10 2012, 07:09 PM
Wow.. Ga tau tuh.. Gw blom memeriksa isinya seperti apa...

Hahaha...Biarpun gw blom bikin tampilan, ternyata sudah ketahuan ada satu method yang bakal lama kalau dipanggil.. Semua berkat unit tes dan ketelitian orang yang melihat hasil unit test-nya :)
nah satu pertanyaan dariku...

kecepatan yang diberikan oleh UNIT TEST ini, secara standar/umum atau tidak??

maksudnya, apakah dipengaruhi juga dengan spek komputer kita??



btw, itu di atas bisa tembus 6 second, pdhal method lain hanya nol koma seper sekian detik,
pasti ada problem tuh di codingnya, hehehehe..

soalnya rentang waktu antara method itu dan method lain bedanya beratus" kali lipat
Kecepatan yang diberikan itu tergantung pada komputer kita.. Sangat sulit membuat benchmark yg seragam dan tidak tergantung dengan hardware yang dipakai dalam benchmark. Dalam dunia industri TI, yang paling mendekati untuk mengukur 'kecepatan' adalah Transaction Per Second (TPS) = berapa banyak transaksi yg bisa di-handle dalam 1 detik..

Tapi itu diluar topik JUnit, karena fungsi JUnit hanya untuk unit testing.

Yup, benar, ada yang patut dicurigai di method tersebut dan perlu diperiksa ;)
Offline Profile Quote Post Goto Top
 
dreamteather
Member Avatar
16-bit
[ *  * ]
Quote:
 
Angka di belakang itu adalah berapa lama waktu yang diperlukan untuk mengerjakan testing method tersebut. Misalnya, untuk menguji method getUser(), saya membuat fungsi testGestUser() yang selesai dikerjakan dalam waktu 0,079 detik (s). Warna hijau dan tanda centang menunjukkan bahwa test sukses sesuai harapan. Warna merah memberitahukan bahwa test gagal karena syntax error. Warna kelam menunjukkan bahwa walaupun ga ada syntax error, secara logika ada yang salah (assert fail).

Testing yang saya melakukan, misalnya di testGetUser(), saya menyimpan sebuah User, kemudian saya memanggil getUser(), dan saya membandingkan apakah User yang saya get persis sama seperti yang akan saya simpan.

Begitu juga, misalnya di testDeleteUser(), saya menyimpan sebuah User. lalu saya memanggil deleteUser(), lalu saya memeriksa (dengan assert) untuk memastikan di database sudah kosong.

Dan sebagainya... :)

ow...tq jadi ngerti hahahah.. :P :P
Offline Profile Quote Post Goto Top
 
1 user reading this topic (1 Guest and 0 Anonymous)
ZetaBoards - Free Forum Hosting
Fully Featured & Customizable Free Forums
Learn More · Sign-up Now
« Previous Topic · Dokumentasi dan Pengujian · Next Topic »
Add Reply