bun testがvitestより爆速らしいのでテストしたが期待外れだった

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のコードは以下のようにします。

sum.js
export function sum(a, b) {
  let result = 0
  for (let i = 0; i < 1e9; i++) {
    result = result + a + b
  }
  return result
}
sum.test.js
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' に書き換えてください。

sum.test.js
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を複製してファイル名と関数名を変えただけです。

sum.test.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に変えても必ず爆速になるわけではないようです。