Skip to content

bun test unterstützt verschiedene Ausgabeformate durch Reporter. Dieses Dokument behandelt sowohl integrierte Reporter als auch die Implementierung eigener benutzerdefinierter Reporter.


Integrierte Reporter

Standard-Konsolen-Reporter

Standardmäßig gibt bun test Ergebnisse in einem menschenlesbaren Format in der Konsole aus:

sh
test/package-json-lint.test.ts:
 test/package.json [0.88ms]
 test/js/third_party/grpc-js/package.json [0.18ms]
 test/js/third_party/svelte/package.json [0.21ms]
 test/js/third_party/express/package.json [1.05ms]

 4 bestanden
 0 fehlgeschlagen
 4 expect()-Aufrufe
4 Tests in 1.44ms ausgeführt

Wenn ein Terminal keine Farben unterstützt, vermeidet die Ausgabe nicht-ASCII-Zeichen:

sh
test/package-json-lint.test.ts:
(pass) test/package.json [0.48ms]
(pass) test/js/third_party/grpc-js/package.json [0.10ms]
(pass) test/js/third_party/svelte/package.json [0.04ms]
(pass) test/js/third_party/express/package.json [0.04ms]

 4 bestanden
 0 fehlgeschlagen
 4 expect()-Aufrufe
4 Tests über 1 Dateien ausgeführt. [0.66ms]

Punkte-Reporter

Der Punkte-Reporter zeigt . für bestandene Tests und F für Fehler an – nützlich für große Testsuiten.

sh
bun test --dots
bun test --reporter=dots

JUnit-XML-Reporter

Für CI/CD-Umgebungen unterstützt Bun die Generierung von JUnit-XML-Berichten. JUnit-XML ist ein weit verbreitetes Format für Testergebnisse, das von vielen CI/CD-Systemen einschließlich GitLab, Jenkins und anderen geparst werden kann.

Verwendung des JUnit-Reporters

Um einen JUnit-XML-Bericht zu generieren, verwenden Sie das --reporter=junit-Flag zusammen mit --reporter-outfile, um die Ausgabedatei anzugeben:

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

Dies gibt weiterhin wie üblich in der Konsole aus und schreibt gleichzeitig den JUnit-XML-Bericht am Ende des Testlaufs in den angegebenen Pfad.

Konfiguration über bunfig.toml

Sie können den JUnit-Reporter auch in Ihrer bunfig.toml-Datei konfigurieren:

bunfig.toml
toml
[test.reporter]
junit = "path/to/junit.xml"  # Ausgabepfad für JUnit-XML-Bericht

Umgebungsvariablen in JUnit-Berichten

Der JUnit-Reporter fügt automatisch Umgebungsinformationen als <properties> in die XML-Ausgabe ein. Dies kann hilfreich sein, um Testläufe in CI-Umgebungen zu verfolgen.

Insbesondere werden die folgenden Umgebungsvariablen einbezogen, wenn verfügbar:

UmgebungsvariableEigenschaftsnameBeschreibung
GITHUB_RUN_ID, GITHUB_SERVER_URL, GITHUB_REPOSITORY, CI_JOB_URLciCI-Build-Informationen
GITHUB_SHA, CI_COMMIT_SHA, GIT_SHAcommitGit-Commit-Identifikatoren
System-HostnamehostnameMaschinen-Hostname

Dies erleichtert die Nachverfolgung, für welche Umgebung und welchen Commit ein bestimmter Testlauf war.

Aktuelle Einschränkungen

Der JUnit-Reporter hat derzeit einige Einschränkungen, die in zukünftigen Updates behoben werden:

  • stdout- und stderr-Ausgaben einzelner Tests sind nicht im Bericht enthalten
  • Präzise Zeitstempelfelder pro Testfall sind nicht enthalten

GitHub Actions-Reporter

Bun test erkennt automatisch, wenn es innerhalb von GitHub Actions ausgeführt wird, und gibt GitHub Actions-Annotationen direkt in die Konsole aus. Es ist keine spezielle Konfiguration erforderlich, außer Bun zu installieren und bun test auszuführen.

Für ein Beispiel für eine GitHub Actions-Workflow-Konfiguration siehe den Abschnitt CI/CD-Integration der CLI-Dokumentation.


