Bab 6 โ€” Materi + Quiz 9

๐Ÿงช Unit Testing

Pengujian unit terkecil dari perangkat lunak โ€” fondasi utama untuk memastikan setiap bagian kode bekerja dengan benar dan aman.

๐Ÿ“‘ Daftar Isi

  1. Apa Itu Unit Testing?
  2. Framework Unit Testing
  3. Keuntungan Unit Testing
  4. OWASP-Based Unit Testing
  5. Mocking & Isolation
  6. Poin-Poin Penting
  7. Tips Menghafal
  8. Contoh Soal & Jawaban
  9. Latihan Soal Interaktif

๐Ÿ“– Apa Itu Unit Testing?

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.

Tujuan Unit Testing

4 Prinsip Utama Unit Testing

PrinsipPenjelasan Mudah
IsolasiSetiap tes berdiri sendiri, tidak tergantung pada komponen lain (database, API, dll.). Kalau tes gagal, kamu langsung tahu masalahnya di mana.
IndependenUrutan menjalankan tes tidak pengaruh. Tes A boleh jalan duluan atau tes B duluan, hasilnya harus sama.
CepatUnit test harus jalan sangat cepat (hitungan milidetik), karena jumlahnya bisa ribuan.
FokusSetiap tes hanya menguji SATU hal. Jangan campur-campur pengujian dalam satu tes.

๐Ÿ’ก Tips Hafalan: "I-I-C-F" โ†’ Ingat "IICF"

  • Isolasi โ€” Sendirian (terisolasi)
  • Independen โ€” Bebas urutan
  • Cepat โ€” Kilat
  • Fokus โ€” Satu hal saja

๐Ÿ› ๏ธ Framework Unit Testing

Framework adalah alat bantu yang memudahkan kita membuat dan menjalankan unit test. Berikut framework populer berdasarkan bahasa pemrograman:

BahasaFrameworkKeterangan
JavaJUnit, TestNGJUnit paling populer untuk Java. TestNG mendukung parameterized testing.
C# / .NETxUnit, NUnit, MSTestxUnit lebih modern, NUnit klasik
PythonPytest, unittestPytest lebih fleksibel dan banyak dipakai
JavaScriptJest, Mocha, JasmineJest paling populer untuk React/Node.js
PHPPHPUnitStandar testing untuk PHP
Gotesting (built-in)Go sudah punya package testing bawaan

๐Ÿ’ก Tips Hafalan Framework

Ingat saja: Java โ†’ JUnit, Python โ†’ Pytest, JS โ†’ Jest. Tiga ini paling sering keluar di soal.

๐ŸŽฏ Keuntungan Unit Testing

๐Ÿ” OWASP-Based Unit Testing (Sangat Penting!)

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.

โš ๏ธ Kenapa OWASP-Based Unit Testing Penting?

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.

A1: Broken Access Control

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.

# Contoh: Tes akses ke fungsi admin oleh user biasa def test_guest_cannot_access_admin(): user = User(role="guest") result = access_admin_panel(user) assert result == "Access Denied"

A2: Cryptographic Failures

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).

def test_password_is_hashed(): password = "mypassword123" hashed = hash_password(password) assert hashed != password # Harus berbeda! assert len(hashed) > 20 # Hash biasanya panjang

A3: Injection (SQL Injection)

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.

def test_sql_injection_prevented(): malicious_input = "' OR 1=1 --" result = login(malicious_input, "any") assert result == "Login Failed" # TIDAK boleh berhasil login!

A4: Insecure Design

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.

def test_account_lockout_after_failed_attempts(): for i in range(5): login("user", "wrong_pass") result = login("user", "correct_pass") assert result == "Account Locked"

A5: Security Misconfiguration

Apa itu? Konfigurasi keamanan yang salah โ€” misalnya debug mode aktif di production, atau menggunakan password default.

Unit Test-nya: Pastikan konfigurasi keamanan sudah benar.

def test_debug_mode_disabled_in_production(): config = load_config("production") assert config["DEBUG"] == False

A6: Vulnerable and Outdated Components

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.

A7: Identification and Authentication Failures

Apa itu? Kelemahan dalam proses login/autentikasi โ€” misalnya menerima password lemah atau session yang tidak expired.

Unit Test-nya: Pastikan password lemah ditolak.

def test_weak_password_rejected(): result = register("user", "123") # Password terlalu pendek assert result == "Password Too Weak"

A8: Software and Data Integrity Failures

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.

A9: Security Logging and Monitoring Failures

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.

