動かざることバグの如し

近づきたいよ 君の理想に

Node.jsでプログラムからVitestを実行したい

やりたいこと

通常vitestのテストはコマンドラインから実行するが、通常のTypeScriptコードから Vitestのテストコードをロードして実行したい。で、テスト結果を取得したい。

コード

vitestの内部APIを使うとできる。

import { readFile } from 'node:fs/promises';
import { startVitest } from 'vitest/node';

export async function runVitest(testPath: string): Promise<string> {
  const jsonPath = 'test-results.json';
  const vitest = await startVitest('test', [testPath], {
    watch: false,
    run: true, // 単一実行モードを有効化
    reporters: ['json'], // JSONレポーターを使用
    outputFile: jsonPath
  });
  if (!vitest) {
    throw new Error('vitestの初期化に失敗しました');
  }
  await vitest.close();
  const json = await readFile(jsonPath, 'utf-8');
  // console.log(json);
  return json;
}

runVitest('src/script/hoge.test.ts');

解説

  • startVitest()を使うことで、Vitestのテストランナーをプログラムから起動できる。
    • 第一引数にはテスト対象のファイルを指定。testを渡すとtestディレクトリ以下の.test.tsファイルを探索する。
    • 第二引数にはテスト対象のファイルを配列で指定。{ watch: false, run: true }で単一実行モード。reporters: ['json'], outputFile: jsonPathJSON形式の結果を指定ファイルに出力。
  • vitest.close()でテストランナーを終了。非同期で実行されるテストが完了するまで待つのを保証する。
  • readFileJSONファイルを読み込み、文字列として返す。test-results.jsonoutputFileで指定したファイル名。
  • runVitest関数を呼び出すことで、指定したテストファイルを実行し、JSON形式の結果を取得できる。

参考リンク