Testing dengan node:test & assert

Menulis tes otomatis memakai test runner bawaan Node dan modul assert, termasuk tes async dan error.

Part 22 dari 24 ± 40 menit Gratis

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

  1. Arrange: siapkan data.
  2. Act: panggil fungsi yang dites.
  3. Assert: periksa hasilnya.

Modul assert

FungsiMemeriksa
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.matchTidak 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.

Praktikkan langsung, gratis

Tulis dan jalankan kode langsung di browser, dapatkan penilaian otomatis. Daftar gratis kapan saja untuk menyimpan progres dan meraih sertifikat.

Coba latihan sekarang, tanpa daftar
Bagikan: WhatsApp Facebook LinkedIn X