Kenapa Testing? Jenis Tes & Tes Pertamamu
Memahami manfaat testing, piramida tes (unit, integrasi, end-to-end), dan menulis tes pertama dengan node:test dan assert.
Pernahkah kamu "memperbaiki satu hal, merusak hal lain"?
Kamu mengubah satu fungsi untuk memperbaiki bug, lalu beberapa hari kemudian pengguna melapor bahwa fitur lain — yang tidak kamu sentuh — rusak. Ini terjadi di semua proyek yang membesar. Testing otomatis adalah jaring pengaman: kode kecil yang memeriksa kode utama setiap kali kamu menjalankannya. Perubahan yang merusak sesuatu langsung ketahuan, dalam hitungan detik, sebelum sampai ke pengguna.
Manfaat nyata
| Manfaat | Penjelasan |
|---|---|
| Keberanian mengubah kode | Refactor tanpa takut: tes yang masih hijau berarti perilaku terjaga. |
| Dokumentasi yang hidup | Tes menunjukkan cara memakai fungsi dan perilaku yang diharapkan — dan tidak pernah kedaluwarsa karena selalu dijalankan. |
| Bug ketahuan lebih awal | Memperbaiki bug di laptop jauh lebih murah daripada di produksi. |
| Desain lebih baik | Kode yang sulit dites biasanya terlalu saling terikat; menulis tes mendorong desain yang rapi. |
| Bukti saat kolaborasi | Tim bisa menggabungkan kode dengan percaya diri; CI menolak perubahan yang merusak. |
Piramida tes
/\ E2E (end-to-end)
/ \ Sedikit, lambat, mahal: seluruh sistem seperti pengguna sungguhan
/----\
/ \ Integrasi
/ \ Beberapa komponen bersama: API + database, API + layanan lain
/----------\
/ \ Unit
/______________\ Banyak, cepat, murah: satu fungsi/kelas diuji terpisah
| Jenis | Yang diuji | Kecepatan | Contoh backend |
|---|---|---|---|
| Unit | Satu fungsi/kelas, terisolasi | Milidetik | hitungOngkir(berat, jarak) |
| Integrasi | Beberapa bagian bekerja bersama | Detik | Endpoint POST /pesanan menyimpan ke database |
| End-to-end | Alur lengkap lewat antarmuka | Puluhan detik | Daftar → login → beli → bayar |
Aturan praktis: banyak tes unit, cukup tes integrasi, sedikit tes E2E. Tes yang lambat jarang dijalankan; tes yang tidak dijalankan tidak berguna.
Alat yang kita pakai: node:test dan assert
Node.js punya pelari tes bawaan (node:test) dan modul assert untuk memeriksa hasil. Tanpa instalasi apa pun, kamu bisa menulis:
const test = require('node:test');
const assert = require('node:assert');
function tambah(a, b) {
return a + b;
}
test('tambah menjumlahkan dua angka', () => {
assert.strictEqual(tambah(2, 3), 5);
});
Sebuah tes terdiri dari: nama yang menjelaskan perilaku, dan fungsi yang berisi satu atau lebih assertion. Jika semua assertion lolos, tes lulus (✔). Jika salah satu gagal, ia melempar error dan tes gagal (✖) dengan pesan yang menunjukkan nilai yang diharapkan dan yang diterima.
Di dunia nyata kamu akan sering melihat Jest atau Vitest (describe/it/expect). Konsepnya identik; di bab 18 kita bandingkan dan bahkan membuat mini-expect sendiri.
Cara latihan di course ini
- Beberapa berkas kode sudah disediakan (mis.
kalkulator.js); kamu menulis tesnya di editor dan memuatnya denganrequire('./kalkulator'). - Saat Jalankan, tesmu dieksekusi, lalu penilai memeriksa dua hal: tesmu lulus pada kode yang benar, dan tesmu gagal pada versi kode yang sengaja dirusak ("mutan"). Inilah ukuran tes yang berkualitas: tes yang tidak pernah gagal tidak melindungi apa pun.
Kesalahan umum pemula
- Menulis tes yang selalu lulus karena tidak ada assertion (
test('x', () => { tambah(1, 2); })tidak memeriksa apa pun). - Mengetes banyak hal dalam satu tes sehingga sulit mengetahui yang gagal.
- Menguji hanya jalur yang "normal"; bug sering bersembunyi di tepi (nol, kosong, negatif).