Menulis unit test adalah salah satu kebiasaan penting dalam pengembangan perangkat lunak. Bahkan untuk proyek JavaScript yang kecil, test membantu memastikan fungsi dasar tetap bekerja saat kode berubah. Jika Anda menggunakan Bun sebagai runtime JavaScript, package manager, dan toolchain, Anda juga mendapatkan fitur testing bawaan tanpa perlu memasang runner tambahan seperti Jest atau Mocha untuk kebutuhan dasar.

Artikel ini merupakan pengantar singkat namun praktis tentang Bun test runner. Fokusnya adalah membantu Anda memahami konsep dasar dengan cepat: apa itu Bun test, kapan berguna, bagaimana menulis unit test sederhana, cara menjalankannya, dan bagaimana membaca hasil test. Kita akan menggunakan contoh yang sangat sederhana agar konsep intinya mudah dipahami.

Apa Itu Bun Test Runner?

Bun test runner adalah fitur bawaan dari Bun untuk menjalankan test JavaScript dan TypeScript. Artinya, saat Anda sudah menggunakan Bun dalam proyek, Anda tidak perlu menambahkan tool testing dasar dari luar hanya untuk mulai menulis unit test sederhana.

Secara umum, test runner bertugas untuk:

  • Mencari file test di proyek Anda
  • Menjalankan fungsi test satu per satu
  • Melaporkan test yang lulus dan gagal
  • Memberi informasi error agar proses debugging lebih mudah

Keunggulan utama Bun test untuk pemula adalah lebih ringkas. Anda bisa langsung menulis test menggunakan API dasar seperti test() dan expect(), lalu menjalankannya dengan perintah Bun. Ini cocok untuk developer yang ingin mulai menerapkan testing tanpa konfigurasi yang rumit.

Jika kebutuhan Anda masih dasar, pendekatan ini cukup efisien: lebih sedikit dependensi, lebih sedikit setup, dan lebih cepat mulai bekerja.

Kapan Bun Test Berguna?

Bun test paling berguna ketika Anda ingin memverifikasi perilaku fungsi atau modul kecil secara konsisten. Misalnya:

  • Memastikan fungsi utilitas menghasilkan output yang benar
  • Mencegah bug saat refactor kode
  • Memastikan logika perhitungan tetap akurat
  • Memvalidasi perilaku fungsi sebelum dipakai di bagian aplikasi lain

Untuk developer JavaScript, unit test sederhana sangat membantu terutama pada kode yang memiliki input dan output jelas. Contoh klasiknya adalah fungsi penjumlahan, pengurutan data, validasi string, formatter tanggal, atau parser sederhana.

Bun test cocok digunakan ketika:

  • Anda sudah menggunakan Bun sebagai runtime proyek
  • Anda ingin pengalaman testing yang ringan
  • Anda membutuhkan test dasar tanpa konfigurasi kompleks
  • Anda ingin memulai praktik testing secepat mungkin

Namun, penting juga memahami batasannya. Untuk pengantar ini, kita sengaja tidak membahas topik lanjutan seperti mocking kompleks, coverage detail, atau integrasi lintas lingkungan. Tujuannya agar Anda benar-benar paham fondasi dasar terlebih dahulu.

Menyiapkan Proyek Sederhana

Jika Bun sudah terpasang di sistem Anda, Anda bisa mulai dari folder proyek kosong atau proyek JavaScript yang sudah ada. Untuk contoh sederhana, struktur proyek bisa seperti ini:

project-ku/
├── math.js
└── math.test.js

Kita akan membuat satu file untuk fungsi yang ingin diuji, dan satu file test.

Membuat Fungsi yang Akan Diuji

Buat file math.js:

export function tambah(a, b) {
  return a + b;
}

Fungsi ini sangat sederhana: menerima dua angka dan mengembalikan hasil penjumlahannya. Justru karena sederhana, fungsi ini ideal untuk memahami alur unit test tanpa distraksi dari logika bisnis yang rumit.

Membuat File Test

Lalu buat file math.test.js:

import { test, expect } from "bun:test";
import { tambah } from "./math";

test("tambah menjumlahkan dua angka dengan benar", () => {
  expect(tambah(2, 3)).toBe(5);
});

