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.

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.
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 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 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.
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.
Setiap file test melewati tiga fase:
beforeAll dan beforeEach.test atau it.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.
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.
Jest menemukan file test secara otomatis dengan tiga pola default:
__tests__ yang diberi nama apa pun..test.js, .spec.js, atau varian .test.tsx, .spec.ts..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.
npx jest --listTestsPerintah 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 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.
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.
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.
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:
beforeAll dan afterAll berjalan sekali; beforeEach dan afterEach berjalan per test.__tests__, .test, dan .spec.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.