Diese Anleitung zeigt, wie Sie die concurrentTestGlob-Option verwenden, um selektiv Tests basierend auf Dateinamenmustern parallel auszuführen.
Projektstruktur
sh
my-project/
├── bunfig.toml
├── tests/
│ ├── unit/
│ │ ├── math.test.ts # Sequentiell
│ │ └── utils.test.ts # Sequentiell
│ └── integration/
│ ├── concurrent-api.test.ts # Parallel
│ └── concurrent-database.test.ts # ParallelKonfiguration
Konfigurieren Sie Ihr bunfig.toml, um Testdateien mit "concurrent-" Präfix parallel auszuführen:
toml
[test]
# Alle Testdateien mit "concurrent-" Präfix parallel ausführen
concurrentTestGlob = "**/concurrent-*.test.ts"Testdateien
Unit-Test (Sequentiell)
Sequentielle Tests sind gut für Tests, die Zustände teilen oder spezifische Reihenfolgeanforderungen haben:
ts
import { test, expect } from "bun:test";
// Diese Tests werden standardmäßig sequentiell ausgeführt
let sharedState = 0;
test("addition", () => {
sharedState = 5 + 3;
expect(sharedState).toBe(8);
});
test("verwendet vorherigen Zustand", () => {
// Dieser Test hängt vom Zustand des vorherigen Tests ab
expect(sharedState).toBe(8);
});Integrationstest (Parallel)
Tests in Dateien, die dem Glob-Muster entsprechen, werden automatisch parallel ausgeführt:
ts
import { test, expect } from "bun:test";
// Diese Tests werden automatisch parallel ausgeführt, da der Dateiname dem Glob-Muster entspricht.
// Die Verwendung von test() entspricht test.concurrent(), wenn die Datei mit concurrentTestGlob übereinstimmt.
// Jeder Test ist unabhängig und kann parallel ausgeführt werden.
test("Benutzerdaten abrufen", async () => {
const response = await fetch("/api/user/1");
expect(response.ok).toBe(true);
});
// kann auch test.concurrent() verwenden, um es explizit als parallel zu markieren
test.concurrent("Beiträge abrufen", async () => {
const response = await fetch("/api/posts");
expect(response.ok).toBe(true);
});
// kann auch test.serial() verwenden, um es explizit als sequentiell zu markieren
test.serial("Kommentare abrufen", async () => {
const response = await fetch("/api/comments");
expect(response.ok).toBe(true);
});Tests ausführen
bash
# Alle Tests ausführen - concurrent-*.test.ts Dateien werden parallel ausgeführt
bun test
# Überschreiben: ALLE Tests zwingend parallel ausführen
# Hinweis: Dies überschreibt bunfig.toml und führt alle Tests parallel aus, unabhängig vom Glob
bun test --concurrent
# Nur Unit-Tests ausführen (sequentiell)
bun test tests/unit
# Nur Integrationstests ausführen (parallel aufgrund des Glob-Musters)
bun test tests/integrationVorteile
- Schrittweise Migration: Migrieren Sie zu parallelen Tests Datei für Datei durch Umbenennen
- Klare Organisation: Dateibenennungskonvention zeigt den Ausführungsmodus an
- Leistung: Integrationstests laufen schneller parallel
- Sicherheit: Unit-Tests bleiben sequentiell, wo es nötig ist
- Flexibilität: Einfaches Ändern des Ausführungsmodus durch Umbenennen von Dateien
Migrationsstrategie
So migrieren Sie vorhandene Tests zur parallelen Ausführung:
- Beginnen Sie mit unabhängigen Integrationstests - Diese teilen normalerweise keine Zustände
- Benennen Sie Dateien um, damit sie dem Glob-Muster entsprechen:
mv api.test.ts concurrent-api.test.ts - Stellen Sie sicher, dass Tests weiterhin bestehen - Führen Sie
bun testaus, um sicherzustellen, dass keine Race Conditions auftreten - Überwachen Sie auf Probleme mit gemeinsamen Zuständen - Achten Sie auf flaky Tests oder unerwartete Fehler
- Fahren Sie mit der schrittweisen Migration stabiler Tests fort - Überstürzen Sie die Migration nicht
Tipps
- Verwenden Sie beschreibende Präfixe:
concurrent-,parallel-,async- - Behalten Sie zusammenhängende sequentielle Tests zusammen im selben Verzeichnis
- Dokumentieren Sie, warum bestimmte Tests sequentiell bleiben müssen mit Kommentaren
- Verwenden Sie
test.concurrent()für feingranulare Steuerung in sequentiellen Dateien (Hinweis: In Dateien, die vonconcurrentTestGlobübereinstimmt werden, wird plaintest()bereits parallel ausgeführt)
Mehrere Muster
Sie können mehrere Muster für verschiedene Testkategorien angeben:
toml
[test]
concurrentTestGlob = [
"**/integration/*.test.ts",
"**/e2e/*.test.ts",
"**/concurrent-*.test.ts"
]Diese Konfiguration führt Tests parallel aus, wenn sie mit einem dieser Muster übereinstimmen:
- Alle Tests in
integration/Verzeichnissen - Alle Tests in
e2e/Verzeichnissen - Alle Tests mit
concurrent-Präfix anywhere im Projekt