Benutzerdefinierte Reporter

Bun ermöglicht es Entwicklern, benutzerdefinierte Test-Reporter zu implementieren, indem sie das WebKit Inspector Protocol mit zusätzlichen testspezifischen Domains erweitern.

Inspector Protocol für Tests

Zur Unterstützung der Testberichterstattung erweitert Bun das standardmäßige WebKit Inspector Protocol mit zwei benutzerdefinierten Domains:

  1. TestReporter: Meldet Test-Erkennung, Ausführungsstart und Abschluss-Events
  2. LifecycleReporter: Meldet Fehler und Ausnahmen während der Testausführung

Diese Erweiterungen ermöglichen es Ihnen, benutzerdefinierte Berichterstattungstools zu erstellen, die detaillierte Informationen über die Testausführung in Echtzeit empfangen können.

Wichtige Events

Benutzerdefinierte Reporter können auf diese wichtigen Events lauschen:

  • TestReporter.found: Wird ausgelöst, wenn ein Test entdeckt wird
  • TestReporter.start: Wird ausgelöst, wenn ein Test zu laufen beginnt
  • TestReporter.end: Wird ausgelöst, wenn ein Test abgeschlossen ist
  • Console.messageAdded: Wird ausgelöst, wenn während eines Tests eine Konsolenausgabe erfolgt
  • LifecycleReporter.error: Wird ausgelöst, wenn ein Fehler oder eine Ausnahme auftritt

Reporter-Vergleich

ReporterBeschreibungBest für
Standard (console)Menschenlesbare Ausgabe mit Farben und SymbolenLokale Entwicklung
dotsZeigt . für Bestanden und F für Fehler anGroße Testsuiten
junitXML-Format für CI/CD-SystemeCI/CD-Pipelines, GitLab, Jenkins

Reporter-Auswahl

CLI-Flags

bash
# Standard-Reporter verwenden (standardmäßig)
bun test

# Punkte-Reporter verwenden
bun test --reporter=dots

# JUnit-Reporter mit Ausgabedatei
bun test --reporter=junit --reporter-outfile=./results.xml

# Mehrere Reporter kombinieren (wenn unterstützt)
bun test --reporter=console --reporter=junit --reporter-outfile=./results.xml

Konfigurationsdatei

bunfig.toml
toml
[test]
# Standard-Reporter für alle Testläufe
# (derzeit nur über CLI-Flags konfigurierbar)

[test.reporter]
# JUnit-Ausgabepfad konfigurieren
junit = "./reports/junit.xml"

Benutzerdefinierten Reporter erstellen

Um einen benutzerdefinierten Reporter zu erstellen, müssen Sie das Inspector Protocol verwenden und auf Test-Events lauschen.

Grundgerüst für benutzerdefinierten Reporter

custom-reporter.ts
ts
import { WebSocket } from "bun";

// Dies ist ein vereinfachtes Beispiel
// Ein vollständiger Reporter würde das Inspector Protocol verwenden

interface TestEvent {
  type: "found" | "start" | "end";
  testFile: string;
  testName?: string;
  duration?: number;
  error?: Error;
}

class CustomReporter {
  private results: TestEvent[] = [];

  onTestFound(event: TestEvent) {
    this.results.push(event);
    console.log(`Test gefunden: ${event.testName}`);
  }

  onTestStart(event: TestEvent) {
    console.log(`Test startet: ${event.testName}`);
  }

  onTestEnd(event: TestEvent) {
    console.log(`Test abgeschlossen: ${event.testName} (${event.duration}ms)`);
    if (event.error) {
      console.error(`Fehler: ${event.error.message}`);
    }
  }

  onFinish() {
    const passed = this.results.filter(r => !r.error).length;
    const failed = this.results.filter(r => r.error).length;
    console.log(`\nErgebnisse: ${passed} bestanden, ${failed} fehlgeschlagen`);
  }
}

HTML-Reporter-Beispiel

html-reporter.ts
ts
import { writeFile } from "bun";

interface TestResult {
  file: string;
  name: string;
  passed: boolean;
  duration: number;
  error?: string;
}

class HTMLReporter {
  private results: TestResult[] = [];

