Skip to content

Diese Anleitung zeigt, wie Sie die concurrentTestGlob-Option verwenden, um selektiv Tests basierend auf Dateinamenmustern parallel auszuführen.

Projektstruktur

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 # Parallel

Konfiguration

Konfigurieren Sie Ihr bunfig.toml, um Testdateien mit "concurrent-" Präfix parallel auszuführen:

bunfig.toml
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:

tests/unit/math.test.ts
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:

tests/integration/concurrent-api.test.ts
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/integration

Vorteile

  1. Schrittweise Migration: Migrieren Sie zu parallelen Tests Datei für Datei durch Umbenennen
  2. Klare Organisation: Dateibenennungskonvention zeigt den Ausführungsmodus an
  3. Leistung: Integrationstests laufen schneller parallel
  4. Sicherheit: Unit-Tests bleiben sequentiell, wo es nötig ist
  5. Flexibilität: Einfaches Ändern des Ausführungsmodus durch Umbenennen von Dateien

Migrationsstrategie

So migrieren Sie vorhandene Tests zur parallelen Ausführung:

  1. Beginnen Sie mit unabhängigen Integrationstests - Diese teilen normalerweise keine Zustände
  2. Benennen Sie Dateien um, damit sie dem Glob-Muster entsprechen: mv api.test.ts concurrent-api.test.ts
  3. Stellen Sie sicher, dass Tests weiterhin bestehen - Führen Sie bun test aus, um sicherzustellen, dass keine Race Conditions auftreten
  4. Überwachen Sie auf Probleme mit gemeinsamen Zuständen - Achten Sie auf flaky Tests oder unerwartete Fehler
  5. 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 von concurrentTestGlob übereinstimmt werden, wird plain test() bereits parallel ausgeführt)

Mehrere Muster

Sie können mehrere Muster für verschiedene Testkategorien angeben:

bunfig.toml
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

Bun von www.bunjs.com.cn bearbeitet