Testing dengan node:test & assert
Menulis tes otomatis memakai test runner bawaan Node dan modul assert, termasuk tes async dan error.
Kenapa menulis tes?
Mengetes manual ("klik-klik sambil lihat hasil") lambat dan tidak bisa diulang. Tes otomatis adalah kode yang memeriksa kodemu. Manfaatnya: bug tertangkap sebelum rilis, kamu berani refactor karena ada jaring pengaman, dan tes berfungsi sebagai dokumentasi perilaku yang benar.
Test runner bawaan: node:test
Sejak Node 18, tersedia test runner bawaan — tidak perlu Jest/Mocha untuk mulai. Cukup:
const test = require('node:test');
const assert = require('node:assert');
function hitungTotal(items, pajak = 0) {
const sub = items.reduce((jml, i) => jml + i.harga * i.qty, 0);
return Math.round(sub * (1 + pajak));
}
test('menjumlah harga x jumlah', () => {
const total = hitungTotal([{ harga: 10000, qty: 2 }, { harga: 5000, qty: 1 }]);
assert.strictEqual(total, 25000);
});
test('menambah pajak 10%', () => {
assert.strictEqual(hitungTotal([{ harga: 10000, qty: 1 }], 0.1), 11000);
});
Jalankan: node --test (otomatis mencari berkas *.test.js) atau node --test berkas.js.
Anatomi tes: Arrange – Act – Assert
- Arrange: siapkan data.
- Act: panggil fungsi yang dites.
- Assert: periksa hasilnya.
Modul assert
| Fungsi | Memeriksa |
|---|---|
assert.strictEqual(a, b) | a === b (pakai ini, bukan equal) |
assert.deepStrictEqual(a, b) | Objek/array sama isinya |
assert.ok(nilai) | Nilai truthy |
assert.throws(fn, /pesan/) | Fungsi melempar error |
await assert.rejects(promise) | Promise ditolak |
assert.notStrictEqual, assert.match | Tidak sama / cocok regex |
Tes untuk error
test('menolak harga negatif', () => {
assert.throws(() => hitungTotal([{ harga: -1, qty: 1 }]), /harga tidak valid/);
});
Tes asinkron
test('mengambil pengguna', async () => {
const user = await ambilPengguna(1);
assert.strictEqual(user.nama, 'Pengguna 1');
});
Mengelompokkan & hook
const { describe, it, beforeEach } = require('node:test');
describe('keranjang', () => {
let keranjang;
beforeEach(() => { keranjang = []; }); // disiapkan ulang sebelum tiap tes
it('mulai kosong', () => assert.strictEqual(keranjang.length, 0));
});
Menguji API Express
Jalankan server di port acak dalam tes, kirim permintaan dengan fetch, periksa status dan body. Pustaka supertest memudahkan ini tanpa membuka port sungguhan.
Tes yang baik
- Cepat dan independen (urutan tak boleh berpengaruh).
- Satu tes = satu perilaku, nama menjelaskan harapannya.
- Uji kasus batas: kosong, nol, negatif, sangat besar, input salah.
- Jangan menguji detail implementasi; uji perilaku yang bisa diamati.
- Tes yang gagal harus memberi pesan yang jelas.
Cakupan (coverage)
node --test --experimental-test-coverage menunjukkan baris mana yang tersentuh tes. Cakupan tinggi bukan jaminan kualitas, tetapi cakupan rendah pasti menandakan area berisiko.