0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

(Bun1.2.23で修正済み)bun:testでdescribeとtestを同ブロック内に混在させると順序が狂う

0
Last updated at Posted at 2025-11-06

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
0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?