For a new JavaScript or TypeScript project in 2026, Vitest is the default recommendation, node:test is the right pick when you want zero dependencies, and Jest is worth keeping only if you already have a large tuned suite running on it. The performance gaps are real but smaller than the marketing suggests, and the deciding factor is usually features rather than speed.
Here is the actual comparison, with the benchmark numbers that are floating around and what they leave out.
The numbers
Published benchmarks on a standardized 500 test project put the three runners roughly here:
| Runner | 500 unit tests, cold run | Install size | Config needed |
|---|---|---|---|
| node:test | ~1.2 seconds | Zero, ships with Node | None |
| Vitest | ~1.5 seconds | npm dependency | Minimal, reuses Vite config |
| Jest | ~12 seconds | npm dependency | Transform setup for ESM/TS |
So node:test comes in around 3.7 times faster than Jest and roughly 33% faster than Vitest, and Vitest lands about 8 times faster than Jest on that same cold run.
Read those numbers carefully, because a 500 test synthetic benchmark measures startup overhead more than it measures your actual suite. If your tests hit a database, spin up a browser, or do real work, the runner's startup cost becomes a rounding error. The gap matters most in watch mode during development, where you are paying startup repeatedly.
node:test: the zero dependency option
Node's built-in test runner has been stable since Node 20 and by 2026 has matured into something genuinely production-ready. It ships with mocking, coverage, and watch mode built in. There is no npm install, no config file, and no transform pipeline.
What you give up is developer experience polish. Snapshot testing is not there in the form Jest users expect. The assertion API is Node's assert rather than the expect-style chaining most people are used to. Error output is functional rather than pretty. Reporting and IDE integration are thinner.
Where I reach for it: libraries and CLI tools, especially anything I want to keep dependency-light. A package whose test suite adds zero to its own supply chain surface is worth something, particularly given how the npm ecosystem has been going lately.
Vitest: the default for most projects
Vitest is fast for a structural reason, not a clever one. It runs on Vite, which means native ESM handling and no separate transform step converting your modules before they execute. If your project already builds with Vite, the test runner reuses that same config, including path aliases and plugins.
The API is deliberately Jest-compatible, which is the other half of why it took over. Most Jest suites migrate by changing imports and the config file. Watch mode is where it feels fastest in daily use, because it only re-runs the tests affected by the module you changed.
Jest: still fine, rarely the new choice
Jest is not bad software. It remains competitive for mature CommonJS-heavy suites with extensive custom transforms that have been tuned over several years, and it has the deepest ecosystem of matchers, reporters, and integrations.
The problem is ESM. Jest was built when CommonJS was the assumption, and getting modern ESM and TypeScript working smoothly still involves transform configuration that Vitest simply does not need. That configuration is also where most of the 12 second cold start goes.
If you have a working Jest suite and no pain, migrating is not urgent. Rewriting a test suite is a lot of risk for a few seconds per run. If you are fighting your transform config, that is the signal to move.
How I would actually decide
Three questions get you to an answer faster than benchmark comparisons.
Does your project already use Vite? Then use Vitest. The config reuse alone is worth more than any performance difference, and you avoid maintaining two module resolution setups that can disagree with each other.
Are you publishing a library where dependency count matters? Then node:test. Zero devDependencies for testing is a real advantage for a package other people will audit, and the missing polish matters less when the suite is small and you wrote all of it.
Do you have a large existing Jest suite that runs and nobody complains about? Leave it. The correct amount of effort to spend migrating a working test suite is usually zero.
The thing benchmarks miss
Every one of these comparisons measures a suite of trivial synthetic tests, because that is the only way to isolate the runner. Your suite is not trivial. In most real projects I have measured, the dominant cost is test setup: seeding a database, mounting components, spinning up a server. Swapping runners does nothing for any of that.
If your tests are slow, profile where the time actually goes before switching tools. I have watched a team migrate from Jest to Vitest expecting an 8x improvement and get about 15%, because 90% of their runtime was a Docker container starting up per test file. That is a fixture design problem, not a runner problem.
Reference: Node.js test runner docs and Vitest documentation.