Ada beberapa hal penting dalam contoh di atas:

  • import { test, expect } from "bun:test"; digunakan untuk mengambil API testing bawaan Bun.
  • test("...", () => {}) mendefinisikan satu skenario pengujian.
  • expect(...).toBe(...) memeriksa apakah hasil aktual sama dengan nilai yang diharapkan.

Konsep utamanya sederhana: siapkan input, jalankan fungsi, lalu periksa hasilnya.

Menjalankan Test dengan Bun

Setelah file fungsi dan file test siap, Anda bisa menjalankan test dari terminal di direktori proyek:

bun test

Perintah ini akan meminta Bun mencari file test yang sesuai, lalu menjalankannya. Jika struktur file sederhana seperti contoh tadi, Bun akan menemukan math.test.js dan mengeksekusi test di dalamnya.

Jika semuanya benar, hasilnya akan menunjukkan bahwa test lulus. Tampilan output bisa sedikit berbeda tergantung versi dan lingkungan, tetapi secara umum Anda akan melihat informasi seperti:

  • Nama file test yang dijalankan
  • Nama skenario test
  • Status lulus atau gagal
  • Ringkasan jumlah test

Contoh hasil yang disederhanakan:

1 pass
0 fail
1 expect() calls

Anda tidak perlu menghafal format output secara persis. Yang terpenting adalah memahami indikator utamanya:

  • Pass berarti hasil aktual sesuai harapan
  • Fail berarti ada perbedaan antara hasil aktual dan hasil yang diharapkan, atau terjadi error saat test berjalan

Memahami Hasil Test dan Cara Membacanya

Saat baru mulai belajar testing, bagian yang paling penting bukan hanya menulis test, tetapi juga membaca hasil kegagalan. Informasi error dari test runner adalah alat debugging yang sangat berguna.

Contoh Test yang Gagal

Misalnya, ubah assertion menjadi salah:

import { test, expect } from "bun:test";
import { tambah } from "./math";

test("tambah menjumlahkan dua angka dengan benar", () => {
  expect(tambah(2, 3)).toBe(6);
});

Lalu jalankan kembali:

bun test

Kali ini test akan gagal, karena tambah(2, 3) menghasilkan 5, bukan 6. Output umumnya akan memberi tahu:

  • Nama test yang gagal
  • Nilai yang diharapkan
  • Nilai yang diterima
  • Lokasi baris file yang menyebabkan kegagalan

Dari sini Anda bisa langsung menilai apakah:

  • Kodenya yang salah
  • Test-nya yang salah
  • Ada asumsi yang keliru tentang perilaku fungsi

Inilah alasan mengapa test sangat membantu. Ia memberi umpan balik cepat setiap kali ada perubahan yang merusak perilaku yang seharusnya tetap benar.

Mengapa Assertion Penting?

Assertion seperti toBe() berfungsi sebagai definisi perilaku yang Anda harapkan. Tanpa assertion, test tidak benar-benar memverifikasi apa pun. Test yang baik selalu menjawab pertanyaan: hasil apa yang dianggap benar?

Pada contoh penjumlahan, perilaku yang didefinisikan sangat jelas: jika input 2 dan 3, maka hasilnya harus 5.

Contoh Menambah Beberapa Test Dasar

Satu test biasanya belum cukup. Sebaiknya tambahkan beberapa skenario agar fungsi diuji dari beberapa sudut. Misalnya:

import { test, expect } from "bun:test";
import { tambah } from "./math";

test("menjumlahkan dua angka positif", () => {
  expect(tambah(2, 3)).toBe(5);
});

test("menjumlahkan angka nol", () => {
  expect(tambah(0, 4)).toBe(4);
});

test("menjumlahkan angka negatif", () => {
  expect(tambah(-2, -3)).toBe(-5);
});

Contoh ini masih sederhana, tetapi lebih baik daripada hanya menguji satu kasus saja. Anda mulai mendokumentasikan perilaku fungsi secara lebih lengkap:

  • Kasus normal
  • Kasus dengan nol
  • Kasus dengan angka negatif

Ini adalah praktik yang baik dalam unit test: jangan hanya menguji “jalan bahagia”, tetapi juga kondisi yang realistis untuk fungsi tersebut.

Praktik Dasar yang Sebaiknya Diikuti

