Lewati ke konten utama
menjadi.dev
Chapter 17.3 Backend Menengah

Bun: Testing, Scripting, dan Build

Manfaatkan toolkit lengkap Bun untuk development workflow

Tujuan Pembelajaran

  • Bisa menulis dan menjalankan test dengan bun:test
  • Mengerti shell scripting dengan Bun
  • Bisa build dan bundle project dengan Bun

Analogi

Diagram

      Bun Toolkit:
├── bun:test → Unit test (seperti Jest)
├── Bun.$ → Shell scripting
├── bun build → Production bundle
└── bun run → Package.json scripts
    

Bun menyediakan semua tools development dalam satu binary

Penjelasan Konsep

Setelah menguasai runtime Bun, saatnya mengeksplor toolkit lengkapnya untuk workflow development.

bun:test: Testing Built-in

Bun punya test runner built-in yang compatible dengan Jest API.

Tidak perlu install jest, @types/jest, ts-jest, atau config apa pun.

Support:

  • describe(), test(), it(), expect() — Jest-style API
  • beforeEach(), afterEach(), beforeAll(), afterAll()
  • expect().toBe(), toEqual(), toContain(),

ToThrow()

  • Mocking dengan jest.fn() compatible API
  • Snapshot testing
  • Watch mode dengan —watch

Bun.$: Shell Scripting

Bun menyediakan syntax shell scripting yang powerful di dalam file TypeScript/JavaScript.

Ini menggantikan kebutuhan akan bash script atau tools seperti zx.

const result = await $`ls -la`.text();
await $`echo 'Hello' > file.txt`;
const files = await $`find .

-name '*.ts'`.lines();

Notice: backtick template literal yang diawali $.

Ini menjalankan command shell dan mengembalikan output. Sangat berguna untuk automation, CI scripts, dan dev tools.

bun build: Production Bundle

Bun bisa bundle JavaScript/TypeScript untuk production. Keunggulan dibanding webpack/rollup:

  • Lebih cepat (native bundler)
  • Tree shaking otomatis
  • Minification built-in
  • Source map
  • Target environment configurable

Support format:

  • —format=esm (ES Modules)
  • —format=cjs (CommonJS)
  • —target=bun (untuk Bun runtime)
  • —target=node (untuk Node.js compatibility)
  • —target=browser (untuk browser)

bun run: Menjalankan Scripts

bun run bekerja seperti npm run, tapi lebih cepat. Perbedaan penting:

  • bun run membaca package.json scripts
  • Tidak perlu tulis run — bun dev sama dengan bun run dev
  • Pre/post scripts otomatis (bun prebuild akan dijalankan sebelum bun build)

Inti yang Perlu Dipahami

Bagian ini berfokus pada bisa menulis dan menjalankan test dengan bun:test., mengerti shell scripting dengan Bun., dan bisa build dan bundle project dengan Bun. Jangan terburu-buru menghafal istilahnya. Lebih penting untuk memahami peran setiap konsep dan kapan konsep itu muncul dalam pekerjaan web development.

Saat membaca Bun, gunakan tujuan belajar sebagai penanda arah. Kalau kamu sudah bisa menjelaskan tujuan itu dengan kata-katamu sendiri, berarti fondasinya mulai terbentuk.

Cara Membayangkannya

Bun menyediakan semua tools development dalam satu binary. Analogi ini dipakai supaya konsep teknis tidak terasa melayang. Hubungkan setiap istilah dengan perannya: siapa yang meminta, siapa yang memproses, data apa yang berpindah, dan hasil apa yang diharapkan.

Kalau analoginya sudah terasa masuk akal, barulah lihat istilah teknisnya. Cara ini membuat materi lebih mudah dipahami daripada langsung menghafal definisi.

Saat Melihat Contoh Kode

Contoh kode pada chapter ini memakai bahasa typescript. Bacalah contoh kode sebagai ilustrasi alur, bukan sebagai bagian yang harus langsung dihafal. bun:test API compatible dengan Jest — migration dari Jest sangat mudah. :memory: database untuk test isolation.

Perhatikan nama fungsi, urutan langkah, dan data yang berpindah. Biasanya tiga hal itu sudah cukup untuk memahami hubungan antara teori dan praktik.

Konteks dalam Perjalanan Belajar

Setiap konsep di platform ini dipilih karena dipakai di industri. Fokus pada pemahaman, bukan hafalan.

Kamu sudah di bagian lanjutan. Mulai pikirkan bagaimana konsep ini dipakai di dunia kerja — bukan hanya untuk belajar, tapi untuk membangun produk nyata.

Gunakan pertanyaan reflektif dan prompt AI di akhir chapter sebagai latihan aktif. Membaca saja tidak cukup — kamu perlu menjelaskan ulang dengan kata-katamu sendiri.

Contoh Kode

typescript
// bun:test example
import { describe, test, expect } from 'bun:test';
import { Database } from 'bun:sqlite';

describe('User Service', () => {
  const db = new Database(':memory:');
  
  test('should create user', () => {
    db.exec('CREATE TABLE users (id INTEGER PRIMARY KEY, name TEXT)');
    const result = db.prepare('INSERT INTO users (name) VALUES (?)').run('Budi');
    expect(result.lastInsertRowid).toBe(1);
  });
  
  test('should query users', () => {
    const users = db.query('SELECT * FROM users').all();
    expect(users).toHaveLength(1);
    expect(users[0].name).toBe('Budi');
  });
  
  test('should handle errors', () => {
    expect(() => {
      db.prepare('INSERT INTO users (id) VALUES (?)').run('not-a-number');
    }).toThrow();
  });
});

// Shell scripting
const output = await $`echo 'Hello Bun!'`.text();
console.log(output); // Hello Bun!

Penjelasan Kode

bun:test API compatible dengan Jest — migration dari Jest sangat mudah. :memory: database untuk test isolation.

Prompt AI

Tulis test untuk API endpoint Bun.serve() yang sudah kamu buat. Test GET, POST, dan 404 responses.

Pertanyaan Reflektif

Bandingkan waktu eksekusi test antara bun test dan jest di proyek yang sama.