Jest 30.5.2 vs Vitest 5.0.3 on 40 files / 200 Node tests: wall medians Jest 2027 ms, Vitest isolate-on 2422 ms, Vitest --no-isolate 1287 ms, Jest --runInBand 3346 ms. Both 200/200 pass. Leave Jest after measuring isolate; default isolate can lose.
5 min read
On a 40-file / 200-test Node suite (no DOM), Jest 30.5.2 took a median 2,027 ms wall-clock. Vitest 5.0.3 with default isolate took 2,422 ms. Vitest with isolate off took 1,287 ms. Same machine, interleaved warm runs, both tools passed 200/200.
Short answer: leave Jest for Vitest when you want Vite-native transform and you turn isolate off (or your suite is heavy enough that Vitest's worker model wins). Do not switch for speed alone on a small file-heavy suite until you measure default isolate cost. No affiliate links in this post.
jest 30.5.2 with babel-jest + @babel/preset-env (testEnvironment node); vitest 5.0.3 (environment node, globals true). Default Jest parallel vs --runInBand; Vitest default isolate vs --no-isolate.npx jest / npx vitest run), including process start.--no-isolate flipped the result and won at 1.29 s.| Tool / mode | Wall median | Wall runs (ms) | Notes |
|---|---|---|---|
Vitest 5.0.3 --no-isolate | 1,287 ms | 1,287 / 1,375 / 1,288 / 1,258 / 1,265 | Fastest here |
| Jest 30.5.2 default parallel | 2,027 ms | 1,990 / 2,027 / 2,054 / 2,066 / 1,997 | Beat Vitest isolate |
| Vitest 5.0.3 default isolate | 2,422 ms | 2,422 / 2,360 / 2,442 / 2,370 / 2,452 | Isolate startup cost |
Jest 30.5.2 --runInBand | 3,346 ms | 3,346 / 3,680 / 3,451 / 3,320 / 3,254 | Slowest here |
On this suite Vitest with isolate off was about 1.6x faster than Jest default. Vitest with isolate on was about 1.2x slower than Jest default. The leave-Jest case is not "Vitest is always faster"; it is "Vitest plus the right isolate setting, plus Vite-native DX."
If you already run Vitest 5 and only need an upgrade checklist, use the Vitest 5 should-you-upgrade post. For DOM environment choice after a switch, see jsdom vs happy-dom.
Jest still wins on some ecosystem plugins, older tutorials, and CRA-era configs. Teams with custom transformers, deep snapshot trees, or Jest-only reporters should budget a migration week, not a flag flip. This fixture used Babel for Jest ESM and Vitest's native ESM path, so transform cost is part of the Jest number.
Also watch isolate defaults. Vitest warns that many small files pay worker startup; this run showed that warning in the numbers. Re-time your suite with isolate on and off before you claim a win in a migration RFC. The Playwright 1.63 test-locks notes cover the browser E2E side when unit tests move to Vitest but E2E stays elsewhere.
| Situation | My pick |
|---|---|
| Vite app, unit tests still on Jest, CI is slow | Move to Vitest; start with isolate off for many small files, then tune |
| Small Node suite where Jest parallel already feels fine | Measure first; default Vitest isolate may not win |
| Need jsdom APIs that happy-dom still misses | Stay on Jest+jsdom or Vitest+jsdom; see the DOM post |
| Heavy Jest-only plugins or snapshot customizations | Keep Jest until those ports exist |
| Already on Vitest 5 | Stay; use the upgrade post, not a re-migration |
Bottom line: on 200 tests, Jest took 2.03 s wall, Vitest isolate-on took 2.42 s, and Vitest isolate-off took 1.29 s. Who should not switch yet: teams blocked on Jest-only plugins or unwilling to retune isolate. Everyone else should measure both isolate modes on their own suite before rewriting the config.
How this was made: I generated the suite, ran interleaved Jest and Vitest modes on the ShopperCove test box, and kept the timing JSON; the write-up was drafted with AI help and checked against that output.
Lab evidence
Hands-on on ShopperCove box 5 Oct 2026 ~22:55-23:15 IST (8 vCPU Intel Xeon / 15 GB shared Linux, Node 20.19.2). Suite: 40 util modules + 40 test files, 200 tests, Node environment, no DOM. Versions: jest 30.5.2 + babel-jest 30.5.2 + @babel/preset-env 7.28.3; vitest 5.0.3 (globals true, environment node). Wall medians (5 interleaved after warmup, full CLI): jest default 2027.402 ms (1989.653/2027.402/2054.336/2066.099/1997.268); vitest isolate-on 2421.559 ms (2421.559/2360.062/2442.255/2369.657/2452.236); vitest --no-isolate 1287.044 ms (1287.044/1375.151/1288.301/1257.926/1265.297); jest --runInBand 3346.295 ms. Separate reported: Jest Time ~1.57 s; Vitest Duration ~1.65 s isolate-on. Both 200/200 pass every run. Raw: /workspace/bench-jestvitest/res-jestvitest.json. Not tested: jsdom/happy-dom, snapshots, Jest native ESM without Babel, watch, coverage, Windows/macOS, real monorepo migrate. No affiliate.
Vitest 5 upgrade decision with ShopperCove timing: 20-file forks suite median ~512 ms on 5.0.3 vs ~547 ms on 4.1.10 (Node 22.20.0). Engines require Node 22.12+ and Vite 6.4+. clearMocks defaults true. No affiliate.
Summary5 Oct 20264 min read
bun test 1.4.2 vs Vitest 5.0.3 on 300 TypeScript tests in 60 files: warm wall medians 136 ms vs 1,673 ms (~12x); Vitest --no-isolate 765 ms (~5.6x). A 5-file vitest-API check (vi.fn, vi.mock, fake timers, spyOn, it.each, snapshot) passed 7/7 under Bun.
Hands-on6 Oct 20265 min read
Summary3 Oct 20268 min read