Pengujian unit terkecil dari perangkat lunak โ fondasi utama untuk memastikan setiap bagian kode bekerja dengan benar dan aman.
Unit Testing adalah proses menguji bagian terkecil (unit) dari sebuah perangkat lunak secara terisolasi (terpisah dari bagian lain). Unit ini bisa berupa sebuah fungsi, method, atau class.
Bayangkan kamu sedang membuat sebuah kalkulator. Sebelum menguji seluruh kalkulator, kamu tes dulu satu per satu: fungsi penjumlahan benar nggak? Fungsi pembagian bisa handle pembagian nol nggak? Itulah unit testing.
| Prinsip | Penjelasan Mudah |
|---|---|
| Isolasi | Setiap tes berdiri sendiri, tidak tergantung pada komponen lain (database, API, dll.). Kalau tes gagal, kamu langsung tahu masalahnya di mana. |
| Independen | Urutan menjalankan tes tidak pengaruh. Tes A boleh jalan duluan atau tes B duluan, hasilnya harus sama. |
| Cepat | Unit test harus jalan sangat cepat (hitungan milidetik), karena jumlahnya bisa ribuan. |
| Fokus | Setiap tes hanya menguji SATU hal. Jangan campur-campur pengujian dalam satu tes. |
Framework adalah alat bantu yang memudahkan kita membuat dan menjalankan unit test. Berikut framework populer berdasarkan bahasa pemrograman:
| Bahasa | Framework | Keterangan |
|---|---|---|
| Java | JUnit, TestNG | JUnit paling populer untuk Java. TestNG mendukung parameterized testing. |
| C# / .NET | xUnit, NUnit, MSTest | xUnit lebih modern, NUnit klasik |
| Python | Pytest, unittest | Pytest lebih fleksibel dan banyak dipakai |
| JavaScript | Jest, Mocha, Jasmine | Jest paling populer untuk React/Node.js |
| PHP | PHPUnit | Standar testing untuk PHP |
| Go | testing (built-in) | Go sudah punya package testing bawaan |
Ingat saja: Java โ JUnit, Python โ Pytest, JS โ Jest. Tiga ini paling sering keluar di soal.
Ini adalah bagian paling penting dari materi ini. OWASP (Open Web Application Security Project) mendefinisikan Top 10 kerentanan keamanan web. Dalam unit testing, kita membuat tes khusus untuk memastikan kode kita tidak rentan terhadap ancaman-ancaman ini.
Unit testing bukan hanya soal "apakah fungsinya berjalan" tapi juga "apakah fungsinya aman dari serangan?". Kita harus memastikan bahwa di level unit (fungsi terkecil), kode sudah bisa menangani input berbahaya.
Apa itu? Ketika pengguna bisa mengakses sesuatu yang seharusnya tidak boleh mereka akses. Contoh: user biasa bisa masuk ke halaman admin.
Unit Test-nya: Uji bahwa fungsi otorisasi menolak akses jika role user tidak sesuai.
Apa itu? Kegagalan dalam melindungi data sensitif โ misalnya menyimpan password dalam bentuk plain text (teks biasa, tidak di-hash/enkripsi).
Unit Test-nya: Pastikan password yang disimpan tidak sama dengan password asli (artinya sudah di-hash).
Apa itu? Penyerang menyisipkan kode berbahaya melalui input โ misalnya memasukkan perintah SQL di form login. Contoh input jahat: ' OR 1=1 --
Unit Test-nya: Pastikan input berbahaya ditolak atau disanitasi.
Apa itu? Desain aplikasi yang sudah dari awal tidak memikirkan keamanan. Contoh: tidak ada pembatasan jumlah percobaan login (brute force).
Unit Test-nya: Uji bahwa setelah beberapa kali gagal login, akun terkunci.
Apa itu? Konfigurasi keamanan yang salah โ misalnya debug mode aktif di production, atau menggunakan password default.
Unit Test-nya: Pastikan konfigurasi keamanan sudah benar.
Apa itu? Menggunakan library atau framework yang sudah kadaluarsa dan memiliki celah keamanan yang sudah diketahui.
Unit Test-nya: Cek versi dependency apakah sudah di atas versi minimum yang aman.
Apa itu? Kelemahan dalam proses login/autentikasi โ misalnya menerima password lemah atau session yang tidak expired.
Unit Test-nya: Pastikan password lemah ditolak.
Apa itu? Kegagalan memastikan integritas software โ misalnya tidak memverifikasi checksum/signature saat update software.
Unit Test-nya: Pastikan file yang diunduh memiliki checksum yang valid.
Apa itu? Tidak adanya pencatatan (logging) aktivitas keamanan โ misalnya gagal login tidak dicatat, sehingga serangan tidak terdeteksi.
Unit Test-nya: Pastikan event keamanan tercatat di log.
Apa itu? Penyerang memanfaatkan server untuk melakukan request ke resource internal yang seharusnya tidak boleh diakses dari luar (misalnya http://localhost/admin).
Unit Test-nya: Pastikan URL internal diblokir.
Atau ingat urutan A1โA10 saja. Yang paling sering keluar di soal: Broken Access Control, Injection, Cryptographic Failures.
Karena unit test harus terisolasi, kita tidak bisa langsung terhubung ke database, API, atau layanan eksternal saat testing. Solusinya adalah menggunakan Mock โ objek tiruan yang meniru perilaku objek asli.
Kamu punya fungsi get_user_data() yang mengambil data dari database. Saat unit test, kamu mock fungsi database-nya agar mengembalikan data dummy tanpa perlu koneksi database sungguhan.
' OR 1=1 -- โ tes: harus ditolakassert result == "Access Denied"Apa tujuan utama unit testing dari perspektif keamanan perangkat lunak?
A. Menguji seluruh sistem secara bersamaan
B. Memastikan setiap fungsi terkecil mampu menangani input berbahaya secara terisolasi
C. Menguji performa server
D. Menguji UI aplikasi
Jawaban: B โ Unit testing dari perspektif keamanan bertujuan memastikan bahwa di level fungsi terkecil, kode sudah bisa menangani input berbahaya.
Seorang tester menulis unit test di mana akun guest mencoba mengakses fungsi admin dan hasilnya harus "Access Denied". Kerentanan OWASP apa yang sedang diuji?
A. SQL Injection
B. Cryptographic Failures
C. Broken Access Control
D. SSRF
Jawaban: C โ Broken Access Control adalah tentang pengguna yang mengakses resource yang seharusnya tidak boleh mereka akses.
Kenapa mocking/isolation penting dalam unit testing?
A. Agar tes bisa mengetes semua komponen sekaligus
B. Agar unit test dapat berjalan independen dari dependency eksternal seperti database
C. Agar tes bisa berjalan lebih lambat
D. Agar tes tergantung satu sama lain
Jawaban: B โ Mocking memungkinkan unit test berjalan tanpa perlu koneksi sungguhan ke dependency eksternal.
Kerjakan 15 soal berikut, lalu klik Submit untuk melihat hasilnya. Jawaban tersimpan otomatis.