Episode ini membahas optimasi performa suite Jest: mempercepat eksekusi dengan watch mode dan caching, mengatur worker dengan --runInBand dan --maxWorkers, mengurangi setup overhead, serta mengoptimalkan test suite yang besar.

Suite yang lambat adalah biaya tersembunyi: setiap menit yang ditunggu developer berarti menit yang hilang untuk produktivitas. Episode 15 membahas performance optimization untuk Jest — mempercepat eksekusi dengan watch mode dan caching, mengatur worker dengan --runInBand dan --maxWorkers, mengurangi setup overhead, serta mengoptimalkan test suite yang sudah besar.
Tujuannya bukan mengejar kecepatan semata, melainkan membuat feedback loop secepat mungkin: semakin cepat suite, semakin sering kalian menjalankannya, dan semakin baik kualitas yang dihasilkan.
Mode watch menjalankan ulang hanya test yang terdampak oleh perubahan file. Ini jauh lebih cepat daripada menjalankan seluruh suite setiap kali:
npx jest --watchPerintah npx jest --watch memantau perubahan file dan mengeksekusi ulang test terkait. Jest menghitung dependensi antar file, sehingga mengubah src/math.js otomatis menjalankan math.test.js tanpa menyentuh file lain.
Jest menyimpan hasil transformasi file agar tidak mengubah ulang file yang tidak berubah:
Jest cache: 98% transformed modules reusedCaching berjalan otomatis. Jika transformasi berubah — misalnya preset baru — Jest mendeteksinya dan membangun cache ulang. --no-cache ada untuk men-debug kasus aneh, tetapi jangan dipakai rutin karena menghapus manfaat kecepatan.
Dua flag ini mengendalikan cara Jest menggunakan resource:
--runInBand: menjalankan test serial dalam satu proses. Cocok untuk mesin dengan sedikit core, atau untuk men-debug urutan dan flakiness.--maxWorkers=n: membatasi jumlah worker paralel, berguna di CI dengan resource terbatas.npx jest --maxWorkers=2npx jest --maxWorkers=2 membatasi eksekusi ke dua proses paralel. Di mesin dengan RAM terbatas, menurunkan worker mencegah out-of-memory — trade-off antara kecepatan dan stabilitas.
Untuk monorepo dengan multi-project config, Jest bisa berjalan dalam project mode yang menjalankan semua project dalam satu invokasi — menghindari overhead memulai ulang runner untuk setiap project. Detail lengkapnya ada di episode 17.
Tidak ada angka magic untuk --maxWorkers. Aturannya sederhana: jangan lebih dari jumlah core CPU, dan turunkan jika RAM mulai penuh. Di development lokal, biarkan Jest memakai default; di CI, baca limit resource dari konfigurasi runner dan set worker sedikit di bawahnya agar ada ruang untuk proses lain.
Work yang berat di beforeEach dijalankan ulang untuk setiap test — jika ada 100 test, kerja berat itu terjadi 100 kali. Pindahkan setup yang benar-benar sekali saja ke beforeAll:
beforeAll(async () => {
database = await inisialisasiDatabase();
});
beforeEach(() => {
database.resetData();
});inisialisasiDatabase() yang mahal dijalankan sekali di beforeAll, sedangkan resetData() yang ringan berjalan setiap test. Pemisahan ini mengurangi total waktu suite secara signifikan.
Jest mengubah setiap file yang di-import. Semakin besar node_modules yang ikut ditransform, semakin lambat. Gunakan transformIgnorePatterns untuk mengecualikan paket yang sudah berupa CommonJS murni, dan pastikan hanya file yang perlu diubah yang masuk ke collectCoverageFrom.
Jest bisa memberi tahu test mana yang paling lambat:
npx jest --detectOpenHandlesFlag --detectOpenHandles membantu menemukan sumber daya yang tidak ditutup — koneksi database atau server yang bocor menyebabkan suite semakin lambat antar test. Kombinasikan dengan laporan verbose untuk melihat distribusi waktu per file.
Jika beberapa file test jauh lebih lambat dari lainnya, worker yang selesai lebih awal menganggur. Perimbangkan dengan memecah file test raksasa menjadi file yang lebih kecil, atau memindahkan setup berat ke beforeAll yang sudah disinggung sebelumnya. Distribusi yang merata membuat paralelisme bekerja maksimal.
Episode 15 membahas optimasi performa suite: watch mode dan caching untuk feedback cepat, flag --runInBand, --maxWorkers, dan project mode untuk mengatur resource, pengurangan setup overhead dengan memindahkan kerja berat ke beforeAll, serta pengoptimalan suite besar.
Inti yang harus dibawa pulang:
--runInBand untuk serial; --maxWorkers untuk membatasi paralel.beforeEach ke beforeAll.--detectOpenHandles menemukan resource yang bocor.Di episode 16 selanjutnya kita akan membahas custom matchers & helpers — membuat matcher kustom dengan expect.extend, menulis helper yang reusable, menguji logika domain-spesifik, serta membagikan helper lintas project.