はじめに
Vitestが2023年12月4日にバージョン1.0.0を迎えました。
VitestはJavaScript・TypeScriptのテストフレームです。Viteと同じ設定で動き、watch
モードのHMRの様な効率的なテスト実行、Jestの記法と似たような書き心地でテストを記述できる点が特徴的です。
この記事ではVitestが1.0.0にバージョンアップして変更された記法などを紹介します。
Vitest自体について知りたい場合は公式ドキュメントや去年記述した記事があるのでよければ見てください。
Vitest1.0.0
必要な環境設定
バージョン1からはNodeのバージョンが18以降、Viteのバージョンが5以降が必要になってきます。Viteのバージョン5に上がったのも1ヶ月以内のことなので上げていなければこの機会にあげましょう。
そして、@vitest/ui
や@vitest/coverage-v8
のようなサブパッケージのバージョンも同じバージョンで揃えて利用する必要があります。
スナップショットの変更
スナップショットの結果が変更されました。
expect('hello vitest').toMatchInlineSnapshot()
上記のテストによって以下のようなスナップショットが生成されるようになりました。
// 1.0.0
expect('hello vitest').toMatchInlineSnapshot('"hello vitest"')
// 0.34.6
expect('hello vitest').toMatchInlineSnapshot(`"hello vitest"`)
私の手元では確認できませんでしたが、以下の結果も変更されたとされています。
// 1.0.0
expect({ foo: 'bar' }).toMatchInlineSnapshot(`
Object {
"foo": "bar",
}
`)
// 0.34.6
expect({ foo: 'bar' }).toMatchInlineSnapshot(`
Object {
\\"foo\\": \\"bar\\",
}
`);
記法的にpretty-format
を有効にすることで再現すると思いましたが、両バージョンとも以下のような出力で違いが見られませんでした。
/**
* snapshotFormat: {
* printBasicPrototype: true,
* } ,
*/
expect({ foo: 'bar' }).toMatchInlineSnapshot(`
Object {
"foo": "bar",
}
`);
/**
* default
*/
expect({ foo: 'bar' }).toMatchInlineSnapshot(`
{
"foo": "bar",
}
`);
この他にVitestのsnapshotに関連するパッケージ@vitest/snapshot
にていくつか変更があったようです(通常は直接触らないので影響はないはずです)。
設定の変更
--threads
が--pool=threads
になりました
tinypool
でマルチスレッドを有効にするものです。
--no-threads
が--pool=forks
になりました
child_process
でマルチスレッドを有効にするものです。
--single-thread
が--poolOptions.threads.singleThread
になりました
単一のスレッドで実行するものです。
--experimental-vm-threads
が--pool=vmThreads
になりました
VM context
でマルチスレッドを有効にするものです。
--experimental-vm-worker-memory-limit
が--poolOptions.vmThreads.memoryLimit
になりました
--pool=vmThreads
とした時のオプションです。メモリの制限を設定します。
--isolate
が--poolOptions.<pool-name>.isolate and browser.isolate
になりました
テストファイルごとに環境を分割するものです。
test.maxThreads
がtest.poolOptions.<pool-name>.maxThreads
になりました
最大のスレッド数を設定します。<poo-name>
には--pool
で指定したものを渡します。
test.minThreads
がtest.poolOptions.<pool-name>.minThreads
になりました
最小のスレッド数を設定します。<poo-name>
には--pool
で指定したものを渡します。
test.useAtomics
がtest.poolOptions.<pool-name>.useAtomics
になりました
データの整合性を保つためにAtomicsを使用してスレッドを開始します。<poo-name>
には--pool
で指定したものを渡します。
test.poolMatchGlobs.child_process
がtest.poolMatchGlobs.forks
になりました
指定したglobに基づいて行われるテストでchild_process
のマルチスレッドを有効にします。
test.poolMatchGlobs.experimentalVmThreads
がtest.poolMatchGlobs.vmThreads
になりました
指定したglobに基づいて行われるテストでVM context
のマルチスレッドを有効にします。
coverageの変更
テストしていないファイルを含めてcoverageレポートに含めるのがデフォルトになりました。元のデフォルトの挙動にするにはcoverage.all
をfalsで設定してください。
また、閾値に関する設定はまとめて記述するようになりました。
// 1.0.0
coverage: {
threshold: {
perFile: true,
thresholdAutoUpdate: true,
100: true,
lines: 100,
functions: 100,
branches: 100,
statements: 100,
}
}
// 0.34.6
coverage: {
perFile: true,
thresholdAutoUpdate: true,
100: true,
lines: 100,
functions: 100,
branches: 100,
statements: 100,
}
型の変更
Jestとの互換性のためEnhancedSpy
型が削除され、SpyInstance
が非推奨になりました。今後はMockInstance
を使用するようにしてください。
SpyInstance
はバージョン2.0.0になるタイミングで削除されるので今のうちにあらためておきましょう。
vi.useFakeTimerの挙動
vi.useFakeTimers
がprocess.nextTick
のモックを自動でしなくなりました。
今後はvi.useFakeTimers({toFake: ['nextTick'] })
を用いることでモックを行うように設定できますが、--pool=forks
を利用している場合は行えないことに注意してください。