機能
- 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 }))
})