DEV Community

Alex Spinov
Alex Spinov

Posted on

Vitest Has a Free Test Runner — Jest but 10x Faster With Native ESM

Jest Is Showing Its Age

Jest was the gold standard for JavaScript testing. But in 2026, it struggles with ESM imports, needs Babel transforms, and runs slowly on large projects.

Vitest: Vite-Powered Testing

Vitest is a test runner powered by Vite. It reuses your Vite config, understands ESM natively, and runs tests blazingly fast.

Speed Comparison

Jest (500 tests): 12 seconds
Vitest (500 tests): 1.5 seconds
Enter fullscreen mode Exit fullscreen mode

8x faster. On watch mode, tests re-run in milliseconds because Vitest only transforms changed files.

Jest-Compatible API

import { describe, it, expect, vi } from 'vitest'

describe('Calculator', () => {
  it('adds numbers', () => {
    expect(add(2, 3)).toBe(5)
  })

  it('mocks functions', () => {
    const fn = vi.fn().mockReturnValue(42)
    expect(fn()).toBe(42)
    expect(fn).toHaveBeenCalledOnce()
  })
})
Enter fullscreen mode Exit fullscreen mode

Same API as Jest. vi.fn() instead of jest.fn(). That is the only change for most tests.

Why Developers Switch

1. Native ESM Support

// This just works. No Babel. No transforms.
import { fetchUser } from './api.ts'
import type { User } from './types.ts'
Enter fullscreen mode Exit fullscreen mode

2. In-Source Testing

// src/math.ts
export function add(a: number, b: number) {
  return a + b
}

// Tests live in the same file!
if (import.meta.vitest) {
  const { it, expect } = import.meta.vitest
  it('adds', () => expect(add(1, 2)).toBe(3))
}
Enter fullscreen mode Exit fullscreen mode

Tests next to the code. Removed in production builds.

3. Built-in Coverage

vitest --coverage
Enter fullscreen mode Exit fullscreen mode

No jest --coverage + istanbul + babel-plugin-istanbul. Just works.

4. UI Mode

vitest --ui
Enter fullscreen mode Exit fullscreen mode

Opens a browser-based test dashboard. See test results, filter, re-run — visually.

Vitest vs Jest in 2026

Feature Vitest Jest
ESM support Native Experimental
TypeScript Native Transform needed
Speed 8-10x faster Baseline
Config Reuses vite.config jest.config
Watch mode Instant Slow
UI dashboard Built-in Third-party
Coverage Built-in Plugin
Mocking vi.fn() jest.fn()

When to Stay on Jest

  • Large existing test suite (migration cost)
  • React Native (Jest has better support)
  • No Vite in your build pipeline (Vitest benefits most with Vite)

Get Started

npm install -D vitest
# Add to package.json scripts: "test": "vitest"
npm test
Enter fullscreen mode Exit fullscreen mode

Testing scrapers? 88+ production scrapers on Apify — tested, maintained, ready to use. Custom: spinov001@gmail.com

Top comments (0)