Walaupun Bun test mudah dipakai, ada beberapa kebiasaan sederhana yang membuat test lebih berguna dalam jangka panjang.

Gunakan Nama Test yang Jelas

Nama test sebaiknya menjelaskan perilaku, bukan sekadar “test 1” atau “cek fungsi”. Nama seperti menjumlahkan dua angka positif jauh lebih informatif saat output test muncul di terminal.

Uji Satu Perilaku per Test

Satu test idealnya fokus pada satu hal. Jika terlalu banyak assertion dan terlalu banyak skenario dicampur dalam satu blok test, hasil gagal akan lebih sulit dipahami.

Simpan Test Dekat dengan Modul yang Diuji

Untuk proyek kecil, meletakkan file test di folder yang sama atau dekat dengan file sumber memudahkan navigasi. Struktur sederhana lebih penting daripada arsitektur berlebihan pada tahap awal.

Jangan Menulis Test yang Terlalu Rumit di Awal

Bagi pemula, kesalahan umum adalah langsung mencoba semua fitur testing sekaligus. Mulailah dari fungsi kecil dan assertion yang jelas. Setelah terbiasa, barulah eksplorasi fitur yang lebih lanjut.

Kesalahan Umum dan Tips Debugging

Berikut beberapa masalah yang sering ditemui saat pertama kali menggunakan Bun test:

1. Salah Menulis Path Import

Jika file test tidak bisa menemukan modul, periksa path import seperti ./math. Kesalahan folder atau nama file adalah penyebab yang sangat umum.

2. Nama File Test Tidak Terdeteksi

Gunakan penamaan file yang lazim seperti *.test.js agar mudah dikenali dan dikelola. Ini juga membantu konsistensi di seluruh proyek.

3. Assertion Tidak Sesuai

Kadang fungsi sebenarnya benar, tetapi nilai yang diharapkan di test salah. Saat test gagal, jangan langsung mengasumsikan implementasinya rusak. Periksa juga logika test.

4. Mencampur Banyak Kasus dalam Satu Test

Ini membuat output sulit dibaca saat ada kegagalan. Pisahkan skenario menjadi beberapa blok test() yang singkat dan spesifik.

Tips Praktis Saat Debugging

  • Baca nama test yang gagal terlebih dahulu
  • Lihat nilai aktual dan nilai yang diharapkan
  • Periksa baris file yang ditunjukkan di output error
  • Pastikan input pada test memang sesuai dengan tujuan skenario
  • Jika perlu, sederhanakan test hingga hanya menyisakan satu assertion

Kapan Cukup Menggunakan Bun Test Dasar?

Untuk banyak proyek kecil hingga menengah, test dasar dengan Bun sudah sangat membantu. Jika Anda hanya perlu memverifikasi fungsi, utilitas, atau logika bisnis sederhana, pendekatan ini sudah memadai dan efisien.

Anda mungkin mulai membutuhkan alat atau pola tambahan jika:

  • Test Anda semakin banyak dan kompleks
  • Perlu simulasi dependensi eksternal secara detail
  • Perlu pengujian integrasi atau end-to-end yang lebih kaya
  • Perlu strategi testing yang lebih formal di pipeline CI/CD

Namun untuk tahap belajar dan kebutuhan unit test dasar, Bun test adalah titik awal yang sangat baik karena meminimalkan kompleksitas setup.

Penutup

Bun test runner memberi cara yang sederhana untuk mulai menulis unit test di JavaScript tanpa banyak konfigurasi tambahan. Dengan API dasar seperti test() dan expect(), Anda dapat memverifikasi perilaku fungsi secara cepat dan jelas.

Dari contoh fungsi penjumlahan tadi, kita belajar alur penting dalam testing: buat fungsi, tulis test, jalankan dengan bun test, lalu baca hasilnya. Walaupun contoh ini sederhana, prinsipnya sama untuk fungsi lain di proyek nyata.

Jika Anda baru mulai menerapkan testing, jangan mengejar kompleksitas terlebih dahulu. Mulailah dari fungsi kecil yang mudah dipahami, beri nama test dengan jelas, dan biasakan membaca output kegagalan dengan teliti. Dari sana, pemahaman Anda tentang testing akan berkembang secara alami bersama pertumbuhan proyek.