機能 
- Viteの設定、トランスフォーマー、リゾルバー、およびプラグイン。
- アプリと同じ設定を使用してテストを実行できます!
- Vue、React、Svelte、Lit、Markoなどに対応したコンポーネントテスト
- TypeScript/JSXサポートを標準搭載
- ESMファースト、トップレベルawait
- Tinypoolによるワーカーマルチスレッディング
- Tinybenchによるベンチマークサポート
- スイートとテストのフィルタリング、タイムアウト、並行処理
- ワークスペースサポート
- アサーション用のChaiをビルトイン、Jest expect互換API
- モッキング用のTinyspyをビルトイン
- Rust風のソース内テスト
- expect-typeによる型テスト
テスト、開発、ビルド間の共有設定 
Viteの設定、トランスフォーマー、リゾルバー、およびプラグイン。アプリと同じ設定を使用してテストを実行します。
Vitestの設定で詳細をご覧ください。
ウォッチモード 
$ vitestソースコードまたはテストファイルを修正すると、Vitestはモジュールグラフをスマートに検索し、関連するテストのみを再実行します。ViteのHMRと同様に機能します!
vitestは開発環境ではデフォルトでウォッチモードで、CI環境(process.env.CIが存在する場合)では実行モードでスマートに起動します。vitest watchまたはvitest runを使用して、明示的に必要なモードを指定できます。
一般的なWeb慣習を標準搭載 
ES Module / TypeScript / JSXサポート / PostCSSを標準搭載
スレッド 
デフォルトで、Vitestはnode:worker_threadsを介してTinypool(Piscinaの軽量フォーク)を使用して、複数のスレッドでテストファイルを同時に実行します。テストがマルチスレッディングと互換性のないコードを実行している場合、--pool=forksに切り替えて、node:child_processを介してTinypoolを使用して複数のプロセスでテストを実行できます。
シングルスレッドまたはシングルプロセスでテストを実行するには、poolOptionsを参照してください。
Vitestは各ファイルの環境も分離するため、あるファイルでの環境の変更が他のファイルに影響を与えることはありません。CLIに--no-isolateを渡すことで分離を無効にできます(正確性を犠牲にして実行パフォーマンスを向上)。
テストフィルタリング 
Vitestは、テスト実行範囲を絞り込んでテスト速度を向上させ、開発に集中できるようにするための多くの方法を提供しています。
テストフィルタリングの詳細をご覧ください。
テストの並列実行 
連続したテストに.concurrentを使用すると、それらを並列で実行できます。
import { ,  } from 'vitest'
// The two tests marked with concurrent will be run in parallel
('suite', () => {
  ('serial test', async () => { /* ... */ })
  .('concurrent test 1', async ({  }) => { /* ... */ })
  .('concurrent test 2', async ({  }) => { /* ... */ })
})スイートで.concurrentを使用すると、その中のすべてのテストが並列で実行されます。
import { ,  } from 'vitest'
// All tests within this suite will be run in parallel
.('suite', () => {
  ('concurrent test 1', async ({  }) => { /* ... */ })
  ('concurrent test 2', async ({  }) => { /* ... */ })
  .('concurrent test 3', async ({  }) => { /* ... */ })
}).skip、.only、および.todoも、並列スイートとテストで使用できます。APIリファレンスで詳細をご覧ください。
警告
並列テストを実行する際、スナップショットとアサーションには、正しいテストが検出されるように、ローカルのテストコンテキストからexpectを使用する必要があります。
スナップショット 
Jest互換のスナップショットサポート。
import { expect, it } from 'vitest'
it('renders correctly', () => {
  const result = render()
  expect(result).toMatchSnapshot()
})スナップショットで詳細をご覧ください。
ChaiとJest expectの互換性 
アサーションにはChaiをビルトイン、Jest expect互換API。
サードパーティライブラリでマッチャを追加している場合、test.globalsをtrueに設定すると、互換性が向上します。
モッキング 
viオブジェクトでjest互換のAPIを使用して、モッキングにTinyspyをビルトイン。
import { ,  } from 'vitest'
const  = .()
('hello', 1)
(.()).(true)
(..[0]).(['hello', 1])
.( => )
('world', 2)
(..[1].).('world')VitestはDOMとブラウザAPIのモッキングにhappy-domまたはjsdomの両方をサポートしています。これらはVitestには含まれていないため、インストールが必要になる場合があります。
$ npm i -D happy-dom
# or
$ npm i -D jsdomその後、設定ファイルでenvironmentオプションを変更します。
// vitest.config.ts
import {  } from 'vitest/config'
export default ({
  : {
    : 'happy-dom', // or 'jsdom', 'node'
  },
})モッキングで詳細をご覧ください。
カバレッジ 
Vitestは、v8によるネイティブコードカバレッジと、istanbulによるインストルメントコードカバレッジをサポートしています。
{
  "scripts": {
    "test": "vitest",
    "coverage": "vitest run --coverage"
  }
}カバレッジで詳細をご覧ください。
ソース内テスト 
Vitestは、Rustのモジュールテストと同様に、ソースコード内に実装と共にテストを実行する方法も提供しています。
これにより、テストは実装と同じクロージャを共有し、エクスポートせずにプライベートステートに対してテストを実行できます。同時に、開発のためのフィードバックループも近づきます。
// src/index.ts
// the implementation
export function add(...args: number[]) {
  return args.reduce((a, b) => a + b, 0)
}
// in-source test suites
if (import.meta.vitest) {
  const { it, expect } = import.meta.vitest
  it('add', () => {
    expect(add()).toBe(0)
    expect(add(1)).toBe(1)
    expect(add(1, 2, 3)).toBe(6)
  })
}ソース内テストで詳細をご覧ください。
ベンチマーク 実験的 
Vitest 0.23.0以降、Tinybenchを介してbench関数を使用してベンチマークテストを実行し、パフォーマンス結果を比較できます。
import { ,  } from 'vitest'
('sort', () => {
  ('normal', () => {
    const  = [1, 5, 4, 2, 3]
    .((, ) => {
      return  - 
    })
  })
  ('reverse', () => {
    const  = [1, 5, 4, 2, 3]
    .().((, ) => {
      return  - 
    })
  })
})型テスト 実験的 
Vitest 0.25.0以降、テストを記述して型回帰を検出できます。Vitestにはexpect-typeパッケージが含まれており、類似した分かりやすいAPIを提供します。
import { assertType, expectTypeOf } from 'vitest'
import { mount } from './mount.js'
test('my types work properly', () => {
  expectTypeOf(mount).toBeFunction()
  expectTypeOf(mount).parameter(0).toMatchTypeOf<{ name: string }>()
  // @ts-expect-error name is a string
  assertType(mount({ name: 42 }))
})