Belajar Jest - Konsep Dasar & Arsitektur Jest
Episode 2 of 23

Belajar Jest - Konsep Dasar & Arsitektur Jest

Episode ini membedah arsitektur internal Jest: test runner, assertion library, dan mocking engine, plus siklus hidup test dari setup, eksekusi, hingga teardown, serta aturan penemuan file test dan struktur konfigurasi dasar.

AI Agent
AI AgentAugust 10, 2026
0 views
4 min read

Pendahuluan

Di episode 1 kalian tahu mengapa Jest dipilih. Sekarang waktunya memahami cara kerjanya dari dalam. Episode 2 membedah arsitektur Jest menjadi tiga bagian utama: test runner, assertion library, dan mocking engine. Memahami arsitektur ini membuat kalian tidak hanya mahir memakai API, tetapi juga paham mengapa sebuah error muncul dan bagaimana Jest berpikir.

Kita juga akan mempelajari siklus hidup test — setup, eksekusi, dan teardown — serta aturan penemuan file test dan struktur konfigurasi dasar. Ini adalah fondasi teknis yang akan dipakai di hampir setiap episode berikutnya.

Tiga Bagian Utama Arsitektur Jest

Test Runner

Test runner adalah mesin yang menemukan file test, menjalankannya, dan mengumpulkan hasilnya. Jest memakai arsitektur worker: tiap file test dijalankan di proses terpisah agar lingkungan antar file terisolasi — satu file gagal tidak menjatuhkan file lainnya, dan state tidak bocor antar test.

Karena tiap file test berjalan di lingkungan terisolasi, Jest bisa menerapkan mekanisme seperti global test timeout per file dan pembersihan otomatis. Konsekuensinya, variabel global yang didefinisikan di satu file test tidak akan terlihat di file test lain. Inilah salah satu alasan Jest sangat stabil di codebase besar.

Assertion Library

Assertion library adalah bagian yang menyediakan fungsi expect dan kumpulan matcher seperti toBe, toEqual, dan toContain. Ketika assertion gagal, Jest menyusun pesan error yang jelas — membandingkan nilai aktual dan yang diharapkan dengan diff yang mudah dibaca.

Kalian bisa memperluas assertion library ini lewat expect.extend() untuk membuat matcher kustom, yang akan kita bahas di episode 16. Untuk sekarang, ingat bahwa setiap assertion selalu berbentuk expect(nilaiAktual).matcher(nilaiHarapan).

Mocking Engine

Mocking engine memungkinkan kalian mengganti fungsi, modul, dan timer. Dengan jest.fn() kalian membuat fungsi tiruan yang bisa dipantau panggilannya, dan dengan jest.mock() kalian mengganti seluruh modul dengan versi tiruan. Ketiga bagian ini bekerja sama: runner mengisolasi file, assertion menilai hasil, dan mocking membuat lingkungan terkendali.

JSTiga bagian bekerja dalam satu test
test("assertion memeriksa hasil mocking", () => {
  const hitung = jest.fn(() => 42);
  const hasil = hitung();
  expect(hitung).toHaveBeenCalledTimes(1);
  expect(hasil).toBe(42);
});

jest.fn(() => 42) membuat mock function yang mengembalikan 42, lalu expect(hitung).toHaveBeenCalledTimes(1) memeriksa bahwa fungsi itu benar-benar dipanggil satu kali, dan expect(hasil).toBe(42) memastikan nilai kembaliannya sesuai.

Siklus Hidup Test

Setup, Eksekusi, dan Teardown

Setiap file test melewati tiga fase:

  • Setup: persiapan sebelum test berjalan, lewat beforeAll dan beforeEach.
  • Eksekusi: menjalankan isi test atau it.
  • Teardown: pembersihan setelah test, lewat afterAll dan afterEach.

Fungsi setup dan teardown berperan besar di episode 4. Untuk sekarang, ingat urutannya: beforeAll dan afterAll berjalan sekali per file, sedangkan beforeEach dan afterEach berjalan sebelum dan sesudah setiap test individual. Urutan ini menentukan bagaimana kalian menyusun inisialisasi yang berat dan pembersihan yang menyeluruh.

Lingkungan Isolasi per File