def test_failed_login_is_logged(): login("user", "wrong") logs = get_security_logs() assert "Failed login attempt" in logs

A10: Server-Side Request Forgery (SSRF)

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.

def test_ssrf_internal_url_blocked(): result = fetch_url("http://localhost/admin") assert result == "Blocked: Internal URL not allowed"

๐Ÿ’ก Tips Hafalan OWASP Top 10 โ€” "BCIIS VISSS"

  • Broken Access Control
  • Cryptographic Failures
  • Injection
  • Insecure Design
  • Security Misconfiguration
  • Vulnerable Components
  • Identification & Auth Failures
  • Software Integrity Failures
  • Security Logging Failures
  • SSRF

Atau ingat urutan A1โ€“A10 saja. Yang paling sering keluar di soal: Broken Access Control, Injection, Cryptographic Failures.

๐Ÿงฉ Mocking & Isolation dalam Unit Testing

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.

Kenapa Perlu Mocking?

Contoh Skenario

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.

๐Ÿ“Œ Poin-Poin Penting (WAJIB DIHAPAL)

โœ… Ringkasan Kunci untuk UAS

  1. Unit Testing = menguji bagian terkecil dari software secara terisolasi
  2. 4 Prinsip: Isolasi, Independen, Cepat, Fokus
  3. Tujuan utama dari perspektif keamanan: memastikan setiap fungsi terkecil mampu menangani input berbahaya
  4. Broken Access Control = user biasa bisa akses fungsi admin โ†’ harus diuji dengan unit test
  5. Cryptographic Failures = password disimpan plain text โ†’ tes: hash โ‰  password asli
  6. Injection = input seperti ' OR 1=1 -- โ†’ tes: harus ditolak
  7. Mocking digunakan agar unit test tetap terisolasi dari dependency eksternal (database, API, dll.)
  8. Framework: Java โ†’ JUnit, Python โ†’ Pytest, JavaScript โ†’ Jest
  9. Unit test = bukan untuk menguji integrasi antar komponen, itu tugas Integration Testing
  10. Setiap tes hanya menguji SATU hal (prinsip Fokus)

๐Ÿง  TIPS MENGHAFAL โ€” Bab 6: Unit Testing

  1. "IICF" โ†’ 4 Prinsip Unit Testing: Isolasi (sendirian), Independen (bebas urutan), Cepat (kilat), Fokus (satu hal saja). Bayangkan orang yang kerja sendiri (isolasi), bebas (independen), cepat, dan fokus.
  2. "Java โ†’ JUnit, Python โ†’ Pytest, JS โ†’ Jest" โ†’ Tiga framework paling penting. Semua berawalan huruf J/P! Java=JUnit, Python=Pytest, JavaScript=Jest.
  3. "BCIIS VISSS" โ†’ OWASP Top 10: Broken access, Crypto, Injection, Insecure design, Security misconfig, Vulnerable comp, ID/Auth fail, Software integrity, Security logging, SSRF.
  4. "Guest = Denied" โ†’ Broken Access Control. Bayangkan tamu hotel (guest) mencoba masuk ruang VIP dan ditolak satpam. assert result == "Access Denied"
  5. "Hash โ‰  Asli" โ†’ Cryptographic Failures. Password harus di-hash, jadi yang disimpan BEDA dari yang diketik.
  6. "' OR 1=1 -- = SQL Injection" โ†’ Payload klasik SQL Injection. Kalau lihat tanda kutip + OR + angka, itu pasti Injection.
  7. "5x Gagal = Terkunci" โ†’ Insecure Design. Tidak ada lockout mechanism berarti desainnya tidak aman.
  8. "Debug Mode ON di Production = Misconfiguration" โ†’ Security Misconfiguration. Production harus DEBUG=False.
  9. "Mock = Tiruan" โ†’ Mocking menggantikan database/API sungguhan dengan yang palsu agar tes tetap cepat dan terisolasi.
  10. "Dokumentasi Hidup" โ†’ Unit test bukan cuma tes, tapi juga menjelaskan bagaimana fungsi seharusnya bekerja. Lebih baik dari komentar biasa.

๐Ÿ“ Contoh Soal & Jawaban

Contoh Soal 1

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.

Contoh Soal 2

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.

Contoh Soal 3

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.

๐ŸŽฎ Latihan Soal Interaktif โ€” Unit Testing

Kerjakan 15 soal berikut, lalu klik Submit untuk melihat hasilnya. Jawaban tersimpan otomatis.

0/15
Skor Anda

Lanjut ke Bab 6: Regression Testing โ†’