2025/11/08に記事を修正/追記しました。
結論
Bun付属のテストランナーを用いる際、describe()の直下にはdescribe()かtest()のどちらかだけを入れるようにしたほうがよい。
(追記) 不具合っぽいものにぶち当たったらとりあえず公式のgithubとか見に行ったほうがよい。
Bunのバージョンは1.2.17。
実行順序に影響を受けるようなテストを書いておかしな結果になったので原因を調べた結果、describe()とtest()が同じdescribeブロックにあるときはdescribe()が先に処理されることを知りました。
ついでにtest()下にdescribe()があるとどうなるかも確認してみましたが、変な位置に弾き飛ばされるという結果になりました。
(追記) Bun 1.2.23で上記2点とも修正されていました。
順序通りにテストが実行されるようになりました。
また、test()ブロック内にtest()やdescribe()をネストするとエラーになります。
// Bun1.2.17で実験に使ったコード
// t0から順々にt1, t2, ...と進むと思っていたが間違いだった
// src\desc.test.ts
import { describe, expect, test } from "bun:test"
test("t1", () => expect("inu").toBe("inu"))
describe("D1", () => {
test("t2", () => expect("neko").toBe("neko"))
})
test("t3", () => {
expect("wani").toBe("wani")
describe("D2", () => {
test("t4", ()=> expect("same").toBe("same"))
})
})
describe("D3", () => {
test("t5", () => expect("tori").toBe("tori"))
describe("D4", () => {
test("t6", () => expect("tako").toBe("tako"))
test("t7", () => {
describe("D5", () => {
test("t8", () => expect("hito").toBe("hito"))
})
})
})
})
src\desc.test.ts:
✓ D1 > t2
✓ D3 > D4 > t6
✓ D3 > D4 > t7
✓ D3 > t5
✓ t1
✓ t3
✓ D5 > t8
✓ D2 > t4
参考資料
こちらを参照するに、Jestではコードに書いてある通りの順序で実行されるっぽい?
bun:testはJest互換らしいけど、細部まで完全に同じというわけではないんですね。
追記(2025/11/08)
Breaking Changes - describe ordering に細かいことが書いてあった。
関連リリースノート
もう修正されとる!
Bun 1.3.1での実験
// Bun1.3.1で実行したもの。test下のtestとdescribeを削除。
import { describe, expect, test } from "bun:test"
test("t1", () => expect("inu").toBe("inu"))
describe("D1", () => {
test("t2", () => expect("neko").toBe("neko"))
})
test("t3", () => {
expect("wani").toBe("wani")
})
describe("D3", () => {
test("t4", () => expect("tori").toBe("tori"))
describe("D4", () => {
test("t6", () => expect("tako").toBe("tako"))
})
test("t5", () => expect("tori").toBe("tori"))
})
src\desc.test.ts:
✓ t1
✓ D1 > t2
✓ t3
✓ D3 > t4
✓ D3 > D4 > t6
✓ D3 > t5