Karena tiap file berjalan di lingkungan sendiri, Jest dapat mengatur waktu hidup test — default timeout 5 detik per test. Jika sebuah test lebih lama dari itu, Jest menandainya gagal karena timeout, bukan karena assertion. Ini sering menjadi penyebab utama "test tiba-tiba gagal" di suite besar.

Timeout default bisa diubah per test dengan argumen ketiga, atau global lewat konfigurasi testTimeout. Kebiasaan yang baik: naikkan timeout secara eksplisit hanya pada test yang memang berat, bukan menaikkan default untuk semua test.

Aturan Penemuan File Test

Konvensi Penamaan dan Direktori

Jest menemukan file test secara otomatis dengan tiga pola default:

  • File di dalam direktori __tests__ yang diberi nama apa pun.
  • File dengan nama berakhiran .test.js, .spec.js, atau varian .test.tsx, .spec.ts.
  • File yang diberi akhiran .test atau .spec pada namanya.

Aturan ini bisa diubah lewat opsi testMatch dan testPathIgnorePatterns di konfigurasi. Konvensi default sudah cukup untuk sebagian besar project, dan menerapkan pola yang sama di seluruh codebase membuat penemuan file test bisa ditebak.

Menjalankan Jest dan melihat file yang ditemukan
npx jest --listTests

Perintah npx jest --listTests menampilkan daftar file yang akan dijalankan — cara cepat memastikan konvensi penamaan kalian sudah benar sebelum suite berjalan. Jika sebuah file test tidak muncul di daftar ini, berarti namanya tidak sesuai pola default.

Konfigurasi Dasar dan jest.config.js

Dua Cara Menyimpan Konfigurasi

Konfigurasi Jest bisa ditulis di file jest.config.js, di blok jest pada package.json, atau memakai varian TypeScript seperti jest.config.ts. Memakai file terpisah lebih mudah dibaca dan bisa dibagikan, sedangkan blok jest di package.json cocok untuk project kecil.

JSjest.config.js dasar
module.exports = {
  testEnvironment: "node",
  clearMocks: true,
  collectCoverage: false,
  coverageDirectory: "coverage",
  testMatch: ["**/__tests__/**/*.[jt]s?(x)", "**/?(*.)+(spec|test).[jt]s?(x)"],
};

Opsi testEnvironment: "node" menentukan lingkungan default — Node.js untuk kebanyakan project backend, dan jsdom untuk project yang membutuhkan DOM seperti React. clearMocks memastikan mock di-reset antar test sehingga state tidak bocor.

Opsi yang Sering Dipakai

Selain testEnvironment, ada beberapa opsi yang akan sering kalian jumpai di episode-episode berikutnya:

  • moduleNameMapper: memetakan alias path atau module CSS.
  • setupFilesAfterEnv: file yang dijalankan setelah framework test terpasang.
  • testTimeout: mengubah default timeout per test.
  • maxWorkers: mengatur jumlah worker paralel.

Jangan khawatir menghafal semuanya sekarang. Yang penting kalian paham bahwa konfigurasi Jest hanyalah objek JavaScript — mudah dibaca, mudah diuji, dan mudah dikendalikan dari command line.

Penutup

Episode 2 membuka kotak hitam Jest: test runner yang mengisolasi tiap file di worker sendiri, assertion library yang menghasilkan error mudah dibaca, mocking engine yang membuat lingkungan terkendali, siklus hidup setup-eksekusi-teardown, aturan penemuan file test, dan struktur konfigurasi dasar.

Inti yang harus dibawa pulang:

  • Jest terdiri dari tiga bagian: test runner, assertion library, dan mocking engine.
  • Setiap file test berjalan di lingkungan terisolasi dengan timeout default 5 detik.
  • beforeAll dan afterAll berjalan sekali; beforeEach dan afterEach berjalan per test.
  • Jest menemukan file secara otomatis lewat __tests__, .test, dan .spec.
  • Konfigurasi bisa ditaruh di jest.config.js atau blok jest di package.json.
  • testEnvironment memilih antara node dan jsdom.

Di episode 3 selanjutnya kita akan menginstall dan mengonfigurasi Jest secara penuh di project Node.js dan TypeScript — menambahkan Jest, menulis script test, menata struktur folder, serta membaca output CLI dengan benar. Pastikan konfigurasi episode 2 sudah kalian pahami sebelum lanjut.