コンテンツへスキップ

機能

最初のテストの書き方をビデオで学ぶ

テスト、開発、ビルド間の共有設定

Viteの設定、トランスフォーマー、リゾルバー、およびプラグイン。アプリと同じ設定を使用してテストを実行します。

Vitestの設定で詳細をご覧ください。

ウォッチモード

bash
$ vitest

ソースコードまたはテストファイルを修正すると、Vitestはモジュールグラフをスマートに検索し、関連するテストのみを再実行します。ViteのHMRと同様に機能します!

vitestは開発環境ではデフォルトでウォッチモードで、CI環境(process.env.CIが存在する場合)では実行モードでスマートに起動します。vitest watchまたはvitest runを使用して、明示的に必要なモードを指定できます。

一般的なWeb慣習を標準搭載

ES Module / TypeScript / JSXサポート / PostCSSを標準搭載

スレッド

デフォルトで、Vitestはnode:worker_threadsを介してTinypoolPiscinaの軽量フォーク)を使用して、複数のスレッドでテストファイルを同時に実行します。テストがマルチスレッディングと互換性のないコードを実行している場合、--pool=forksに切り替えて、node:child_processを介してTinypoolを使用して複数のプロセスでテストを実行できます。

シングルスレッドまたはシングルプロセスでテストを実行するには、poolOptionsを参照してください。

Vitestは各ファイルの環境も分離するため、あるファイルでの環境の変更が他のファイルに影響を与えることはありません。CLIに--no-isolateを渡すことで分離を無効にできます(正確性を犠牲にして実行パフォーマンスを向上)。

テストフィルタリング

Vitestは、テスト実行範囲を絞り込んでテスト速度を向上させ、開発に集中できるようにするための多くの方法を提供しています。

テストフィルタリングの詳細をご覧ください。

テストの並列実行

連続したテストに.concurrentを使用すると、それらを並列で実行できます。

ts
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を使用すると、その中のすべてのテストが並列で実行されます。

ts
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互換のスナップショットサポート。

ts
import { expect, it } from 'vitest'

it('renders correctly', () => {
  const result = render()
  expect(result).toMatchSnapshot()
})

スナップショットで詳細をご覧ください。

ChaiとJest expectの互換性

アサーションにはChaiをビルトイン、Jest expect互換API。

サードパーティライブラリでマッチャを追加している場合、test.globalstrueに設定すると、互換性が向上します。

モッキング

viオブジェクトでjest互換のAPIを使用して、モッキングにTinyspyをビルトイン。

ts
import { ,  } from 'vitest'

const  = .()

('hello', 1)

(.()).(true)
(..[0]).(['hello', 1])

.( => )

('world', 2)

(..[1].).('world')

VitestはDOMとブラウザAPIのモッキングにhappy-domまたはjsdomの両方をサポートしています。これらはVitestには含まれていないため、インストールが必要になる場合があります。

bash
$ npm i -D happy-dom
# or
$ npm i -D jsdom

その後、設定ファイルでenvironmentオプションを変更します。

ts
// vitest.config.ts
import {  } from 'vitest/config'

export default ({
  : {
    : 'happy-dom', // or 'jsdom', 'node'
  },
})

モッキングで詳細をご覧ください。

カバレッジ

Vitestは、v8によるネイティブコードカバレッジと、istanbulによるインストルメントコードカバレッジをサポートしています。

json
{
  "scripts": {
    "test": "vitest",
    "coverage": "vitest run --coverage"
  }
}

カバレッジで詳細をご覧ください。

ソース内テスト

Vitestは、Rustのモジュールテストと同様に、ソースコード内に実装と共にテストを実行する方法も提供しています。

これにより、テストは実装と同じクロージャを共有し、エクスポートせずにプライベートステートに対してテストを実行できます。同時に、開発のためのフィードバックループも近づきます。

ts
// 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関数を使用してベンチマークテストを実行し、パフォーマンス結果を比較できます。

ts
import { ,  } from 'vitest'

('sort', () => {
  ('normal', () => {
    const  = [1, 5, 4, 2, 3]
    .((, ) => {
      return  - 
    })
  })

  ('reverse', () => {
    const  = [1, 5, 4, 2, 3]
    .().((, ) => {
      return  - 
    })
  })
})
Benchmark reportBenchmark report

型テスト 実験的

Vitest 0.25.0以降、テストを記述して型回帰を検出できます。Vitestにはexpect-typeパッケージが含まれており、類似した分かりやすいAPIを提供します。

ts
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 }))
})

MITライセンスの下でリリースされています。