Skip to content

import Test from "/snippets/cli/test.mdx";

Bun wird mit einem schnellen, integrierten, Jest-kompatiblen Test-Runner ausgeliefert. Tests werden mit der Bun-Laufzeit ausgeführt und unterstützen die folgenden Funktionen:

  • TypeScript und JSX
  • Lifecycle-Hooks
  • Snapshot-Testing
  • UI- und DOM-Testing
  • Watch-Mode mit --watch
  • Skript-Preloading mit --preload

NOTE

Bun strebt Kompatibilität mit Jest an, aber nicht alles ist implementiert. Um den Kompatibilitätsstand zu verfolgen, siehe [dieses Tracking-Issue](https://github.com/oven-sh/bun/issues/1825).

Tests ausführen ​

bash
bun test

Tests werden in JavaScript oder TypeScript mit einer Jest-ähnlichen API geschrieben. Vollständige Dokumentation finden Sie unter Tests schreiben.

ts
import { expect, test } from "bun:test";

test("2 + 2", () => {
  expect(2 + 2).toBe(4);
});

Der Runner durchsucht rekursiv das Arbeitsverzeichnis nach Dateien, die mit den folgenden Mustern übereinstimmen:

  • *.test.{js|jsx|ts|tsx}
  • *_test.{js|jsx|ts|tsx}
  • *.spec.{js|jsx|ts|tsx}
  • *_spec.{js|jsx|ts|tsx}

Sie können die Menge der Testdateien, die ausgeführt werden, filtern, indem Sie zusätzliche Positionsargumente an bun test übergeben. Jede Testdatei mit einem Pfad, der mit einem der Filter übereinstimmt, wird ausgeführt. Häufig sind diese Filter Datei- oder Verzeichnisnamen; Glob-Muster werden noch nicht unterstützt.

bash
bun test <filter> <filter> ...

Um nach Testnamen zu filtern, verwenden Sie das -t/--test-name-pattern-Flag.

sh
# Alle Tests oder Test-Suiten mit "addition" im Namen ausführen
bun test --test-name-pattern addition

Um eine bestimmte Datei im Test-Runner auszuführen, stellen Sie sicher, dass der Pfad mit ./ oder / beginnt, um ihn von einem Filternamen zu unterscheiden.

bash
bun test ./test/specific-file.test.ts

Der Test-Runner führt alle Tests in einem einzigen Prozess aus. Er lädt alle --preload-Skripte (siehe Lifecycle für Details) und führt dann alle Tests aus. Wenn ein Test fehlschlägt, beendet sich der Test-Runner mit einem Nicht-Null-Exit-Code.

CI/CD-Integration ​

bun test unterstützt eine Vielzahl von CI/CD-Integrationen.

GitHub Actions ​

bun test erkennt automatisch, ob es innerhalb von GitHub Actions ausgeführt wird, und gibt GitHub Actions-Annotationen direkt in die Konsole aus.

Es ist keine Konfiguration erforderlich, außer bun im Workflow zu installieren und bun test auszuführen.

So installieren Sie bun in einem GitHub Actions-Workflow ​

Um bun test in einem GitHub Actions-Workflow zu verwenden, fügen Sie den folgenden Schritt hinzu:

.github/workflows/test.yml
yaml
jobs:
  build:
    name: build-app
    runs-on: ubuntu-latest
    steps:
      - name: Checkout
        uses: actions/checkout@v4
      - name: Bun installieren
        uses: oven-sh/setup-bun@v2
      - name: Abhängigkeiten installieren # (angenommen Ihr Projekt hat Abhängigkeiten)
        run: bun install # Sie können stattdessen npm/yarn/pnpm verwenden, wenn Sie es vorziehen
      - name: Tests ausführen
        run: bun test

Von dort aus erhalten Sie GitHub Actions-Annotationen.

JUnit-XML-Berichte (GitLab usw.) ​

Um bun test mit einem JUnit-XML-Reporter zu verwenden, können Sie --reporter=junit in Kombination mit --reporter-outfile verwenden.

sh
bun test --reporter=junit --reporter-outfile=./bun.xml

Dies gibt weiterhin wie üblich in stdout/stderr aus und schreibt auch einen JUnit-XML-Bericht am Ende des Testlaufs in den angegebenen Pfad.

JUnit-XML ist ein beliebtes Format für die Berichterstattung von Testergebnissen in CI/CD-Pipelines.

Timeouts ​

Verwenden Sie das --timeout-Flag, um ein pro-Test-Timeout in Millisekunden anzugeben. Wenn ein Test das Timeout überschreitet, wird er als fehlgeschlagen markiert. Der Standardwert ist 5000.

bash
# Standardwert ist 5000
bun test --timeout 20

Gleichzeitige Testausführung ​

Standardmäßig führt Bun alle Tests sequentiell innerhalb jeder Testdatei aus. Sie können die gleichzeitige Ausführung aktivieren, um asynchrone Tests parallel auszuführen und Testsuiten mit unabhängigen Tests erheblich zu beschleunigen.

--concurrent-Flag ​

Verwenden Sie das --concurrent-Flag, um alle Tests innerhalb ihrer jeweiligen Dateien gleichzeitig auszuführen:

sh
bun test --concurrent

Wenn dieses Flag aktiviert ist, werden alle Tests parallel ausgeführt, es sei denn, sie sind explizit mit test.serial markiert.

--max-concurrency-Flag ​

Steuern Sie die maximale Anzahl gleichzeitig laufender Tests mit dem --max-concurrency-Flag:

sh
# Auf 4 gleichzeitige Tests begrenzen
bun test --concurrent --max-concurrency 4

# Standard: 20
bun test --concurrent

Dies hilft, Ressourcenerschöpfung bei der Ausführung vieler gleichzeitiger Tests zu verhindern. Der Standardwert ist 20.

test.concurrent ​

Markieren Sie einzelne Tests zur gleichzeitigen Ausführung, auch wenn das --concurrent-Flag nicht verwendet wird:

math.test.ts
ts
import { test, expect } from "bun:test";

// Diese Tests laufen parallel zueinander
test.concurrent("gleichzeitiger Test 1", async () => {
  await fetch("/api/endpoint1");
  expect(true).toBe(true);
});

test.concurrent("gleichzeitiger Test 2", async () => {
  await fetch("/api/endpoint2");
  expect(true).toBe(true);
});

// Dieser Test läuft sequentiell
test("sequentieller Test", () => {
  expect(1 + 1).toBe(2);
});

test.serial ​

Erzwingen Sie, dass Tests sequentiell ausgeführt werden, auch wenn das --concurrent-Flag aktiviert ist:

math.test.ts
ts
import { test, expect } from "bun:test";

let sharedState = 0;

// Diese Tests müssen in Reihenfolge ausgeführt werden
test.serial("erster serieller Test", () => {
  sharedState = 1;
  expect(sharedState).toBe(1);
});

test.serial("zweiter serieller Test", () => {
  // Hängt vom vorherigen Test ab
  expect(sharedState).toBe(1);
  sharedState = 2;
});

// Dieser Test kann gleichzeitig ausgeführt werden, wenn --concurrent aktiviert ist
test("unabhängiger Test", () => {
  expect(true).toBe(true);
});

// Test-Qualifikatoren verketten
test.failing.each([1, 2, 3])("verkettete Qualifikatoren %d", input => {
  expect(input).toBe(0); // Dieser Test wird für jede Eingabe erwartungsgemäß fehlschlagen
});

Tests wiederholen ​

Verwenden Sie das --rerun-each-Flag, um jeden Test mehrmals auszuführen. Dies ist nützlich, um flüchtige oder nicht-deterministische Testfehler zu erkennen.

sh
bun test --rerun-each 100

Zufällige Testausführungsreihenfolge ​

Verwenden Sie das --randomize-Flag, um Tests in zufälliger Reihenfolge auszuführen. Dies hilft, Tests zu erkennen, die von gemeinsamem Zustand oder Ausführungsreihenfolge abhängen.

sh
bun test --randomize

Bei Verwendung von --randomize wird der für die Randomisierung verwendete Seed in der Testzusammenfassung angezeigt:

sh
bun test --randomize
txt
# ... Testausgabe ...
 --seed=12345
 2 bestanden
 8 fehlgeschlagen
10 Tests über 2 Dateien ausgeführt. [50.00ms]

Reproduzierbare zufällige Reihenfolge mit --seed ​

Verwenden Sie das --seed-Flag, um einen Seed für die Randomisierung anzugeben. Dies ermöglicht es Ihnen, dieselbe zufällige Reihenfolge beim Debuggen von reihenfolgeabhängigen Fehlern zu reproduzieren.

sh
# Einen vorherigen randomisierten Lauf reproduzieren
bun test --seed 123456

Das --seed-Flag impliziert --randomize, sodass Sie nicht beide angeben müssen. Die Verwendung desselben Seed-Werts erzeugt immer dieselbe Testausführungsreihenfolge, was das Debuggen von intermittierenden Fehlern, die durch Test-Interdependenzen verursacht werden, erleichtert.

Abbruch mit --bail ​

Verwenden Sie das --bail-Flag, um den Testlauf frühzeitig nach einer vorher bestimmten Anzahl von Testfehlern abzubrechen. Standardmäßig führt Bun alle Tests aus und meldet alle Fehler, aber manchmal ist es in CI-Umgebungen vorzuziehen, früher zu beenden, um die CPU-Nutzung zu reduzieren.

sh
# Nach 1 Fehler abbrechen
bun test --bail

# Nach 10 Fehlern abbrechen
bun test --bail=10

Watch-Mode ​

Ähnlich wie bun run können Sie das --watch-Flag an bun test übergeben, um Änderungen zu überwachen und Tests erneut auszuführen.

bash
bun test --watch

Lifecycle-Hooks ​

Bun unterstützt die folgenden Lifecycle-Hooks:

HookBeschreibung
beforeAllWird einmal vor allen Tests ausgeführt.
beforeEachWird vor jedem Test ausgeführt.
afterEachWird nach jedem Test ausgeführt.
afterAllWird einmal nach allen Tests ausgeführt.

Diese Hooks können in Testdateien oder in einer separaten Datei definiert werden, die mit dem --preload-Flag vorgeladen wird.

sh
bun test --preload ./setup.ts

Vollständige Dokumentation finden Sie unter Test > Lifecycle.

Mocks ​

Erstellen Sie Mock-Funktionen mit der mock-Funktion.

math.test.ts
ts
import { test, expect, mock } from "bun:test";
const random = mock(() => Math.random());

test("random", () => {
  const val = random();
  expect(val).toBeGreaterThan(0);
  expect(random).toHaveBeenCalled();
  expect(random).toHaveBeenCalledTimes(1);
});

Alternativ können Sie jest.fn() verwenden, es verhält sich identisch.

math.test.ts
ts
import { test, expect, mock } from "bun:test"; 
import { test, expect, jest } from "bun:test"; 

const random = mock(() => Math.random()); 
const random = jest.fn(() => Math.random()); 

Vollständige Dokumentation finden Sie unter Test > Mocks.

Snapshot-Testing ​

Snapshots werden von bun test unterstützt.

math.test.ts
ts
// Beispiel für toMatchSnapshot
import { test, expect } from "bun:test";

test("Snapshot", () => {
  expect({ a: 1 }).toMatchSnapshot();
});

Um Snapshots zu aktualisieren, verwenden Sie das --update-snapshots-Flag.

sh
bun test --update-snapshots

Vollständige Dokumentation finden Sie unter Test > Snapshots.

UI- und DOM-Testing ​

Bun ist kompatibel mit beliebten UI-Testing-Bibliotheken:

Vollständige Dokumentation finden Sie unter Test > DOM-Testing.

Performance ​

Buns Test-Runner ist schnell.

KI-Agent-Integration ​

Bei Verwendung von Buns Test-Runner mit KI-Codierassistenten können Sie eine leisere Ausgabe aktivieren, um die Lesbarkeit zu verbessern und Kontextrauschen zu reduzieren. Diese Funktion minimiert die Testausgabe-Verbosität unter Beibehaltung wesentlicher Fehlerinformationen.

Umgebungsvariablen ​

Setzen Sie eine der folgenden Umgebungsvariablen, um eine leise Ausgabe zu aktivieren:

  • CLAUDECODE=1 - Für Claude Code
  • REPL_ID=1 - Für Replit
  • AGENT=1 - Generisches KI-Agent-Flag

Verhalten ​

Wenn eine KI-Agent-Umgebung erkannt wird:

  • Nur Testfehler werden im Detail angezeigt
  • Bestehene, übersprungene und Todo-Testindikatoren werden ausgeblendet
  • Zusammenfassungsstatistiken bleiben erhalten
bash
# Beispiel: Leise Ausgabe für Claude Code aktivieren
CLAUDECODE=1 bun test

# Zeigt weiterhin Fehler und Zusammenfassung, aber verbirgt ausführliche erfolgreiche Testausgabe

Diese Funktion ist besonders nützlich in KI-unterstützten Entwicklungs-Workflows, wo reduzierte Ausgabe-Verbosität die Kontexteffizienz verbessert und gleichzeitig die Sichtbarkeit auf Testfehler erhält.

Bun von www.bunjs.com.cn bearbeitet