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
bun testTests werden in JavaScript oder TypeScript mit einer Jest-ähnlichen API geschrieben. Vollständige Dokumentation finden Sie unter Tests schreiben.
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.
bun test <filter> <filter> ...Um nach Testnamen zu filtern, verwenden Sie das -t/--test-name-pattern-Flag.
# Alle Tests oder Test-Suiten mit "addition" im Namen ausführen
bun test --test-name-pattern additionUm eine bestimmte Datei im Test-Runner auszuführen, stellen Sie sicher, dass der Pfad mit ./ oder / beginnt, um ihn von einem Filternamen zu unterscheiden.
bun test ./test/specific-file.test.tsDer 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:
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 testVon 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.
bun test --reporter=junit --reporter-outfile=./bun.xmlDies 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.
# Standardwert ist 5000
bun test --timeout 20Gleichzeitige 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:
bun test --concurrentWenn 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:
# Auf 4 gleichzeitige Tests begrenzen
bun test --concurrent --max-concurrency 4
# Standard: 20
bun test --concurrentDies 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:
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:
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.
bun test --rerun-each 100Zufä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.
bun test --randomizeBei Verwendung von --randomize wird der für die Randomisierung verwendete Seed in der Testzusammenfassung angezeigt:
bun test --randomize# ... 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.
# Einen vorherigen randomisierten Lauf reproduzieren
bun test --seed 123456Das --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.
# Nach 1 Fehler abbrechen
bun test --bail
# Nach 10 Fehlern abbrechen
bun test --bail=10Watch-Mode
Ähnlich wie bun run können Sie das --watch-Flag an bun test übergeben, um Änderungen zu überwachen und Tests erneut auszuführen.
bun test --watchLifecycle-Hooks
Bun unterstützt die folgenden Lifecycle-Hooks:
| Hook | Beschreibung |
|---|---|
beforeAll | Wird einmal vor allen Tests ausgeführt. |
beforeEach | Wird vor jedem Test ausgeführt. |
afterEach | Wird nach jedem Test ausgeführt. |
afterAll | Wird 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.
bun test --preload ./setup.tsVollständige Dokumentation finden Sie unter Test > Lifecycle.
Mocks
Erstellen Sie Mock-Funktionen mit der mock-Funktion.
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.
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.
// 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.
bun test --update-snapshotsVollstä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 CodeREPL_ID=1- Für ReplitAGENT=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
# Beispiel: Leise Ausgabe für Claude Code aktivieren
CLAUDECODE=1 bun test
# Zeigt weiterhin Fehler und Zusammenfassung, aber verbirgt ausführliche erfolgreiche TestausgabeDiese 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.