
Vitestとは
VitestはJavaScript/TypeScriptプロジェクト向けのテストフレームワークです。
特にフロントエンド開発で人気のあるViteをベースにしており、高速なテスト実行と簡単な設定が特徴です。
Bunとは
BunはJavaScriptランタイム(Node.jsの代替)でbun testはその内蔵されたテスト機能です。
最近SNS上でbun testが爆速だと話題になっていたので、私も試してみました。
VitestとBunをインストール
テストをするために最初にVitestとBunをインストールします。
まず、以下のコマンドでテスト用のプロジェクトディレクトリとファイルを作成します。
mkdir my-test; cd my-test; npm init -y; touch sum.js sum.test.js
Vitestを以下のコマンドでインストールします。
npm i -D vitest
Bunは以下のコマンドでインストールします。
npm install -g bun
すでにBunがインストールされている環境でも、Bunのバージョンが古い可能性があるので、bun upgradeを実行しておくと良いです。
bun upgrade
sum.jsとsum.test.jsのコードは以下のようにします。
export function sum(a, b) {
let result = 0
for (let i = 0; i < 1e9; i++) {
result = result + a + b
}
return result
}
import { expect, test } from 'vitest'
import { sum } from './sum.js'
test('result to be 3000000000', () => {
expect(sum(1, 2)).toBe(3000000000)
})
bun testのときは from 'vitest' は from 'bun:test' に書き換えてください。
import { expect, test } from 'bun:test'
import { sum } from './sum.js'
test('result to be 3000000000', () => {
expect(sum(1, 2)).toBe(3000000000)
})
VitestとBunでテストをする
VitestとBunのテスト環境が構築されましたのでテストを実行します。
処理時間は使用するパソコンの性能によって異なります。
Vitestはvitestコマンドを実行するとテストが実行されます。
結果は…
$ vitest
DEV v2.1.8 /my-test
✓ sum.test.js (1) 1010ms
✓ result to be 3000000000 1009ms
Test Files 1 passed (1)
Tests 1 passed (1)
Start at 00:00:00
Duration 1.17s (transform 17ms, setup 0ms, collect 7ms, tests 1.01s, environment 0ms, prepare 37ms)
1.17秒でした。
続いてbun testコマンドを実行してテストしてみます。
結果は…
$ bun test
bun test v1.1.42 (50eec002)
sum.test.js:
✓ result to be 3000000000 [1059.94ms]
1 pass
0 fail
1 expect() calls
Ran 1 tests across 1 files. [1071.00ms]
1.071秒でした。
以下のようにファイル数を増やしたテストもしてみました。
※ sum.jsを複製してファイル名と関数名を変えただけです。
import { expect, test } from 'vitest'
import { sum } from './sum.js'
import { sum2 } from './sum2.js'
import { sum3 } from './sum3.js'
import { sum4 } from './sum4.js'
import { sum5 } from './sum5.js'
import { sum6 } from './sum6.js'
import { sum7 } from './sum7.js'
import { sum8 } from './sum8.js'
import { sum9 } from './sum9.js'
test('result 1 to be 3000000000', () => {
expect(sum(1, 2)).toBe(3000000000)
})
test('result 2 to be 3000000000', () => {
expect(sum2(1, 2)).toBe(3000000000)
})
test('result 3 to be 3000000000', () => {
expect(sum3(1, 2)).toBe(3000000000)
})
test('result 4 to be 3000000000', () => {
expect(sum4(1, 2)).toBe(3000000000)
})
test('result 5 to be 3000000000', () => {
expect(sum5(1, 2)).toBe(3000000000)
})
test('result 6 to be 3000000000', () => {
expect(sum6(1, 2)).toBe(3000000000)
})
test('result 7 to be 3000000000', () => {
expect(sum7(1, 2)).toBe(3000000000)
})
test('result 8 to be 3000000000', () => {
expect(sum8(1, 2)).toBe(3000000000)
})
test('result 9 to be 3000000000', () => {
expect(sum9(1, 2)).toBe(3000000000)
})
Vitestの結果は…
$ vitest
DEV v2.1.8 /my-test
✓ sum.test.js (9) 9171ms
✓ result 1 to be 3000000000 1029ms
✓ result 2 to be 3000000000 1093ms
✓ result 3 to be 3000000000 1004ms
✓ result 4 to be 3000000000 1004ms
✓ result 5 to be 3000000000 1003ms
✓ result 6 to be 3000000000 1010ms
✓ result 7 to be 3000000000 1004ms
✓ result 8 to be 3000000000 1009ms
✓ result 9 to be 3000000000 1014ms
Test Files 1 passed (1)
Tests 9 passed (9)
Start at 00:00:000
Duration 9.36s (transform 21ms, setup 0ms, collect 18ms, tests 9.17s, environment 0ms, prepare 33ms)
9.36秒でした。
bun testの結果は…
$ bun test
bun test v1.1.42 (50eec002)
sum.test.js:
✓ result 1 to be 3000000000 [1120.14ms]
✓ result 2 to be 3000000000 [1034.19ms]
✓ result 3 to be 3000000000 [1030.33ms]
✓ result 4 to be 3000000000 [1031.67ms]
✓ result 5 to be 3000000000 [1033.89ms]
✓ result 6 to be 3000000000 [1030.83ms]
✓ result 7 to be 3000000000 [1038.58ms]
✓ result 8 to be 3000000000 [1042.89ms]
✓ result 9 to be 3000000000 [1055.38ms]
9 pass
0 fail
9 expect() calls
Ran 9 tests across 1 files. [9.44s]
9.44秒でした。
vitestをbun testに変えても必ず爆速になるわけではないようです。