Kalau menjalankan Jest lalu muncul EMFILE: too many open files, sistem atau test watcher kamu kena limit file descriptor.
Error ini umum di monorepo besar dan watch mode.
Kenapa bisa terjadi
Jest bisa membuka banyak file sekaligus saat scan test, watch perubahan, dan transform module. Kalau limit OS rendah, muncul EMFILE.
Pemicu umum:
- terlalu banyak worker paralel
- watch mode di file tree yang sangat besar
- pattern include test yang terlalu luas
Fix cepat di config Jest
Mulai dari concurrency yang lebih rendah dan watching yang tidak agresif.
/** @type {import('jest').Config} */
module.exports = {
maxWorkers: '50%',
watchPathIgnorePatterns: ['/node_modules/', '/.next/', '/dist/'],
testPathIgnorePatterns: ['/node_modules/', '/.next/', '/dist/'],
};
Di banyak project, ini sudah cukup menghilangkan error-nya.
Tambah command yang ramah CI
Di CI, jalankan Jest tanpa watch mode, dan serial kalau perlu:
jest --runInBand --ci
--runInBand menjalankan test dalam satu process. Lebih lambat, tapi stabil kalau limit file ketat.
Cek limit open file
Di macOS/Linux:
ulimit -n
Kalau nilainya sangat rendah (misalnya 256), limit gampang tercapai.
Naikkan sementara di shell saat ini:
ulimit -n 4096
Lalu jalankan test lagi.
Perkecil scope watch
Kalau saat debugging cuma butuh satu suite, jalankan test yang spesifik:
jest src/__tests__/auth.test.ts
Jest tidak perlu scan semua file test, jadi pemakaian file handle turun.
Config dasar yang aman
Untuk default yang lebih aman:
maxWorkers: '50%'- jangan pakai watch mode di CI
- abaikan folder output build
- jalankan test yang ditargetkan saat debug lokal