  addResult(result: TestResult) {
    this.results.push(result);
  }

  async generateReport(outputPath: string) {
    const passed = this.results.filter(r => r.passed).length;
    const failed = this.results.filter(r => !r.passed).length;

    const html = `
<!DOCTYPE html>
<html>
<head>
  <title>Test-Bericht</title>
  <style>
    .pass { color: green; }
    .fail { color: red; }
    .summary { font-weight: bold; }
  </style>
</head>
<body>
  <h1>Test-Bericht</h1>
  <p class="summary">
    ${passed} bestanden, ${failed} fehlgeschlagen, ${this.results.length} insgesamt
  </p>
  <table>
    <tr>
      <th>Datei</th>
      <th>Test</th>
      <th>Status</th>
      <th>Dauer</th>
    </tr>
    ${this.results.map(r => `
      <tr class="${r.passed ? 'pass' : 'fail'}">
        <td>${r.file}</td>
        <td>${r.name}</td>
        <td>${r.passed ? '✓' : '✗'}</td>
        <td>${r.duration}ms</td>
      </tr>
    `).join('')}
  </table>
</body>
</html>
    `;

    await writeFile(outputPath, html);
  }
}

JSON-Reporter-Beispiel

json-reporter.ts
ts
import { writeFile } from "bun";

interface TestResult {
  file: string;
  name: string;
  passed: boolean;
  duration: number;
  error?: string;
}

interface TestReport {
  timestamp: string;
  total: number;
  passed: number;
  failed: number;
  results: TestResult[];
}

class JSONReporter {
  private results: TestResult[] = [];

  addResult(result: TestResult) {
    this.results.push(result);
  }

  async generateReport(outputPath: string) {
    const passed = this.results.filter(r => r.passed).length;
    const failed = this.results.filter(r => !r.passed).length;

    const report: TestReport = {
      timestamp: new Date().toISOString(),
      total: this.results.length,
      passed,
      failed,
      results: this.results,
    };

    await writeFile(outputPath, JSON.stringify(report, null, 2));
  }
}

Reporter in CI/CD verwenden

GitHub Actions

.github/workflows/test.yml
yaml
name: Tests
on: [push, pull_request]

jobs:
  test:
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@v4
      - uses: oven-sh/setup-bun@v2
      - run: bun install
      - run: bun test --reporter=junit --reporter-outfile=./junit.xml
      - name: JUnit-Bericht hochladen
        uses: actions/upload-artifact@v3
        with:
          name: test-results
          path: ./junit.xml

GitLab CI

.gitlab-ci.yml
yaml
test:
  stage: test
  script:
    - bun install
    - bun test --reporter=junit --reporter-outfile=./report.xml
  artifacts:
    reports:
      junit: ./report.xml

Jenkins

groovy
pipeline {
  agent any
  stages {
    stage('Test') {
      steps {
        sh 'bun install'
        sh 'bun test --reporter=junit --reporter-outfile=./report.xml'
      }
      post {
        always {
          junit 'report.xml'
        }
      }
    }
  }
}

Best Practices

Lokale Entwicklung

Für die lokale Entwicklung ist der Standard-Konsolen-Reporter normalerweise am besten:

bash
# Standardausgabe für lokale Entwicklung
bun test

# Punkte-Reporter für schnellere Übersicht bei großen Testsuiten
bun test --dots

CI/CD-Pipelines

Für CI/CD-Umgebungen sollten Sie JUnit-XML für Integration mit CI-Tools verwenden:

bash
# JUnit für CI-Integration
bun test --reporter=junit --reporter-outfile=./test-results.xml

Mehrere Reporter

Wenn Sie mehrere Ausgabeformate benötigen:

bash
# Sowohl Konsolen- als auch JUnit-Ausgabe
bun test --reporter=junit --reporter-outfile=./results.xml
# Konsolenausgabe erfolgt weiterhin standardmäßig

Benutzerdefinierte Reporter

Erstellen Sie benutzerdefinierte Reporter für spezielle Anforderungen:

  • HTML-Berichte für Stakeholder
  • JSON-Berichte für benutzerdefinierte Verarbeitung
  • Integration mit proprietären Systemen

Bun von www.bunjs.com.cn bearbeitet