このガイドでは、concurrentTestGlob オプションを使用してファイル命名パターンに基づいて選択的にテストを並列実行する方法を示します。
プロジェクト構造
sh
my-project/
├── bunfig.toml
├── tests/
│ ├── unit/
│ │ ├── math.test.ts # 順次
│ │ └── utils.test.ts # 順次
│ └── integration/
│ ├── concurrent-api.test.ts # 並列
│ └── concurrent-database.test.ts # 並列構成
bunfig.toml を構成して、「concurrent-」プレフィックスを持つテストファイルを並列実行します。
toml
[test]
# 「concurrent-」プレフィックスを持つすべてのテストファイルを並列実行
concurrentTestGlob = "**/concurrent-*.test.ts"テストファイル
ユニットテスト(順次)
順次テストは、状態を共有するか特定の順序要件があるテストに適しています。
ts
import { test, expect } from "bun:test";
// これらのテストはデフォルトで順次実行されます
let sharedState = 0;
test("加算", () => {
sharedState = 5 + 3;
expect(sharedState).toBe(8);
});
test("前の状態を使用", () => {
// このテストは前のテストの状態に依存します
expect(sharedState).toBe(8);
});統合テスト(並列)
グロブパターンに一致するファイルのテストは自動的に並列実行されます。
ts
import { test, expect } from "bun:test";
// これらのテストはファイル名がグロブパターンに一致するため自動的に並列実行されます。
// ファイルが concurrentTestGlob に一致する場合、test() は test.concurrent() と同等です。
// 各テストは独立しており並列実行できます。
test("ユーザーデータをフェッチ", async () => {
const response = await fetch("/api/user/1");
expect(response.ok).toBe(true);
});
// 明示的に並列としてマークするために test.concurrent() も使用できます
test.concurrent("投稿をフェッチ", async () => {
const response = await fetch("/api/posts");
expect(response.ok).toBe(true);
});
// 明示的に順次としてマークするために test.serial() も使用できます
test.serial("コメントをフェッチ", async () => {
const response = await fetch("/api/comments");
expect(response.ok).toBe(true);
});テストの実行
bash
# すべてのテストを実行 - concurrent-*.test.ts ファイルは並列実行されます
bun test
# オーバーライド:すべてのテストを強制的に並列実行
# 注:これは bunfig.toml をオーバーライドし、グロブに関係なくすべてのテストを並列実行します
bun test --concurrent
# ユニットテストのみ実行(順次)
bun test tests/unit
# 統合テストのみ実行(グロブパターンにより並列)
bun test tests/integrationメリット
- 段階的な移行: ファイルごとに名前を変更して並列テストに移行
- 明確な整理: ファイル命名規則で実行モードを示す
- パフォーマンス: 統合テストは並列でより高速に実行
- 安全性: 必要な場所でユニットテストは順次のまま
- 柔軟性: ファイルの名前を変更して実行モードを簡単に変更
移行戦略
既存のテストを並列実行に移行するには:
- 独立した統合テストから開始 - これらは通常状態を共有しません
- ファイルの名前をグロブパターンに一致するように変更:
mv api.test.ts concurrent-api.test.ts - テストがまだパスすることを確認 -
bun testを実行して競合状態がないことを確認 - 共有状態の問題を監視 - 不安定なテストや予期しない失敗に注意
- 安定したテストを段階的に移行し続ける - 急ぐ必要はありません
ヒント
- 説明的なプレフィックスを使用:
concurrent-、parallel-、async- - 関連する順次テストは同じディレクトリにまとめる
- 特定のテストが順次のままである必要がある理由をコメントで文書化
- 順次ファイルできめ細かい制御のために
test.concurrent()を使用 (注:concurrentTestGlobで一致するファイルでは、通常のtest()はすでに並列実行されます)
複数のパターン
異なるテストカテゴリに対して複数のパターンを指定できます。
toml
[test]
concurrentTestGlob = [
"**/integration/*.test.ts",
"**/e2e/*.test.ts",
"**/concurrent-*.test.ts"
]この構成では、これらのパターンのいずれかに一致するとテストが並列実行されます。
integration/ディレクトリ内のすべてのテストe2e/ディレクトリ内のすべてのテスト- プロジェクト内のどこでも
concurrent-プレフィックスを持つすべてのテスト